22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5+ import 'dart:convert' ;
6+
57import 'package:flutter_test/flutter_test.dart' ;
68import 'package:google_identity_services_web/id.dart' ;
79import 'package:google_identity_services_web/oauth2.dart' ;
@@ -18,6 +20,7 @@ void main() {
1820 group ('gisResponsesToTokenData' , () {
1921 testWidgets ('null objects -> no problem' , (_) async {
2022 final GoogleSignInTokenData tokens = gisResponsesToTokenData (null , null );
23+
2124 expect (tokens.accessToken, isNull);
2225 expect (tokens.idToken, isNull);
2326 expect (tokens.serverAuthCode, isNull);
@@ -36,6 +39,7 @@ void main() {
3639 });
3740 final GoogleSignInTokenData tokens =
3841 gisResponsesToTokenData (credential, token);
42+
3943 expect (tokens.accessToken, expectedAccessToken);
4044 expect (tokens.idToken, expectedIdToken);
4145 expect (tokens.serverAuthCode, isNull);
@@ -44,22 +48,21 @@ void main() {
4448
4549 group ('gisResponsesToUserData' , () {
4650 testWidgets ('happy case' , (_) async {
47- final GoogleSignInUserData data = gisResponsesToUserData (okCredential )! ;
51+ final GoogleSignInUserData data = gisResponsesToUserData (goodCredential )! ;
4852
4953 expect (data.displayName, 'Vincent Adultman' );
5054 expect (data.id, '123456' );
5155 expect (data.email,
'[email protected] ' );
5256 expect (data.photoUrl, 'https://thispersondoesnotexist.com/image?x=.jpg' );
53- expect (data.idToken, okCredential.credential );
57+ expect (data.idToken, goodJwtToken );
5458 });
5559
5660 testWidgets ('null response -> null' , (_) async {
5761 expect (gisResponsesToUserData (null ), isNull);
5862 });
5963
6064 testWidgets ('null response.credential -> null' , (_) async {
61- final CredentialResponse response = nullCredential;
62- expect (gisResponsesToUserData (response), isNull);
65+ expect (gisResponsesToUserData (nullCredential), isNull);
6366 });
6467
6568 testWidgets ('invalid payload -> null' , (_) async {
@@ -70,4 +73,101 @@ void main() {
7073 expect (gisResponsesToUserData (response), isNull);
7174 });
7275 });
76+
77+ group ('getJwtTokenPayload' , () {
78+ testWidgets ('happy case -> data' , (_) async {
79+ final Map <String , Object ?>? data = getJwtTokenPayload (goodJwtToken);
80+
81+ expect (data, isNotNull);
82+ expect (data, containsPair ('name' , 'Vincent Adultman' ));
83+ expect (data,
containsPair (
'email' ,
'[email protected] ' ));
84+ expect (data, containsPair ('sub' , '123456' ));
85+ expect (
86+ data,
87+ containsPair (
88+ 'picture' ,
89+ 'https://thispersondoesnotexist.com/image?x=.jpg' ,
90+ ));
91+ });
92+
93+ testWidgets ('null Token -> null' , (_) async {
94+ final Map <String , Object ?>? data = getJwtTokenPayload (null );
95+
96+ expect (data, isNull);
97+ });
98+
99+ testWidgets ('Token not matching the format -> null' , (_) async {
100+ final Map <String , Object ?>? data = getJwtTokenPayload ('1234.4321' );
101+
102+ expect (data, isNull);
103+ });
104+
105+ testWidgets ('Bad token that matches the format -> null' , (_) async {
106+ final Map <String , Object ?>? data = getJwtTokenPayload ('1234.abcd.4321' );
107+
108+ expect (data, isNull);
109+ });
110+ });
111+
112+ group ('decodeJwtPayload' , () {
113+ testWidgets ('Good payload -> data' , (_) async {
114+ final Map <String , Object ?>? data = decodeJwtPayload (goodPayload);
115+
116+ expect (data, isNotNull);
117+ expect (data, containsPair ('name' , 'Vincent Adultman' ));
118+ expect (data,
containsPair (
'email' ,
'[email protected] ' ));
119+ expect (data, containsPair ('sub' , '123456' ));
120+ expect (
121+ data,
122+ containsPair (
123+ 'picture' ,
124+ 'https://thispersondoesnotexist.com/image?x=.jpg' ,
125+ ));
126+ });
127+
128+ testWidgets ('Proper JSON payload -> data' , (_) async {
129+ final String payload = base64.encode (utf8.encode ('{"properJson": true}' ));
130+
131+ final Map <String , Object ?>? data = decodeJwtPayload (payload);
132+
133+ expect (data, isNotNull);
134+ expect (data, containsPair ('properJson' , true ));
135+ });
136+
137+ testWidgets ('Not-normalized base-64 payload -> data' , (_) async {
138+ // This is the payload generated by the "Proper JSON payload" test, but
139+ // we remove the leading "=" symbols so it's length is not a multiple of 4
140+ // anymore!
141+ final String payload = 'eyJwcm9wZXJKc29uIjogdHJ1ZX0=' .replaceAll ('=' , '' );
142+
143+ final Map <String , Object ?>? data = decodeJwtPayload (payload);
144+
145+ expect (data, isNotNull);
146+ expect (data, containsPair ('properJson' , true ));
147+ });
148+
149+ testWidgets ('Invalid JSON payload -> null' , (_) async {
150+ final String payload = base64.encode (utf8.encode ('{properJson: false}' ));
151+
152+ final Map <String , Object ?>? data = decodeJwtPayload (payload);
153+
154+ expect (data, isNull);
155+ });
156+
157+ testWidgets ('Non JSON payload -> null' , (_) async {
158+ final String payload = base64.encode (utf8.encode ('not-json' ));
159+
160+ final Map <String , Object ?>? data = decodeJwtPayload (payload);
161+
162+ expect (data, isNull);
163+ });
164+
165+ testWidgets ('Non base-64 payload -> null' , (_) async {
166+ const String payload = 'not-base-64-at-all' ;
167+
168+ final Map <String , Object ?>? data = decodeJwtPayload (payload);
169+
170+ expect (data, isNull);
171+ });
172+ });
73173}
0 commit comments