@@ -11,41 +11,191 @@ import (
1111var  signatureAlgorithms  =  []jose.SignatureAlgorithm {jose .HS256 }
1212var  joseTestKey  =  []byte ("0123456789abcdef0123456789abcdef" ) // 32 bytes 
1313
14- func  TestNew (t  * testing.T ) {
15- 	issuer  :=  "my-issuer" 
16- 	token  :=  jwt .NewWithClaims (jwt .SigningMethodHS256 , & jwt.RegisteredClaims {
17- 		Issuer : issuer ,
18- 	})
19- 	tokenString , err  :=  token .SignedString (joseTestKey )
20- 	assert .NoError (t , err )
21- 
22- 	webToken , err  :=  New (tokenString , signatureAlgorithms )
23- 	assert .NoError (t , err )
24- 	assert .NotNil (t , webToken )
25- 	assert .Equal (t , issuer , webToken .Issuer )
26- }
14+ func  TestNew_Success (t  * testing.T ) {
15+ 	tests  :=  []struct  {
16+ 		name        string 
17+ 		claims      map [string ]interface {}
18+ 		expectedWT  WebToken 
19+ 	}{
20+ 		{
21+ 			name : "basic issuer claim" ,
22+ 			claims : map [string ]interface {}{
23+ 				"iss" : "my-issuer" ,
24+ 			},
25+ 			expectedWT : WebToken {
26+ 				IssuerAttributes : IssuerAttributes {
27+ 					Issuer : "my-issuer" ,
28+ 				},
29+ 			},
30+ 		},
31+ 		{
32+ 			name : "with first_name and last_name" ,
33+ 			claims : map [string ]interface {}{
34+ 				"iss" :        "test-issuer" ,
35+ 				"sub" :        "test-subject" ,
36+ 				"first_name" : "John" ,
37+ 				"last_name" :  "Doe" ,
38+ 			},
39+ 			expectedWT : WebToken {
40+ 				IssuerAttributes : IssuerAttributes {
41+ 					Issuer :  "test-issuer" ,
42+ 					Subject : "test-subject" ,
43+ 				},
44+ 				UserAttributes : UserAttributes {
45+ 					FirstName : "John" ,
46+ 					LastName :  "Doe" ,
47+ 				},
48+ 			},
49+ 		},
50+ 		{
51+ 			name : "with given_name and family_name" ,
52+ 			claims : map [string ]interface {}{
53+ 				"iss" :         "test-issuer" ,
54+ 				"sub" :         "test-subject" ,
55+ 				"given_name" :  "Jonathan" ,
56+ 				"family_name" : "Smith" ,
57+ 			},
58+ 			expectedWT : WebToken {
59+ 				IssuerAttributes : IssuerAttributes {
60+ 					Issuer :  "test-issuer" ,
61+ 					Subject : "test-subject" ,
62+ 				},
63+ 				UserAttributes : UserAttributes {
64+ 					FirstName : "Jonathan" ,
65+ 					LastName :  "Smith" ,
66+ 				},
67+ 			},
68+ 		},
69+ 		{
70+ 			name : "prefer first_name/last_name over given_name/family_name" ,
71+ 			claims : map [string ]interface {}{
72+ 				"iss" :         "test-issuer" ,
73+ 				"sub" :         "test-subject" ,
74+ 				"first_name" :  "John" ,
75+ 				"last_name" :   "Doe" ,
76+ 				"given_name" :  "Jonathan" ,
77+ 				"family_name" : "Smith" ,
78+ 			},
79+ 			expectedWT : WebToken {
80+ 				IssuerAttributes : IssuerAttributes {
81+ 					Issuer :  "test-issuer" ,
82+ 					Subject : "test-subject" ,
83+ 				},
84+ 				UserAttributes : UserAttributes {
85+ 					FirstName : "John" ,
86+ 					LastName :  "Doe" ,
87+ 				},
88+ 			},
89+ 		},
90+ 		{
91+ 			name : "fallback to given_name/family_name when first_name/last_name are empty" ,
92+ 			claims : map [string ]interface {}{
93+ 				"iss" :         "test-issuer" ,
94+ 				"sub" :         "test-subject" ,
95+ 				"first_name" :  "" ,
96+ 				"last_name" :   "" ,
97+ 				"given_name" :  "Jonathan" ,
98+ 				"family_name" : "Smith" ,
99+ 			},
100+ 			expectedWT : WebToken {
101+ 				IssuerAttributes : IssuerAttributes {
102+ 					Issuer :  "test-issuer" ,
103+ 					Subject : "test-subject" ,
104+ 				},
105+ 				UserAttributes : UserAttributes {
106+ 					FirstName : "Jonathan" ,
107+ 					LastName :  "Smith" ,
108+ 				},
109+ 			},
110+ 		},
111+ 		{
112+ 			name : "partial fallback - first_name present, last_name empty" ,
113+ 			claims : map [string ]interface {}{
114+ 				"iss" :         "test-issuer" ,
115+ 				"sub" :         "test-subject" ,
116+ 				"first_name" :  "John" ,
117+ 				"last_name" :   "" ,
118+ 				"given_name" :  "Jonathan" ,
119+ 				"family_name" : "Smith" ,
120+ 			},
121+ 			expectedWT : WebToken {
122+ 				IssuerAttributes : IssuerAttributes {
123+ 					Issuer :  "test-issuer" ,
124+ 					Subject : "test-subject" ,
125+ 				},
126+ 				UserAttributes : UserAttributes {
127+ 					FirstName : "John" ,
128+ 					LastName :  "Smith" ,
129+ 				},
130+ 			},
131+ 		},
132+ 	}
133+ 
134+ 	for  _ , tt  :=  range  tests  {
135+ 		t .Run (tt .name , func (t  * testing.T ) {
136+ 			token  :=  jwt .NewWithClaims (jwt .SigningMethodHS256 , jwt .MapClaims (tt .claims ))
137+ 			tokenString , err  :=  token .SignedString (joseTestKey )
138+ 			assert .NoError (t , err )
27139
28- func  TestNewAndFail (t  * testing.T ) {
29- 	tokenString  :=  "just a string" 
30- 	_ , err  :=  New (tokenString , signatureAlgorithms )
31- 	assert .Error (t , err )
140+ 			webToken , err  :=  New (tokenString , signatureAlgorithms )
141+ 			assert .NoError (t , err )
142+ 			assert .NotNil (t , webToken )
143+ 			assert .Equal (t , tt .expectedWT .Issuer , webToken .Issuer )
144+ 			assert .Equal (t , tt .expectedWT .Subject , webToken .Subject )
145+ 			assert .Equal (t , tt .expectedWT .FirstName , webToken .FirstName )
146+ 			assert .Equal (t , tt .expectedWT .LastName , webToken .LastName )
147+ 		})
148+ 	}
32149}
33150
34- func  TestNew_DeserializationError (t  * testing.T ) {
35- 	// Create a valid JWT header and signature, but with a payload that is not valid JSON 
36- 	// or cannot be unmarshaled into the expected struct. 
37- 	// We'll use jose to construct a token with a payload that is not a JSON object. 
38- 	invalidPayload  :=  "not-a-json-object" 
39- 	signer , err  :=  jose .NewSigner (jose.SigningKey {Algorithm : jose .HS256 , Key : joseTestKey }, nil )
40- 	assert .NoError (t , err )
151+ func  TestNew_Errors (t  * testing.T ) {
152+ 	tests  :=  []struct  {
153+ 		name           string 
154+ 		tokenString    string 
155+ 		setupToken     func () (string , error )
156+ 		expectedError  string 
157+ 	}{
158+ 		{
159+ 			name :          "invalid token string" ,
160+ 			tokenString :   "just a string" ,
161+ 			expectedError : "unable to parse id_token" ,
162+ 		},
163+ 		{
164+ 			name : "deserialization error with invalid payload" ,
165+ 			setupToken : func () (string , error ) {
166+ 				// Create a valid JWT header and signature, but with a payload that is not valid JSON 
167+ 				invalidPayload  :=  "not-a-json-object" 
168+ 				signer , err  :=  jose .NewSigner (jose.SigningKey {Algorithm : jose .HS256 , Key : joseTestKey }, nil )
169+ 				if  err  !=  nil  {
170+ 					return  "" , err 
171+ 				}
172+ 
173+ 				object , err  :=  signer .Sign ([]byte (invalidPayload ))
174+ 				if  err  !=  nil  {
175+ 					return  "" , err 
176+ 				}
177+ 
178+ 				return  object .CompactSerialize ()
179+ 			},
180+ 			expectedError : "unable to deserialize claims" ,
181+ 		},
182+ 	}
41183
42- 	object , err  :=  signer .Sign ([]byte (invalidPayload ))
43- 	assert .NoError (t , err )
184+ 	for  _ , tt  :=  range  tests  {
185+ 		t .Run (tt .name , func (t  * testing.T ) {
186+ 			var  tokenString  string 
187+ 			var  err  error 
44188
45- 	tokenString , err  :=  object .CompactSerialize ()
46- 	assert .NoError (t , err )
189+ 			if  tt .setupToken  !=  nil  {
190+ 				tokenString , err  =  tt .setupToken ()
191+ 				assert .NoError (t , err )
192+ 			} else  {
193+ 				tokenString  =  tt .tokenString 
194+ 			}
47195
48- 	_ , err  =  New (tokenString , signatureAlgorithms )
49- 	assert .Error (t , err )
50- 	assert .Contains (t , err .Error (), "unable to deserialize claims" )
196+ 			_ , err  =  New (tokenString , signatureAlgorithms )
197+ 			assert .Error (t , err )
198+ 			assert .Contains (t , err .Error (), tt .expectedError )
199+ 		})
200+ 	}
51201}
0 commit comments