Skip to content

Commit 0dbcb2d

Browse files
committed
Added unit test to test the updated implementation of AddScopes.
1 parent 56c1a1a commit 0dbcb2d

File tree

4 files changed

+135
-8
lines changed

4 files changed

+135
-8
lines changed

GoogleSignIn/Tests/Unit/GIDSignInTest.m

Lines changed: 124 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ - (void)testOAuthLogin {
644644
authError:nil
645645
tokenError:nil
646646
emmPasscodeInfoRequired:NO
647+
tokenClaimsAsJSONRequired:NO
647648
keychainError:NO
648649
restoredSignIn:NO
649650
oldAccessToken:NO
@@ -661,6 +662,7 @@ - (void)testOAuthLogin_RestoredSignIn {
661662
authError:nil
662663
tokenError:nil
663664
emmPasscodeInfoRequired:NO
665+
tokenClaimsAsJSONRequired:NO
664666
keychainError:NO
665667
restoredSignIn:YES
666668
oldAccessToken:NO
@@ -678,6 +680,7 @@ - (void)testOAuthLogin_RestoredSignInOldAccessToken {
678680
authError:nil
679681
tokenError:nil
680682
emmPasscodeInfoRequired:NO
683+
tokenClaimsAsJSONRequired:NO
681684
keychainError:NO
682685
restoredSignIn:YES
683686
oldAccessToken:YES
@@ -697,6 +700,7 @@ - (void)testOAuthLogin_AdditionalScopes {
697700
authError:nil
698701
tokenError:nil
699702
emmPasscodeInfoRequired:NO
703+
tokenClaimsAsJSONRequired:NO
700704
keychainError:NO
701705
tokenClaimsError:NO
702706
restoredSignIn:NO
@@ -714,6 +718,7 @@ - (void)testOAuthLogin_AdditionalScopes {
714718
authError:nil
715719
tokenError:nil
716720
emmPasscodeInfoRequired:NO
721+
tokenClaimsAsJSONRequired:NO
717722
keychainError:NO
718723
tokenClaimsError:NO
719724
restoredSignIn:NO
@@ -731,6 +736,7 @@ - (void)testOAuthLogin_AdditionalScopes {
731736
authError:nil
732737
tokenError:nil
733738
emmPasscodeInfoRequired:NO
739+
tokenClaimsAsJSONRequired:NO
734740
keychainError:NO
735741
tokenClaimsError:NO
736742
restoredSignIn:NO
@@ -758,6 +764,7 @@ - (void)testOAuthLogin_WithTokenClaims_FormatsParametersCorrectly {
758764
authError:nil
759765
tokenError:nil
760766
emmPasscodeInfoRequired:NO
767+
tokenClaimsAsJSONRequired:NO
761768
keychainError:NO
762769
tokenClaimsError:NO
763770
restoredSignIn:NO
@@ -776,6 +783,7 @@ - (void)testOAuthLogin_WithTokenClaims_FormatsParametersCorrectly {
776783
authError:nil
777784
tokenError:nil
778785
emmPasscodeInfoRequired:NO
786+
tokenClaimsAsJSONRequired:NO
779787
keychainError:NO
780788
tokenClaimsError:NO
781789
restoredSignIn:NO
@@ -803,6 +811,7 @@ - (void)testOAuthLogin_WithTokenClaims_ReturnsIdTokenWithCorrectClaims {
803811
authError:nil
804812
tokenError:nil
805813
emmPasscodeInfoRequired:NO
814+
tokenClaimsAsJSONRequired:NO
806815
keychainError:NO
807816
tokenClaimsError:NO
808817
restoredSignIn:NO
@@ -838,6 +847,7 @@ - (void)testAddScopes {
838847
authError:nil
839848
tokenError:nil
840849
emmPasscodeInfoRequired:NO
850+
tokenClaimsAsJSONRequired:NO
841851
keychainError:NO
842852
restoredSignIn:YES
843853
oldAccessToken:NO
@@ -856,11 +866,13 @@ - (void)testAddScopes {
856866
OCMStub([_user configuration]).andReturn(configuration);
857867
OCMStub([_user profile]).andReturn(profile);
858868
OCMStub([_user grantedScopes]).andReturn(@[kGrantedScope]);
869+
OCMStub([_user authState]).andReturn(_authState);
859870

860871
[self OAuthLoginWithAddScopesFlow:YES
861872
authError:nil
862873
tokenError:nil
863874
emmPasscodeInfoRequired:NO
875+
tokenClaimsAsJSONRequired:NO
864876
keychainError:NO
865877
restoredSignIn:NO
866878
oldAccessToken:NO
@@ -888,6 +900,80 @@ - (void)testAddScopes {
888900
[profile stopMocking];
889901
}
890902

903+
- (void)testAddScopes_WithPreviouslyRequestedClaims {
904+
GIDTokenClaim *authTimeClaim = [GIDTokenClaim authTimeClaim];
905+
// Restore the previous sign-in account. This is the preparation for adding scopes.
906+
OCMStub(
907+
[_keychainStore saveAuthSession:OCMOCK_ANY error:OCMArg.anyObjectRef]
908+
).andDo(^(NSInvocation *invocation) {
909+
self->_keychainSaved = self->_saveAuthorizationReturnValue;
910+
});
911+
[self OAuthLoginWithAddScopesFlow:NO
912+
authError:nil
913+
tokenError:nil
914+
emmPasscodeInfoRequired:NO
915+
tokenClaimsAsJSONRequired:NO
916+
keychainError:NO
917+
tokenClaimsError:NO
918+
restoredSignIn:NO
919+
oldAccessToken:NO
920+
modalCancel:NO
921+
useAdditionalScopes:NO
922+
additionalScopes:nil
923+
manualNonce:nil
924+
tokenClaims:[NSSet setWithObject:authTimeClaim]];
925+
926+
XCTAssertNotNil(_signIn.currentUser);
927+
928+
id profile = OCMStrictClassMock([GIDProfileData class]);
929+
OCMStub([profile email]).andReturn(kUserEmail);
930+
931+
// Mock for the method `addScopes`.
932+
GIDConfiguration *configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
933+
serverClientID:nil
934+
hostedDomain:nil
935+
openIDRealm:kOpenIDRealm];
936+
OCMStub([_user configuration]).andReturn(configuration);
937+
OCMStub([_user profile]).andReturn(profile);
938+
OCMStub([_user grantedScopes]).andReturn(@[kGrantedScope]);
939+
OCMStub([_user authState]).andReturn(_authState);
940+
941+
[self OAuthLoginWithAddScopesFlow:YES
942+
authError:nil
943+
tokenError:nil
944+
emmPasscodeInfoRequired:NO
945+
tokenClaimsAsJSONRequired:YES
946+
keychainError:NO
947+
restoredSignIn:NO
948+
oldAccessToken:NO
949+
modalCancel:NO];
950+
951+
NSArray<NSString *> *grantedScopes;
952+
NSString *grantedScopeString = _savedAuthorizationRequest.scope;
953+
954+
if (grantedScopeString) {
955+
grantedScopeString = [grantedScopeString stringByTrimmingCharactersInSet:
956+
[NSCharacterSet whitespaceCharacterSet]];
957+
// Tokenize with space as a delimiter.
958+
NSMutableArray<NSString *> *parsedScopes =
959+
[[grantedScopeString componentsSeparatedByString:@" "] mutableCopy];
960+
// Remove empty strings.
961+
[parsedScopes removeObject:@""];
962+
grantedScopes = [parsedScopes copy];
963+
}
964+
965+
NSArray<NSString *> *expectedScopes = @[kNewScope, kGrantedScope];
966+
XCTAssertEqualObjects(grantedScopes, expectedScopes);
967+
XCTAssertEqualObjects(_savedAuthorizationRequest.additionalParameters[@"claims"],
968+
kNonEssentialAuthTimeClaimsJsonString,
969+
@"Claims JSON should be correctly formatted");
970+
971+
[_user verify];
972+
[profile verify];
973+
[profile stopMocking];
974+
}
975+
976+
891977
- (void)testOpenIDRealm {
892978
_signIn.configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
893979
serverClientID:nil
@@ -904,6 +990,7 @@ - (void)testOpenIDRealm {
904990
authError:nil
905991
tokenError:nil
906992
emmPasscodeInfoRequired:NO
993+
tokenClaimsAsJSONRequired:NO
907994
keychainError:NO
908995
restoredSignIn:NO
909996
oldAccessToken:NO
@@ -931,6 +1018,7 @@ - (void)testManualNonce {
9311018
authError:nil
9321019
tokenError:nil
9331020
emmPasscodeInfoRequired:NO
1021+
tokenClaimsAsJSONRequired:NO
9341022
keychainError:NO
9351023
tokenClaimsError:NO
9361024
restoredSignIn:NO
@@ -959,6 +1047,7 @@ - (void)testOAuthLogin_LoginHint {
9591047
authError:nil
9601048
tokenError:nil
9611049
emmPasscodeInfoRequired:NO
1050+
tokenClaimsAsJSONRequired:NO
9621051
keychainError:NO
9631052
restoredSignIn:NO
9641053
oldAccessToken:NO
@@ -984,6 +1073,7 @@ - (void)testOAuthLogin_HostedDomain {
9841073
authError:nil
9851074
tokenError:nil
9861075
emmPasscodeInfoRequired:NO
1076+
tokenClaimsAsJSONRequired:NO
9871077
keychainError:NO
9881078
restoredSignIn:NO
9891079
oldAccessToken:NO
@@ -998,6 +1088,7 @@ - (void)testOAuthLogin_ConsentCanceled {
9981088
authError:@"access_denied"
9991089
tokenError:nil
10001090
emmPasscodeInfoRequired:NO
1091+
tokenClaimsAsJSONRequired:NO
10011092
keychainError:NO
10021093
restoredSignIn:NO
10031094
oldAccessToken:NO
@@ -1012,6 +1103,7 @@ - (void)testOAuthLogin_ModalCanceled {
10121103
authError:nil
10131104
tokenError:nil
10141105
emmPasscodeInfoRequired:NO
1106+
tokenClaimsAsJSONRequired:NO
10151107
keychainError:NO
10161108
restoredSignIn:NO
10171109
oldAccessToken:NO
@@ -1036,6 +1128,7 @@ - (void)testOAuthLogin_KeychainError {
10361128
authError:nil
10371129
tokenError:nil
10381130
emmPasscodeInfoRequired:NO
1131+
tokenClaimsAsJSONRequired:NO
10391132
keychainError:YES
10401133
restoredSignIn:NO
10411134
oldAccessToken:NO
@@ -1056,6 +1149,7 @@ - (void)testOAuthLogin_TokenClaims_FailsWithError {
10561149
authError:nil
10571150
tokenError:nil
10581151
emmPasscodeInfoRequired:NO
1152+
tokenClaimsAsJSONRequired:NO
10591153
keychainError:NO
10601154
tokenClaimsError:YES
10611155
restoredSignIn:NO
@@ -1093,6 +1187,7 @@ - (void)testSignOut {
10931187
authError:nil
10941188
tokenError:nil
10951189
emmPasscodeInfoRequired:NO
1190+
tokenClaimsAsJSONRequired:NO
10961191
keychainError:NO
10971192
restoredSignIn:YES
10981193
oldAccessToken:NO
@@ -1339,6 +1434,7 @@ - (void)testEmmSupportRequestParameters {
13391434
authError:nil
13401435
tokenError:nil
13411436
emmPasscodeInfoRequired:NO
1437+
tokenClaimsAsJSONRequired:NO
13421438
keychainError:NO
13431439
restoredSignIn:NO
13441440
oldAccessToken:NO
@@ -1390,6 +1486,7 @@ - (void)testEmmPasscodeInfo {
13901486
authError:nil
13911487
tokenError:nil
13921488
emmPasscodeInfoRequired:YES
1489+
tokenClaimsAsJSONRequired:NO
13931490
keychainError:NO
13941491
restoredSignIn:NO
13951492
oldAccessToken:NO
@@ -1421,6 +1518,7 @@ - (void)testAuthEndpointEMMError {
14211518
authError:callbackParams[@"error"]
14221519
tokenError:nil
14231520
emmPasscodeInfoRequired:NO
1521+
tokenClaimsAsJSONRequired:NO
14241522
keychainError:NO
14251523
restoredSignIn:NO
14261524
oldAccessToken:NO
@@ -1458,6 +1556,7 @@ - (void)testTokenEndpointEMMError {
14581556
authError:nil
14591557
tokenError:emmError
14601558
emmPasscodeInfoRequired:NO
1559+
tokenClaimsAsJSONRequired:NO
14611560
keychainError:NO
14621561
restoredSignIn:NO
14631562
oldAccessToken:NO
@@ -1542,6 +1641,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15421641
authError:(NSString *)authError
15431642
tokenError:(NSError *)tokenError
15441643
emmPasscodeInfoRequired:(BOOL)emmPasscodeInfoRequired
1644+
tokenClaimsAsJSONRequired:(BOOL)tokenClaimsAsJSONRequired
15451645
keychainError:(BOOL)keychainError
15461646
restoredSignIn:(BOOL)restoredSignIn
15471647
oldAccessToken:(BOOL)oldAccessToken
@@ -1550,6 +1650,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15501650
authError:authError
15511651
tokenError:tokenError
15521652
emmPasscodeInfoRequired:emmPasscodeInfoRequired
1653+
tokenClaimsAsJSONRequired:tokenClaimsAsJSONRequired
15531654
keychainError:keychainError
15541655
tokenClaimsError:NO
15551656
restoredSignIn:restoredSignIn
@@ -1566,6 +1667,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15661667
authError:(NSString *)authError
15671668
tokenError:(NSError *)tokenError
15681669
emmPasscodeInfoRequired:(BOOL)emmPasscodeInfoRequired
1670+
tokenClaimsAsJSONRequired:(BOOL)tokenClaimsAsJSONRequired
15691671
keychainError:(BOOL)keychainError
15701672
tokenClaimsError:(BOOL)tokenClaimsError
15711673
restoredSignIn:(BOOL)restoredSignIn
@@ -1582,8 +1684,9 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
15821684
[[[_authState expect] andReturnValue:[NSNumber numberWithBool:isAuthorized]] isAuthorized];
15831685
}
15841686

1585-
NSDictionary<NSString *, NSString *> *additionalParameters = emmPasscodeInfoRequired ?
1586-
@{ @"emm_passcode_info_required" : @"1" } : nil;
1687+
NSDictionary<NSString *, NSString *> *additionalParameters =
1688+
[self getAdditionalParametersWithEMMPasscodeInfoRequired:emmPasscodeInfoRequired
1689+
tokenClaimsAsJSONRequired:tokenClaimsAsJSONRequired];
15871690
OIDAuthorizationResponse *authResponse =
15881691
[OIDAuthorizationResponse testInstanceWithAdditionalParameters:additionalParameters
15891692
nonce:nonce
@@ -1646,6 +1749,7 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
16461749
self->_authError = error;
16471750
};
16481751
if (addScopesFlow) {
1752+
[[[_authState expect] andReturn:authResponse] lastAuthorizationResponse];
16491753
[_signIn addScopes:@[kNewScope]
16501754
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
16511755
presentingViewController:_presentingViewController
@@ -1846,4 +1950,22 @@ - (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
18461950
}
18471951
}
18481952

1953+
#pragma mark - Private Helpers
1954+
1955+
- (NSDictionary<NSString *, NSString *> *)
1956+
getAdditionalParametersWithEMMPasscodeInfoRequired:(BOOL)emmPasscodeInfoRequired
1957+
tokenClaimsAsJSONRequired:(BOOL)tokenClaimsAsJSONRequired {
1958+
NSMutableDictionary<NSString *, NSString *> *additionalParameters =
1959+
[NSMutableDictionary dictionary];
1960+
1961+
if (emmPasscodeInfoRequired) {
1962+
additionalParameters[@"emm_passcode_info_required"] = @"1";
1963+
}
1964+
if (tokenClaimsAsJSONRequired) {
1965+
additionalParameters[@"claims"] = kNonEssentialAuthTimeClaimsJsonString;
1966+
}
1967+
1968+
return [additionalParameters copy];
1969+
}
1970+
18491971
@end

GoogleSignIn/Tests/Unit/OIDAuthorizationRequest+Testing.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ extern NSString * _Nonnull const OIDAuthorizationRequestTestingCodeVerifier;
2929

3030
+ (instancetype _Nonnull)testInstance;
3131

32-
+ (instancetype _Nonnull)testInstanceWithNonce:(nullable NSString *)nonce;
33-
32+
+ (instancetype _Nonnull)testInstanceWithNonce:(nullable NSString *)nonce
33+
additionalParameters:(nullable NSDictionary<NSString *, NSString *> *)additionalParameters;
3434
@end

GoogleSignIn/Tests/Unit/OIDAuthorizationRequest+Testing.m

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
@implementation OIDAuthorizationRequest (Testing)
3333

3434
+ (instancetype)testInstance {
35-
return [self testInstanceWithNonce:nil];
35+
return [self testInstanceWithNonce:nil additionalParameters:nil];
3636
}
3737

38-
+ (instancetype)testInstanceWithNonce:(nullable NSString *)nonce {
38+
+ (instancetype)testInstanceWithNonce:(nullable NSString *)nonce
39+
additionalParameters:
40+
(nullable NSDictionary<NSString *, NSString *> *)additionalParameters {
3941
return [[OIDAuthorizationRequest alloc]
4042
initWithConfiguration:[OIDServiceConfiguration testInstance]
4143
clientId:OIDAuthorizationRequestTestingClientID
@@ -44,7 +46,7 @@ + (instancetype)testInstanceWithNonce:(nullable NSString *)nonce {
4446
redirectURL:[NSURL URLWithString:@"http://test.com"]
4547
responseType:OIDResponseTypeCode
4648
nonce:nonce
47-
additionalParameters:nil];
49+
additionalParameters:additionalParameters];
4850
}
4951

5052
@end

GoogleSignIn/Tests/Unit/OIDAuthorizationResponse+Testing.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ + (instancetype)testInstanceWithAdditionalParameters:
4646
[parameters addEntriesFromDictionary:additionalParameters];
4747
}
4848
}
49-
return [[OIDAuthorizationResponse alloc] initWithRequest:[OIDAuthorizationRequest testInstanceWithNonce:nonce]
49+
OIDAuthorizationRequest *request =
50+
[OIDAuthorizationRequest testInstanceWithNonce:nonce
51+
additionalParameters:additionalParameters];
52+
return [[OIDAuthorizationResponse alloc] initWithRequest:request
5053
parameters:parameters];
5154
}
5255

0 commit comments

Comments
 (0)