diff --git a/GoogleSignIn/Tests/Unit/GIDGoogleUserTest.m b/GoogleSignIn/Tests/Unit/GIDGoogleUserTest.m index 8196da40..2ff9e567 100644 --- a/GoogleSignIn/Tests/Unit/GIDGoogleUserTest.m +++ b/GoogleSignIn/Tests/Unit/GIDGoogleUserTest.m @@ -26,6 +26,7 @@ #import "GoogleSignIn/Tests/Unit/GIDProfileData+Testing.h" #import "GoogleSignIn/Tests/Unit/OIDAuthState+Testing.h" #import "GoogleSignIn/Tests/Unit/OIDAuthorizationRequest+Testing.h" +#import "GoogleSignIn/Tests/Unit/OIDTokenRequest+Testing.h" #import "GoogleSignIn/Tests/Unit/OIDTokenResponse+Testing.h" #ifdef SWIFT_PACKAGE @@ -34,6 +35,12 @@ #import #endif +static NSString *const kNewAccessToken = @"new_access_token"; +static NSTimeInterval const kTimeAccuracy = 10; +// The difference between times. +// It should be larger than kTimeAccuracy which is used in the method `XCTAssertEqualWithAccuracy`. +static NSTimeInterval const kTimeIncrement = 100; + @interface GIDGoogleUserTest : XCTestCase @end @@ -91,4 +98,40 @@ - (void)testLegacyCoding { } #endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST +- (void)testUpdateAuthState { + NSTimeInterval accessTokenExpireTime = [NSDate timeIntervalSinceReferenceDate]; + NSTimeInterval idTokenExpireTime = accessTokenExpireTime + kTimeIncrement; + + NSString *idToken = [self idTokenWithExpireTime:idTokenExpireTime]; + OIDAuthState *authState = [OIDAuthState testInstanceWithIDToken:idToken + accessToken:kAccessToken + accessTokenExpireTime:accessTokenExpireTime]; + + GIDGoogleUser *user = [[GIDGoogleUser alloc] initWithAuthState:authState profileData:nil]; + + NSTimeInterval updatedAccessTokenExpireTime = idTokenExpireTime + kTimeIncrement; + NSTimeInterval updatedIDTokenExpireTime = updatedAccessTokenExpireTime + kTimeIncrement; + NSString *updatedIDToken = [self idTokenWithExpireTime:updatedIDTokenExpireTime]; + OIDAuthState *updatedAuthState = [OIDAuthState testInstanceWithIDToken:updatedIDToken + accessToken:kNewAccessToken + accessTokenExpireTime:updatedAccessTokenExpireTime]; + GIDProfileData *updatedProfileData = [GIDProfileData testInstance]; + + [user updateAuthState:updatedAuthState profileData:updatedProfileData]; + + XCTAssertEqualObjects(user.accessToken.tokenString, kNewAccessToken); + XCTAssertEqualWithAccuracy([user.accessToken.expirationDate timeIntervalSinceReferenceDate], + updatedAccessTokenExpireTime, kTimeAccuracy); + XCTAssertEqualObjects(user.idToken.tokenString, updatedIDToken); + XCTAssertEqualWithAccuracy([user.idToken.expirationDate timeIntervalSinceReferenceDate], + updatedIDTokenExpireTime, kTimeAccuracy); + XCTAssertEqual(user.profile, updatedProfileData); +} + +#pragma mark - Helpers + +- (NSString *)idTokenWithExpireTime:(NSTimeInterval)expireTime { + return [OIDTokenResponse idTokenWithSub:kUserID exp:@(expireTime + NSTimeIntervalSince1970)]; +} + @end diff --git a/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.h b/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.h index bc97e6d2..b255352f 100644 --- a/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.h +++ b/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.h @@ -28,4 +28,8 @@ + (instancetype)testInstanceWithTokenResponse:(OIDTokenResponse *)tokenResponse; ++ (instancetype)testInstanceWithIDToken:(NSString *)idToken + accessToken:(NSString *)accessToken + accessTokenExpireTime:(NSTimeInterval)accessTokenExpireTime; + @end diff --git a/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.m b/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.m index a58994da..6c019820 100644 --- a/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.m +++ b/GoogleSignIn/Tests/Unit/OIDAuthState+Testing.m @@ -33,4 +33,17 @@ + (instancetype)testInstanceWithTokenResponse:(OIDTokenResponse *)tokenResponse tokenResponse:tokenResponse]; } ++ (instancetype)testInstanceWithIDToken:(NSString *)idToken + accessToken:(NSString *)accessToken + accessTokenExpireTime:(NSTimeInterval)accessTokenExpireTime { + NSNumber *accessTokenExpiresIn = + @(accessTokenExpireTime - [[NSDate date] timeIntervalSinceReferenceDate]); + OIDTokenResponse *newResponse = + [OIDTokenResponse testInstanceWithIDToken:idToken + accessToken:accessToken + expiresIn:accessTokenExpiresIn + tokenRequest:nil]; + return [self testInstanceWithTokenResponse:newResponse]; +} + @end