1+ package com .microsoft .aad .msal4j ;
2+
3+ import com .nimbusds .jwt .JWTParser ;
4+ import org .junit .jupiter .api .Test ;
5+
6+ import java .text .ParseException ;
7+ import java .util .Base64 ;
8+ import java .util .List ;
9+ import java .util .Map ;
10+
11+ import static org .junit .jupiter .api .Assertions .*;
12+
13+ //These tests were added to ensure the new usages of com.azure.json are functionally the same as the old usages of com.nimbusds packages.
14+ //Once we are confident in the new behavior these should no longer be necessary.
15+ class JsonCompatibilityTests {
16+
17+ //New style, using helper methods in JsonHelper that use com.azure.json
18+ private final Map <String , Object > newStyleParsedClaims = JsonHelper .parseJsonToMap (JsonHelper .getTokenPayloadClaims (TestHelper .ENCODED_JWT ));
19+ //Old style, using com.nimbusds methods
20+ private final Map <String , Object > oldStyleParsedClaims = JWTParser .parse (TestHelper .ENCODED_JWT ).getJWTClaimsSet ().getClaims ();
21+
22+ JsonCompatibilityTests () throws ParseException {
23+ }
24+
25+ @ Test
26+ void testBasicClaimsMatching () {
27+ // Test basic string claims
28+ assertEquals (oldStyleParsedClaims .get ("aud" ), newStyleParsedClaims .get ("aud" ));
29+ assertEquals (oldStyleParsedClaims .get ("iss" ), newStyleParsedClaims .get ("iss" ));
30+ assertEquals (oldStyleParsedClaims .get ("name" ), newStyleParsedClaims .get ("name" ));
31+ assertEquals (oldStyleParsedClaims .get ("oid" ), newStyleParsedClaims .get ("oid" ));
32+ assertEquals (oldStyleParsedClaims .get ("preferred_username" ), newStyleParsedClaims .get ("preferred_username" ));
33+ assertEquals (oldStyleParsedClaims .get ("sub" ), newStyleParsedClaims .get ("sub" ));
34+ assertEquals (oldStyleParsedClaims .get ("tid" ), newStyleParsedClaims .get ("tid" ));
35+ assertEquals (oldStyleParsedClaims .get ("ver" ), newStyleParsedClaims .get ("ver" ));
36+ }
37+
38+ @ Test
39+ void testNullValues () {
40+ // Check null values are handled the same
41+ assertEquals (oldStyleParsedClaims .get ("email" ), newStyleParsedClaims .get ("email" ));
42+ }
43+
44+ @ Test
45+ void testNumericValues () {
46+ // Test numeric claims
47+ assertEquals (oldStyleParsedClaims .get ("exp" ), newStyleParsedClaims .get ("exp" ));
48+ assertEquals (oldStyleParsedClaims .get ("iat" ), newStyleParsedClaims .get ("iat" ));
49+ assertEquals (oldStyleParsedClaims .get ("nbf" ), newStyleParsedClaims .get ("nbf" ));
50+ assertEquals (oldStyleParsedClaims .get ("auth_time" ), newStyleParsedClaims .get ("auth_time" ));
51+ }
52+
53+ @ Test
54+ void testListValues () {
55+ // Test list claims
56+ List <?> oldGroups = (List <?>) oldStyleParsedClaims .get ("groups" );
57+ List <?> newGroups = (List <?>) newStyleParsedClaims .get ("groups" );
58+ assertEquals (oldGroups , newGroups );
59+
60+ List <?> oldAmr = (List <?>) oldStyleParsedClaims .get ("amr" );
61+ List <?> newAmr = (List <?>) newStyleParsedClaims .get ("amr" );
62+ assertEquals (oldAmr , newAmr );
63+
64+ List <?> oldRoles = (List <?>) oldStyleParsedClaims .get ("roles" );
65+ List <?> newRoles = (List <?>) newStyleParsedClaims .get ("roles" );
66+ assertEquals (oldRoles , newRoles );
67+ }
68+
69+ @ Test
70+ void testNestedObjects () {
71+ // Test nested objects
72+ Map <?, ?> oldExtensionData = (Map <?, ?>) oldStyleParsedClaims .get ("extension_data" );
73+ Map <?, ?> newExtensionData = (Map <?, ?>) newStyleParsedClaims .get ("extension_data" );
74+
75+ assertEquals (oldExtensionData .get ("department" ), newExtensionData .get ("department" ));
76+ assertEquals (oldExtensionData .get ("manager" ), newExtensionData .get ("manager" ));
77+ assertEquals (oldExtensionData .get ("employeeId" ), newExtensionData .get ("employeeId" ));
78+ }
79+
80+ @ Test
81+ void testCompleteTokenParsing () {
82+ assertEquals (oldStyleParsedClaims .size (), newStyleParsedClaims .size ());
83+
84+ // Check that all keys and values match
85+ for (String key : oldStyleParsedClaims .keySet ()) {
86+ assertTrue (newStyleParsedClaims .containsKey (key ), "New claims should contain key: " + key );
87+
88+ Object oldValue = oldStyleParsedClaims .get (key );
89+ Object newValue = newStyleParsedClaims .get (key );
90+
91+ if (oldValue instanceof List ) {
92+ assertListsEqual ((List <?>) oldValue , (List <?>) newValue );
93+ } else if (oldValue instanceof Map ) {
94+ assertMapsEqual ((Map <?, ?>) oldValue , (Map <?, ?>) newValue );
95+ } else {
96+ assertEquals (oldValue , newValue , "Value mismatch for key: " + key );
97+ }
98+ }
99+ }
100+
101+ @ Test
102+ void testInvalidJSONHandling () {
103+ // Test that both parsers throw exceptions for invalid JSON
104+ String invalidJson = "{ this is not valid json }" ;
105+
106+ assertThrows (Exception .class , () -> JsonHelper .parseJsonToMap (invalidJson ));
107+ assertThrows (Exception .class , () -> JWTParser .parse ("header." +
108+ Base64 .getUrlEncoder ().encodeToString (invalidJson .getBytes ()) + ".signature" ));
109+ }
110+
111+ /**
112+ * Utility method to compare lists deeply
113+ */
114+ private void assertListsEqual (List <?> list1 , List <?> list2 ) {
115+ assertEquals (list1 .size (), list2 .size ());
116+ for (int i = 0 ; i < list1 .size (); i ++) {
117+ Object item1 = list1 .get (i );
118+ Object item2 = list2 .get (i );
119+
120+ if (item1 == null ) {
121+ assertNull (item2 );
122+ } else if (item1 instanceof List ) {
123+ assertListsEqual ((List <?>) item1 , (List <?>) item2 );
124+ } else if (item1 instanceof Map ) {
125+ assertMapsEqual ((Map <?, ?>) item1 , (Map <?, ?>) item2 );
126+ } else {
127+ assertEquals (item1 , item2 );
128+ }
129+ }
130+ }
131+
132+ /**
133+ * Utility method to compare maps deeply
134+ */
135+ private void assertMapsEqual (Map <?, ?> map1 , Map <?, ?> map2 ) {
136+ assertEquals (map1 .size (), map2 .size ());
137+ for (Object key : map1 .keySet ()) {
138+ assertTrue (map2 .containsKey (key ));
139+
140+ Object value1 = map1 .get (key );
141+ Object value2 = map2 .get (key );
142+
143+ if (value1 == null ) {
144+ assertNull (value2 );
145+ } else if (value1 instanceof List ) {
146+ assertListsEqual ((List <?>) value1 , (List <?>) value2 );
147+ } else if (value1 instanceof Map ) {
148+ assertMapsEqual ((Map <?, ?>) value1 , (Map <?, ?>) value2 );
149+ } else {
150+ assertEquals (value1 , value2 );
151+ }
152+ }
153+ }
154+ }
0 commit comments