Skip to content

Commit b9d95bd

Browse files
committed
Respect the shouldSkipAuthorization property on single queries.
Add tests for shouldSkipAuthorization behavior for single and batch queries.
1 parent 6d52138 commit b9d95bd

File tree

2 files changed

+66
-7
lines changed

2 files changed

+66
-7
lines changed

Source/Objects/GTLRService.m

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,6 @@ - (GTLRServiceTicket *)executeBatchQuery:(GTLRBatchQuery *)batchObj
976976
return resultTicket;
977977
}
978978

979-
980979
#pragma mark -
981980

982981
// Raw REST fetch method.
@@ -1817,6 +1816,7 @@ - (BOOL)fetchNextPageWithQuery:(GTLRQuery *)query
18171816
completionHandler:handler
18181817
ticket:ticket];
18191818
} else {
1819+
BOOL mayAuthorize = !query.shouldSkipAuthorization;
18201820
NSURL *url = [self URLFromQueryObject:query
18211821
usePartialPaths:NO
18221822
includeServiceURLQueryParams:YES];
@@ -1825,7 +1825,7 @@ - (BOOL)fetchNextPageWithQuery:(GTLRQuery *)query
18251825
bodyObject:query.bodyObject
18261826
ETag:nil
18271827
httpMethod:query.httpMethod
1828-
mayAuthorize:YES
1828+
mayAuthorize:mayAuthorize
18291829
completionHandler:handler
18301830
executingQuery:query
18311831
ticket:ticket];
@@ -2130,6 +2130,7 @@ - (GTLRServiceTicket *)executeQuery:(id<GTLRQueryProtocol>)queryObj
21302130
}
21312131
}
21322132

2133+
BOOL mayAuthorize = !query.shouldSkipAuthorization;
21332134
NSURL *url = [self URLFromQueryObject:query
21342135
usePartialPaths:NO
21352136
includeServiceURLQueryParams:YES];
@@ -2139,7 +2140,7 @@ - (GTLRServiceTicket *)executeQuery:(id<GTLRQueryProtocol>)queryObj
21392140
bodyObject:query.bodyObject
21402141
ETag:nil
21412142
httpMethod:query.httpMethod
2142-
mayAuthorize:YES
2143+
mayAuthorize:mayAuthorize
21432144
completionHandler:handler
21442145
executingQuery:query
21452146
ticket:nil];

Source/Tests/GTLRServiceTest.m

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,13 @@ - (void)testService_SingleQuery {
360360
// URL query parameters.
361361
XCTAssertEqualObjects(QueryValueForURLItem(fetcherRequest.URL, @"meowParam"), @"Meow");
362362

363+
// The fetcher releases its authorizer upon completion, so to test the request,
364+
// we'll use the service's authorizer.
365+
id<GTMFetcherAuthorizationProtocol> authorizer = service.authorizer;
366+
XCTAssertNotNil(authorizer);
367+
XCTAssert([authorizer isAuthorizedRequest:fetcherRequest],
368+
@"%@", fetcherRequest.allHTTPHeaderFields);
369+
363370
// Ensure all expectations were satisfied.
364371
[self waitForExpectationsWithTimeout:10 handler:nil];
365372

@@ -621,6 +628,44 @@ - (void)testService_SingleQuery_Paging {
621628
expectedExpirations:0];
622629
}
623630

631+
- (void)testService_SingleQuery_SkipAuth {
632+
// Disallow authorizing request.
633+
GTLRService *service = [self driveServiceForTest];
634+
service.fetcherService.testBlock =
635+
[self fetcherTestBlockWithResponseForFileName:@"Drive1.response.txt" status:200];
636+
637+
// Request with an auth error.
638+
Test_GTLRDriveQuery_FilesList *query = [Test_GTLRDriveQuery_FilesList query];
639+
query.fields = @"kind,nextPageToken,files(id,kind,name)";
640+
query.requestID = @"gtlr_1234";
641+
query.shouldSkipAuthorization = YES;
642+
643+
XCTestExpectation *queryFinished = [self expectationWithDescription:@"queryFinished"];
644+
645+
GTLRServiceTicket *queryTicket =
646+
[service executeQuery:query
647+
completionHandler:^(GTLRServiceTicket *callbackTicket,
648+
Test_GTLRDrive_FileList *object, NSError *error) {
649+
XCTAssertEqualObjects([object class], [Test_GTLRDrive_FileList class]);
650+
XCTAssertNil(error);
651+
652+
[queryFinished fulfill];
653+
}];
654+
655+
XCTAssert([self service:service waitForTicket:queryTicket]);
656+
XCTAssert(queryTicket.hasCalledCallback);
657+
658+
// Authorization should have been skipped.
659+
id<GTMFetcherAuthorizationProtocol> authorizer = service.authorizer;
660+
NSURLRequest *fetcherRequest = queryTicket.objectFetcher.request;
661+
XCTAssertNotNil(authorizer);
662+
XCTAssertFalse([authorizer isAuthorizedRequest:fetcherRequest],
663+
@"%@", fetcherRequest.allHTTPHeaderFields);
664+
665+
// Ensure all expectations were satisfied.
666+
[self waitForExpectationsWithTimeout:10 handler:nil];
667+
}
668+
624669
- (void)testService_SingleQuery_InvalidParam {
625670
// Unsuccessful request (invalid page token).
626671
//
@@ -1156,6 +1201,14 @@ - (void)performMediaQueryTestUsingMediaService:(BOOL)useMediaService {
11561201
}
11571202

11581203
- (void)testService_BatchQuery {
1204+
[self performBatchQueryTestSkippingAuthorization:NO];
1205+
}
1206+
1207+
- (void)testService_BatchQuery_SkipAuth {
1208+
[self performBatchQueryTestSkippingAuthorization:YES];
1209+
}
1210+
1211+
- (void)performBatchQueryTestSkippingAuthorization:(BOOL)shouldSkipAuthorization {
11591212
// Mixed failure and success batch request with valid authorization.
11601213
//
11611214
// Response is file Drive1Batch1.response.txt
@@ -1252,6 +1305,8 @@ - (void)testService_BatchQuery {
12521305
XCTAssert([NSThread isMainThread]);
12531306
};
12541307

1308+
batchQuery.shouldSkipAuthorization = shouldSkipAuthorization;
1309+
12551310
__block GTLRServiceTicket *queryTicket =
12561311
[service executeQuery:batchQuery
12571312
completionHandler:^(GTLRServiceTicket *callbackTicket,
@@ -1298,11 +1353,8 @@ - (void)testService_BatchQuery {
12981353
@"https://www.googleapis.com/batch");
12991354

13001355
// Test additionalHTTPHeaders.
1301-
//
1302-
// Headers.
1303-
XCTAssertEqualObjects([fetcherRequest valueForHTTPHeaderField:@"Authorization"],
1304-
@"Bearer catpaws");
13051356
XCTAssertEqualObjects([fetcherRequest valueForHTTPHeaderField:@"X-Feline"], @"Fluffy");
1357+
XCTAssertEqualObjects([fetcherRequest valueForHTTPHeaderField:@"X-Canine"], @"Spot");
13061358

13071359
// Verify the payload was the expected multipart MIME.
13081360
NSData *requestBody = fetcherRequest.HTTPBody;
@@ -1332,6 +1384,12 @@ - (void)testService_BatchQuery {
13321384
NSString *expectedBodyGet = @"GET /drive/v3/files/0B7svZDDwtKrhS2FDS2JZclU1U0E?fields=parents";
13331385
XCTAssert([part2BodyStr hasPrefix:expectedBodyGet], @"%@", part2BodyStr);
13341386

1387+
// Verify authorization.
1388+
id<GTMFetcherAuthorizationProtocol> authorizer = service.authorizer;
1389+
XCTAssertNotNil(authorizer);
1390+
bool didAuthorize = [authorizer isAuthorizedRequest:fetcherRequest];
1391+
XCTAssertEqual(didAuthorize, !shouldSkipAuthorization, @"%@", fetcherRequest.allHTTPHeaderFields);
1392+
13351393
// Ensure all expectations were satisfied.
13361394
[self waitForExpectationsWithTimeout:10 handler:nil];
13371395

0 commit comments

Comments
 (0)