|
| 1 | +// |
| 2 | +// GIDTokenClaimsInternalOptionsTest.h |
| 3 | +// GoogleSignIn |
| 4 | +// |
| 5 | +// Created by Akshat Gandhi on 9/5/25. |
| 6 | +// |
| 7 | + |
| 8 | + |
| 9 | +#import <XCTest/XCTest.h> |
| 10 | +#import "GoogleSignIn/Sources/GIDTokenClaimsInternalOptions.h" |
| 11 | +#import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h" |
| 12 | + |
| 13 | +@import OCMock; |
| 14 | + |
| 15 | +static NSString *const kEssentialAuthTimeExpectedJSON = @"{\"id_token\":{\"auth_time\":{\"essential\":true}}}"; |
| 16 | +static NSString *const kNonEssentialAuthTimeExpectedJSON = @"{\"id_token\":{\"auth_time\":null}}"; |
| 17 | + |
| 18 | + |
| 19 | +@interface GIDTokenClaimsInternalOptionsTest : XCTestCase |
| 20 | +@end |
| 21 | + |
| 22 | +@implementation GIDTokenClaimsInternalOptionsTest |
| 23 | + |
| 24 | +#pragma mark - Input Validation Tests |
| 25 | + |
| 26 | +- (void)testValidatedJSONStringForClaims_WithNilInput_ShouldReturnNil { |
| 27 | + XCTAssertNil([GIDTokenClaimsInternalOptions validatedJSONStringForClaims:nil error:nil]); |
| 28 | +} |
| 29 | + |
| 30 | +- (void)testValidatedJSONStringForClaims_WithEmptyInput_ShouldReturnNil { |
| 31 | + XCTAssertNil([GIDTokenClaimsInternalOptions validatedJSONStringForClaims:[NSSet set] error:nil]); |
| 32 | +} |
| 33 | + |
| 34 | +#pragma mark - Correct Formatting Tests |
| 35 | + |
| 36 | +- (void)testValidatedJSONStringForClaims_WithNonEssentialClaim_IsCorrectlyFormatted { |
| 37 | + NSSet *claims = [NSSet setWithObject:[GIDTokenClaim authTimeClaim]]; |
| 38 | + |
| 39 | + NSError *error = nil; |
| 40 | + NSString *result = [GIDTokenClaimsInternalOptions validatedJSONStringForClaims:claims error:&error]; |
| 41 | + |
| 42 | + XCTAssertNil(error); |
| 43 | + XCTAssertEqualObjects(result, kNonEssentialAuthTimeExpectedJSON); |
| 44 | +} |
| 45 | + |
| 46 | +- (void)testValidatedJSONStringForClaims_WithEssentialClaim_IsCorrectlyFormatted { |
| 47 | + NSSet *claims = [NSSet setWithObject:[GIDTokenClaim essentialAuthTimeClaim]]; |
| 48 | + |
| 49 | + NSError *error = nil; |
| 50 | + NSString *result = [GIDTokenClaimsInternalOptions validatedJSONStringForClaims:claims error:&error]; |
| 51 | + |
| 52 | + XCTAssertNil(error); |
| 53 | + XCTAssertEqualObjects(result, kEssentialAuthTimeExpectedJSON); |
| 54 | +} |
| 55 | + |
| 56 | +#pragma mark - Client Error Handling Tests |
| 57 | + |
| 58 | +- (void)testValidatedJSONStringForClaims_WithConflictingClaims_ReturnsNilAndPopulatesError { |
| 59 | + NSSet *claims = [NSSet setWithObjects:[GIDTokenClaim authTimeClaim], |
| 60 | + [GIDTokenClaim essentialAuthTimeClaim], |
| 61 | + nil]; |
| 62 | + NSError *error = nil; |
| 63 | + |
| 64 | + NSString *result = [GIDTokenClaimsInternalOptions validatedJSONStringForClaims:claims error:&error]; |
| 65 | + |
| 66 | + XCTAssertNil(result, @"Method should return nil for conflicting claims."); |
| 67 | + XCTAssertNotNil(error, @"An error object should be populated."); |
| 68 | + XCTAssertEqualObjects(error.domain, kGIDSignInErrorDomain, @"Error domain should be correct."); |
| 69 | + XCTAssertEqual(error.code, kGIDSignInErrorCodeAmbiguousClaims, @"Error code should be for ambiguous claims."); |
| 70 | +} |
| 71 | + |
| 72 | +- (void)testValidatedJSONStringForClaims_WhenSerializationFails_ReturnsNilAndError { |
| 73 | + NSSet *claims = [NSSet setWithObject:[GIDTokenClaim authTimeClaim]]; |
| 74 | + NSError *fakeJSONError = [NSError errorWithDomain:@"com.fake.json" code:-999 userInfo:nil]; |
| 75 | + id mockSerialization = OCMClassMock([NSJSONSerialization class]); |
| 76 | + |
| 77 | + OCMStub([mockSerialization dataWithJSONObject:OCMOCK_ANY |
| 78 | + options:0 |
| 79 | + error:[OCMArg setTo:fakeJSONError]]).andReturn(nil); |
| 80 | + |
| 81 | + NSError *actualError = nil; |
| 82 | + NSString *result = |
| 83 | + [GIDTokenClaimsInternalOptions validatedJSONStringForClaims:claims error:&actualError]; |
| 84 | + |
| 85 | + XCTAssertNil(result, @"The result should be nil when JSON serialization fails."); |
| 86 | + XCTAssertEqualObjects(actualError, fakeJSONError, |
| 87 | + @"The error from serialization should be passed back to the caller."); |
| 88 | + |
| 89 | + [mockSerialization stopMocking]; |
| 90 | +} |
| 91 | + |
| 92 | +@end |
0 commit comments