diff --git a/libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj b/libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj index 34348a5c3e..8fd91d8bba 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj +++ b/libs/SalesforceSDKCore/SalesforceSDKCore.xcodeproj/project.pbxproj @@ -430,9 +430,6 @@ CED452C21D808D0C009266EB /* SFRestRequest+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = CED452B41D808D0C009266EB /* SFRestRequest+Internal.h */; }; CED452C31D808D0C009266EB /* SFRestRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = CED452B51D808D0C009266EB /* SFRestRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; CED452C41D808D0C009266EB /* SFRestRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = CED452B61D808D0C009266EB /* SFRestRequest.m */; }; - CED452EB1D808DEE009266EB /* SalesforceRestAPITests.h in Headers */ = {isa = PBXBuildFile; fileRef = CED452E71D808DEE009266EB /* SalesforceRestAPITests.h */; }; - CED452ED1D808DEE009266EB /* SFNativeRestRequestListener.h in Headers */ = {isa = PBXBuildFile; fileRef = CED452E91D808DEE009266EB /* SFNativeRestRequestListener.h */; }; - CED452EF1D808E0A009266EB /* SFNativeRestRequestListener.m in Sources */ = {isa = PBXBuildFile; fileRef = CED452EA1D808DEE009266EB /* SFNativeRestRequestListener.m */; }; CED452F01D808E0F009266EB /* SalesforceRestAPITests.m in Sources */ = {isa = PBXBuildFile; fileRef = CED452E81D808DEE009266EB /* SalesforceRestAPITests.m */; }; D3B1519F2E1DA6EB00914EF1 /* AuthCoordinatorFrontdoorBridgeLoginOverride.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3B1519E2E1DA6EB00914EF1 /* AuthCoordinatorFrontdoorBridgeLoginOverride.swift */; }; D3D675DB2D39EF01008E468E /* ChatGenerationsRequestBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3D675CF2D39EF01008E468E /* ChatGenerationsRequestBody.swift */; }; @@ -980,10 +977,7 @@ CED452B41D808D0C009266EB /* SFRestRequest+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SFRestRequest+Internal.h"; sourceTree = ""; }; CED452B51D808D0C009266EB /* SFRestRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFRestRequest.h; sourceTree = ""; }; CED452B61D808D0C009266EB /* SFRestRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SFRestRequest.m; sourceTree = ""; }; - CED452E71D808DEE009266EB /* SalesforceRestAPITests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SalesforceRestAPITests.h; path = SalesforceSDKCoreTests/SalesforceRestAPITests.h; sourceTree = SOURCE_ROOT; }; CED452E81D808DEE009266EB /* SalesforceRestAPITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SalesforceRestAPITests.m; path = SalesforceSDKCoreTests/SalesforceRestAPITests.m; sourceTree = SOURCE_ROOT; }; - CED452E91D808DEE009266EB /* SFNativeRestRequestListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SFNativeRestRequestListener.h; path = SalesforceSDKCoreTests/SFNativeRestRequestListener.h; sourceTree = SOURCE_ROOT; }; - CED452EA1D808DEE009266EB /* SFNativeRestRequestListener.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SFNativeRestRequestListener.m; path = SalesforceSDKCoreTests/SFNativeRestRequestListener.m; sourceTree = SOURCE_ROOT; }; D3B1519E2E1DA6EB00914EF1 /* AuthCoordinatorFrontdoorBridgeLoginOverride.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthCoordinatorFrontdoorBridgeLoginOverride.swift; sourceTree = ""; }; D3D675CF2D39EF01008E468E /* ChatGenerationsRequestBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatGenerationsRequestBody.swift; sourceTree = ""; }; D3D675D02D39EF01008E468E /* ChatGenerationsResponseBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatGenerationsResponseBody.swift; sourceTree = ""; }; @@ -1084,7 +1078,6 @@ 4F06AF601C49A16A00F70798 /* SalesforceOAuthUnitTests.m */, 4F06AF611C49A16A00F70798 /* SalesforceOAuthUnitTestsCoordinatorDelegate.h */, 4F06AF621C49A16A00F70798 /* SalesforceOAuthUnitTestsCoordinatorDelegate.m */, - CED452E71D808DEE009266EB /* SalesforceRestAPITests.h */, CED452E81D808DEE009266EB /* SalesforceRestAPITests.m */, B7156B8722DE3603003AB69D /* SalesforceSDKCoreTests-Bridging-Header.h */, 4F06AF651C49A16A00F70798 /* SalesforceSDKIdentityTests.m */, @@ -1098,8 +1091,6 @@ 010A9B521CC1A131002AF4D3 /* SFCryptoStreamTestUtils.m */, 4F7EB3F81BFFC87600768720 /* SFEncryptionKeyTests.m */, B7352CA422761D8400DA2CFF /* SFManagedPreferencesTest.m */, - CED452E91D808DEE009266EB /* SFNativeRestRequestListener.h */, - CED452EA1D808DEE009266EB /* SFNativeRestRequestListener.m */, 69CEBC7D22F368CF00F16218 /* SFNetworkTests.m */, 4F3ECD892EBBD150005020A6 /* SFOAuthCoordinatorTests.m */, 23EED8892E2ACD3300646B10 /* SFOAuthCoordinatorTests.swift */, @@ -1845,7 +1836,6 @@ CE4CE3501C0E5252009F6029 /* SFOAuthSessionRefresher+Internal.h in Headers */, B7FB26DA1F78096300FB25A2 /* SFSDKIDPErrorHandler.h in Headers */, CE4CE3451C0E5252009F6029 /* SFOAuthCredentials+Internal.h in Headers */, - CED452ED1D808DEE009266EB /* SFNativeRestRequestListener.h in Headers */, CE4CE3431C0E5252009F6029 /* SFOAuthCoordinator.h in Headers */, B7C5125920C188AE00B39DAA /* SFSDKViewController.h in Headers */, B7895D192345304800765D85 /* SFSDKCompositeResponse.h in Headers */, @@ -1891,7 +1881,6 @@ 697A91A02363C3D800D2836F /* SFSDKPushNotificationDecryption.h in Headers */, B7E8A2A51E7369DB007C0D92 /* SFDefaultUserAccountPersister.h in Headers */, CE4CE3941C0E526A009F6029 /* SFUserAccountManager+Internal.h in Headers */, - CED452EB1D808DEE009266EB /* SalesforceRestAPITests.h in Headers */, 4F06AF731C49A16A00F70798 /* NSURL+SFStringUtilsTests.h in Headers */, 69EA56CB264B1FAA007FE339 /* SFSDKMacDetectUtil.h in Headers */, B7895D0D2345015B00765D85 /* SFSDKCompositeRequest.h in Headers */, @@ -2309,7 +2298,6 @@ 4F06AF8B1C49A18E00F70798 /* SalesforceOAuthUnitTestsCoordinatorDelegate.m in Sources */, 69DFE06B2B969C22000906E4 /* CryptoUtilsTests.swift in Sources */, 237C18732E450B710008015C /* DecryptStreamTests.swift in Sources */, - CED452EF1D808E0A009266EB /* SFNativeRestRequestListener.m in Sources */, 230834862DF8938D00C7CBF7 /* URLSessionTask+RetryPolicyTests.swift in Sources */, 4FDEVINFO001234567890ABCD /* DevInfoViewControllerTests.swift in Sources */, ); diff --git a/libs/SalesforceSDKCore/SalesforceSDKCore/Classes/RestAPI/SFRestAPI.m b/libs/SalesforceSDKCore/SalesforceSDKCore/Classes/RestAPI/SFRestAPI.m index ac128be176..8b619e0238 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCore/Classes/RestAPI/SFRestAPI.m +++ b/libs/SalesforceSDKCore/SalesforceSDKCore/Classes/RestAPI/SFRestAPI.m @@ -205,9 +205,7 @@ - (BOOL)forceTimeoutRequest:(SFRestRequest *)req { SFRestRequest *toCancel = (nil != req ? req : [self.activeRequests anyObject]); if (nil != toCancel) { found = YES; - if (req.failureBlock) { - req.failureBlock(nil, nil, nil); - } + // Cancel the request - this will trigger the failureBlock via the network error callback [toCancel cancel]; } return found; diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.h b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.h deleted file mode 100644 index 546b0d7ca7..0000000000 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - Copyright (c) 2013-present, salesforce.com, inc. All rights reserved. - - Redistribution and use of this software in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of salesforce.com, inc. nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior written - permission of salesforce.com, inc. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY - WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "SFRestRequest.h" -#import - -@interface SFNativeRestRequestListener : SFSDKTestRequestListener - -@property (nonatomic, strong) SFRestRequest *request; -@property (nonatomic, assign) NSTimeInterval sleepDuringLoad; -@property (nonatomic, strong) NSURLResponse *rawResponse; - -- (id)initWithRequest:(SFRestRequest *)request; - -@end diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.m b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.m deleted file mode 100644 index 86360e42f0..0000000000 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFNativeRestRequestListener.m +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (c) 2013-present, salesforce.com, inc. All rights reserved. - - Redistribution and use of this software in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of salesforce.com, inc. nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior written - permission of salesforce.com, inc. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY - WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import "SFNativeRestRequestListener.h" -#import - -int class_uid = 0; - -@interface SFNativeRestRequestListener () -{ - int uid; -} - -@end - -@implementation SFNativeRestRequestListener - -@synthesize request = _request; - -- (id)initWithRequest:(SFRestRequest *)request { - self = [super init]; - if (self) { - self.request = request; - self.request.requestDelegate = self; - self->uid = class_uid++; - [SFLogger log:[self class] level:SFLogLevelDebug format:@"## created listener %d", self->uid]; - } - return self; -} - -- (void)dealloc -{ - self.request.requestDelegate = nil; - self.request = nil; -} - -- (NSString *)serviceTypeDescription -{ - return @"SFRestRequest"; -} - -#pragma mark - SFRestRequestDelegate - -- (void)request:(SFRestRequest *)request didSucceed:(id)dataResponse rawResponse:(NSURLResponse *)rawResponse { - if (self.sleepDuringLoad > 0) { - [NSThread sleepForTimeInterval:self.sleepDuringLoad]; - } - self.dataResponse = dataResponse; - self.returnStatus = kTestRequestStatusDidLoad; - self.rawResponse = rawResponse; -} - -- (void)request:(SFRestRequest *)request didFail:(id)dataResponse rawResponse:(NSURLResponse *)rawResponse error:(NSError *)error { - self.lastError = error; - self.returnStatus = kTestRequestStatusDidFail; - self.rawResponse = rawResponse; - self.dataResponse = dataResponse; -} - -@end diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFSDKURLCacheTests.m b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFSDKURLCacheTests.m index 7a78165d09..04affb2b7f 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFSDKURLCacheTests.m +++ b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SFSDKURLCacheTests.m @@ -27,16 +27,16 @@ #import "SFSDKEncryptedURLCache.h" #import "SFSDKNullURLCache.h" #import "SFRestAPI.h" -#import "SFNativeRestRequestListener.h" #import "SFNetwork.h" #import "SalesforceSDKManager.h" #import #import #import "SFSDKTestCredentialsData.h" +#import "SFSDKTestRequestListener.h" #import "SFRestAPI+Blocks.h" #import "SFRestRequest+Internal.h" #import "SalesforceSDKCore/SalesforceSDKCore-Swift.h" - +#import "SFSDKTestRequestListener.h" @interface SFRestAPI (Testing) @@ -315,23 +315,31 @@ - (void)testUrlWithoutSubdomain { } - (void)sendRequest:(SFRestRequest *)request { - SFSDKTestRequestListener *listener = [[SFSDKTestRequestListener alloc] init]; + __block NSData *responseData = nil; + __block NSError *responseError = nil; + __block NSString *status = kTestRequestStatusWaiting; + + XCTestExpectation *expectation = [self expectationWithDescription:@"REST request completed"]; + SFRestRequestFailBlock failBlock = ^(id response, NSError *error, NSURLResponse *rawResponse) { - listener.lastError = error; - listener.returnStatus = kTestRequestStatusDidFail; + responseError = error; + status = kTestRequestStatusDidFail; + [expectation fulfill]; }; // Use SFRestDataResponseBlock for binary data (images) instead of dictionary response SFRestDataResponseBlock completeBlock = ^(NSData *data, NSURLResponse *rawResponse) { - listener.dataResponse = data; - listener.returnStatus = kTestRequestStatusDidLoad; + responseData = data; + status = kTestRequestStatusDidLoad; + [expectation fulfill]; }; [[SFRestAPI sharedGlobalInstance] sendRequest:request failureBlock:failBlock successBlock:completeBlock]; - [listener waitForCompletion]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + + [self waitForExpectations:@[expectation] timeout:30.0]; + XCTAssertEqualObjects(status, kTestRequestStatusDidLoad, @"request failed"); } @end diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.h b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.h deleted file mode 100644 index d9355f7e3b..0000000000 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - Copyright (c) 2011-present, salesforce.com, inc. All rights reserved. - - Redistribution and use of this software in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions - and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of salesforce.com, inc. nor the names of its contributors may be used to - endorse or promote products derived from this software without specific prior written - permission of salesforce.com, inc. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY - WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -@interface SalesforceRestAPITests : XCTestCase - -@end diff --git a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.m b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.m index 979562e1a7..4a5f0be909 100644 --- a/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.m +++ b/libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.m @@ -22,17 +22,17 @@ WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #import "SFSDKLogoutBlocker.h" -#import "SalesforceRestAPITests.h" #import #import #import "SFRestAPI+Internal.h" #import "SFRestRequest+Internal.h" -#import "SFNativeRestRequestListener.h" #import "SFUserAccount+Internal.h" #import "SFOAuthCredentials+Internal.h" #import "SFUserAccountManager+Internal.h" #import "SFSDKBatchRequest.h" #import "TestSetupUtils.h" +#import + // Constants only used in the tests below #define ENTITY_PREFIX_NAME @"RestClientTestsiOS" #define ACCOUNT @"Account" @@ -55,7 +55,11 @@ #define ATTRIBUTES @"attributes" #define HTTP_STATUS_CODE @"httpStatusCode" - @interface SalesforceRestAPITests () +@interface SalesforceRestAPITests : XCTestCase + +@end + +@interface SalesforceRestAPITests () { SFUserAccount *_currentUser; } @@ -66,44 +70,58 @@ static NSException *authException = nil; - @class exception; +// Simple class to hold REST request response data +@interface SFRestAPITestResponse : NSObject +@property (nonatomic, strong) NSString *returnStatus; +@property (nonatomic, strong) id dataResponse; +@property (nonatomic, strong) NSError *lastError; +@property (nonatomic, strong) NSURLResponse *rawResponse; +@end + +@implementation SFRestAPITestResponse +@end -@interface RestApiAssertionCheckHandler : NSAssertionHandler -@property (assign) BOOL assertionRaised; -@property (strong,nonatomic,readonly) XCTestExpectation *expectation; -- (instancetype)initWithExpectation:(XCTestExpectation *) expectation; +// Helper class for testing delegate-based API +@interface SFRestAPITestDelegate : NSObject +@property (nonatomic, strong) SFRestRequest *request; +@property (nonatomic, strong) XCTestExpectation *expectation; +@property (nonatomic, strong) NSString *returnStatus; +@property (nonatomic, strong) id dataResponse; +@property (nonatomic, strong) NSError *lastError; +@property (nonatomic, strong) NSURLResponse *rawResponse; +- (instancetype)initWithRequest:(SFRestRequest *)request expectation:(XCTestExpectation *)expectation; @end -@implementation RestApiAssertionCheckHandler +@implementation SFRestAPITestDelegate -- (instancetype)initWithExpectation:(XCTestExpectation *)expectation { +- (instancetype)initWithRequest:(SFRestRequest *)request expectation:(XCTestExpectation *)expectation { self = [super init]; if (self) { + _request = request; _expectation = expectation; + _returnStatus = kTestRequestStatusWaiting; } return self; } -- (void)handleFailureInMethod:(SEL)selector - object:(id)object - file:(NSString *)fileName - lineNumber:(NSInteger)line - description:(NSString *)format, ... -{ +- (void)request:(SFRestRequest *)request didSucceed:(id)dataResponse rawResponse:(NSURLResponse *)rawResponse { + self.dataResponse = dataResponse; + self.rawResponse = rawResponse; + self.returnStatus = kTestRequestStatusDidLoad; [self.expectation fulfill]; } -- (void)handleFailureInFunction:(NSString *)functionName - file:(NSString *)fileName - lineNumber:(NSInteger)line - description:(NSString *)format, ... -{ +- (void)request:(SFRestRequest *)request didFail:(id)dataResponse rawResponse:(NSURLResponse *)rawResponse error:(NSError *)error { + self.dataResponse = dataResponse; + self.rawResponse = rawResponse; + self.lastError = error; + self.returnStatus = kTestRequestStatusDidFail; [self.expectation fulfill]; } @end - @implementation SalesforceRestAPITests +@implementation SalesforceRestAPITests + (void)setUp { @@ -149,8 +167,8 @@ - (void)tearDown // Helper method to delete any entities created by one of the test - (void) cleanup { SFRestRequest* searchRequest = [[SFRestAPI sharedInstance] requestForSearch:[NSString stringWithFormat:@"find {%@}", ENTITY_PREFIX_NAME] apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener* listener = [self sendSyncRequest:searchRequest]; - NSArray* results = ((NSDictionary*) listener.dataResponse)[SEARCH_RECORDS]; + SFRestAPITestResponse *response = [self sendSyncRequest:searchRequest]; + NSArray* results = ((NSDictionary*) response.dataResponse)[SEARCH_RECORDS]; NSMutableArray* requests = [NSMutableArray new]; for (NSDictionary* result in results) { NSString *objectType = result[ATTRIBUTES][TYPE]; @@ -174,15 +192,40 @@ - (NSString*) generateRecordName { return [NSString stringWithFormat:@"%@%f", ENTITY_PREFIX_NAME, timecode]; } -- (SFNativeRestRequestListener *)sendSyncRequest:(SFRestRequest *)request{ +// New block-based helper that returns response data +- (SFRestAPITestResponse *)sendSyncRequest:(SFRestRequest *)request { return [self sendSyncRequest:request usingInstance:[SFRestAPI sharedInstance]]; } -- (SFNativeRestRequestListener *)sendSyncRequest:(SFRestRequest *)request usingInstance:(SFRestAPI *) instance { - SFNativeRestRequestListener *listener = [[SFNativeRestRequestListener alloc] initWithRequest:request]; - [instance send:request requestDelegate:listener]; - [listener waitForCompletion]; - return listener; +- (SFRestAPITestResponse *)sendSyncRequest:(SFRestRequest *)request usingInstance:(SFRestAPI *)instance { + __block id responseData = nil; + __block NSError *responseError = nil; + __block NSURLResponse *rawResponseData = nil; + + XCTestExpectation *expectation = [self expectationWithDescription:@"REST request completed"]; + + [instance sendRequest:request + failureBlock:^(id response, NSError *error, NSURLResponse *rawResponse) { + responseData = response; + responseError = error; + rawResponseData = rawResponse; + [expectation fulfill]; + } + successBlock:^(id response, NSURLResponse *rawResponse) { + responseData = response; + rawResponseData = rawResponse; + [expectation fulfill]; + }]; + + [self waitForExpectations:@[expectation] timeout:30.0]; + + SFRestAPITestResponse *result = [[SFRestAPITestResponse alloc] init]; + // Derive status from error: if error exists, request failed; otherwise it succeeded + result.returnStatus = responseError ? kTestRequestStatusDidFail : kTestRequestStatusDidLoad; + result.dataResponse = responseData; + result.lastError = responseError; + result.rawResponse = rawResponseData; + return result; } - (void)changeOauthTokens:(NSString *)accessToken refreshToken:(NSString *)refreshToken { @@ -194,43 +237,45 @@ - (void)changeOauthTokens:(NSString *)accessToken refreshToken:(NSString *)refre // simple: just invoke requestForVersions - (void)testGetVersions { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForVersions]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } -// Using an unauthenticated client to make authenicated requests should result in an assertin failure. +// Using an unauthenticated client to make authenicated requests should result in an assertion failure. - (void)testAssertionForUnauthenticatedClient { XCTestExpectation *assertExpectation = [[XCTestExpectation alloc] initWithDescription:@"Assert Expectation"]; - RestApiAssertionCheckHandler *assertionHandler = [[RestApiAssertionCheckHandler alloc] initWithExpectation:assertExpectation]; - [[[NSThread currentThread] threadDictionary] setValue:assertionHandler - forKey:NSAssertionHandlerKey]; + SFRestRequest* request = [[SFRestAPI sharedGlobalInstance] requestForResources:kSFRestDefaultAPIVersion]; @try { [[SFRestAPI sharedGlobalInstance] sendRequest:request failureBlock:^(id response, NSError *e, NSURLResponse *rawResponse) { - + // Should not reach here } successBlock:^(id response, NSURLResponse *rawResponse) { - + // Should not reach here }]; + // If we get here without an exception, the test should fail + XCTFail(@"Expected assertion to be raised for unauthenticated client"); } - @catch(NSException *ignored) { - + @catch(NSException *exception) { + // Assertion was raised as expected + [assertExpectation fulfill]; } - [self waitForExpectations:@[assertExpectation] timeout:30]; - [[[NSThread currentThread] threadDictionary] setValue:nil - forKey:NSAssertionHandlerKey]; + [self waitForExpectations:@[assertExpectation] timeout:1.0]; self.dataCleanupRequired = NO; - } - (void)testGetVersion_SetDelegate { + // Test the delegate-based API (not the block-based API) SFRestRequest* request = [[SFRestAPI sharedInstance] requestForVersions]; - SFNativeRestRequestListener *listener = [[SFNativeRestRequestListener alloc] initWithRequest:request]; + XCTestExpectation *expectation = [self expectationWithDescription:@"Request with delegate"]; + + SFRestAPITestDelegate *delegate = [[SFRestAPITestDelegate alloc] initWithRequest:request expectation:expectation]; - //exercises overwriting the delegate at send time - [[SFRestAPI sharedInstance] send:request requestDelegate:listener]; - [listener waitForCompletion]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + // Use the delegate-based send method + [[SFRestAPI sharedInstance] send:request requestDelegate:delegate]; + + [self waitForExpectations:@[expectation] timeout:30.0]; + XCTAssertEqualObjects(delegate.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -239,8 +284,8 @@ - (void)testFullRequestPath { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForResources:kSFRestDefaultAPIVersion]; request.path = [NSString stringWithFormat:@"%@%@", kSFDefaultRestEndpoint, request.path]; [SFLogger log:[self class] level:SFLogLevelDebug format:@"request.path: %@", request.path]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -248,25 +293,25 @@ - (void)testFullRequestPath { - (void)testUserDefinedEndpoint { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForResources:kSFRestDefaultAPIVersion]; [request setEndpoint:@"/my/custom/endpoint"]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForUserInfo - (void)testGetUserInfo { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForUserInfo]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForSingleAccess - (void)testGetSingleAccess { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForSingleAccess:@"abc/def"]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - [self checkKeysInJsonObject:listener.dataResponse expectedKeys:@[@"frontdoor_uri"]]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + [self checkKeysInJsonObject:response.dataResponse expectedKeys:@[@"frontdoor_uri"]]; self.dataCleanupRequired = NO; } @@ -274,35 +319,47 @@ - (void)testGetSingleAccess { // simple: just invoke requestForLimits - (void)testGetLimits { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLimits:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForResources - (void)testGetResources { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForResources:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForDescribeGlobal - (void)testGetDescribeGlobal { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForDescribeGlobal:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForDescribeGlobal, force a cancel & timeout - (void)testGetDescribeGlobal_Cancel { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForDescribeGlobal:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [[SFNativeRestRequestListener alloc] initWithRequest:request]; - [[SFRestAPI sharedInstance] send:request requestDelegate:listener]; + + __block NSString *status = kTestRequestStatusWaiting; + XCTestExpectation *expectation = [self expectationWithDescription:@"Request cancelled"]; + + [[SFRestAPI sharedInstance] sendRequest:request + failureBlock:^(id response, NSError *error, NSURLResponse *rawResponse) { + status = kTestRequestStatusDidFail; + [expectation fulfill]; + } + successBlock:^(id response, NSURLResponse *rawResponse) { + status = kTestRequestStatusDidLoad; + [expectation fulfill]; + }]; + [[SFRestAPI sharedInstance] cancelAllRequests]; - [listener waitForCompletion]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have been cancelled"); + [self waitForExpectations:@[expectation] timeout:30.0]; + XCTAssertEqualObjects(status, kTestRequestStatusDidFail, @"request should have been cancelled"); self.dataCleanupRequired = NO; } @@ -310,105 +367,117 @@ - (void)testGetDescribeGlobal_Cancel { // simple: just invoke requestForDescribeGlobal, force a timeout - (void)testGetDescribeGlobal_Timeout { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForDescribeGlobal:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [[SFNativeRestRequestListener alloc] initWithRequest:request]; - [[SFRestAPI sharedInstance] send:request requestDelegate:listener]; + + __block NSString *status = kTestRequestStatusWaiting; + XCTestExpectation *expectation = [self expectationWithDescription:@"Request timeout"]; + + [[SFRestAPI sharedInstance] sendRequest:request + failureBlock:^(id response, NSError *error, NSURLResponse *rawResponse) { + status = kTestRequestStatusDidFail; + [expectation fulfill]; + } + successBlock:^(id response, NSURLResponse *rawResponse) { + status = kTestRequestStatusDidLoad; + [expectation fulfill]; + }]; + BOOL found = [[SFRestAPI sharedInstance] forceTimeoutRequest:request]; XCTAssertTrue(found , @"Could not find request to force a timeout"); - [listener waitForCompletion]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have timed out"); + [self waitForExpectations:@[expectation] timeout:30.0]; + XCTAssertEqualObjects(status, kTestRequestStatusDidFail, @"request should have timed out"); self.dataCleanupRequired = NO; } // simple: just invoke requestForMetadataWithObjectType:@"Contact" - (void)testGetMetadataWithObjectType { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForMetadataWithObjectType:CONTACT apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForDescribeWithObjectType:@"Contact" - (void)testGetDescribeWithObjectType { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForDescribeWithObjectType:CONTACT apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForLayoutWithObjectType:@"Contact" without layoutType. - (void)testGetLayoutWithObjectAPINameWithoutFormFactor { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:nil mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForLayoutWithObjectType:@"Contact" with formFactor:@"Medium". - (void)testGetLayoutWithObjectAPINameWithFormFactor { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:@"Medium" layoutType:nil mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // simple: just invoke requestForLayoutWithObjectType:@"Contact" without layoutType. - (void)testGetLayoutWithObjectAPINameWithoutLayoutType { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:nil mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForLayoutWithObjectType:@"Contact" with layoutType:@"Compact". - (void)testGetLayoutWithObjectAPINameWithLayoutType { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:@"Compact" mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // simple: just invoke requestForLayoutWithObjectType:@"Contact" without mode. - (void)testGetLayoutWithObjectAPINameWithoutMode { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:nil mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForLayoutWithObjectType:@"Contact" with mode:@"Edit". - (void)testGetLayoutWithObjectAPINameWithMode { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:nil mode:@"Edit" recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // simple: just invoke requestForLayoutWithObjectType:@"Contact" without recordTypeId. - (void)testGetLayoutWithObjectAPINameWithoutRecordTypeId { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForLayoutWithObjectAPIName:CONTACT formFactor:nil layoutType:nil mode:nil recordTypeId:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForSearchScopeAndOrder - (void)testGetSearchScopeAndOrder { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForSearchScopeAndOrder:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // simple: just invoke requestForSearchResultLayout:@"Account" - (void)testGetSearchResultLayout { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForSearchResultLayout:ACCOUNT apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } // attempt to create a Contact with none of the required fields (should fail) - (void)testCreateBogusContact { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); } // - create object (requestForCreateWithObjectType) @@ -429,84 +498,84 @@ - (void)testCreateQuerySearchDelete { LAST_NAME: lastName}; SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // make sure we got an id - NSString *contactId = ((NSDictionary *)listener.dataResponse)[LID]; + NSString *contactId = ((NSDictionary *)response.dataResponse)[LID]; XCTAssertNotNil(contactId, @"id not present"); @try { // try to retrieve object with id request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:contactId fieldList:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqualObjects(lastName, ((NSDictionary *)listener.dataResponse)[LAST_NAME], @"invalid last name"); - XCTAssertEqualObjects(@"John", ((NSDictionary *)listener.dataResponse)[FIRST_NAME], @"invalid first name"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(lastName, ((NSDictionary *)response.dataResponse)[LAST_NAME], @"invalid last name"); + XCTAssertEqualObjects(@"John", ((NSDictionary *)response.dataResponse)[FIRST_NAME], @"invalid first name"); // try to retrieve again, passing a list of fields request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:contactId fieldList:@"LastName, FirstName" apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqualObjects(lastName, ((NSDictionary *)listener.dataResponse)[LAST_NAME], @"invalid last name"); - XCTAssertEqualObjects(@"John", ((NSDictionary *)listener.dataResponse)[FIRST_NAME], @"invalid first name"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(lastName, ((NSDictionary *)response.dataResponse)[LAST_NAME], @"invalid last name"); + XCTAssertEqualObjects(@"John", ((NSDictionary *)response.dataResponse)[FIRST_NAME], @"invalid first name"); // Raw data will not be converted to JSON if that's what's returned. request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:contactId fieldList:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertTrue([listener.dataResponse isKindOfClass:[NSDictionary class]], @"Should be parsed JSON for JSON response."); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertTrue([response.dataResponse isKindOfClass:[NSDictionary class]], @"Should be parsed JSON for JSON response."); // Raw data will be converted to JSON if that's what's returned, when JSON parsing is successful. request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:contactId fieldList:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertTrue([listener.dataResponse isKindOfClass:[NSDictionary class]], @"Should be parsed JSON for JSON response."); - NSDictionary *responseAsJson = listener.dataResponse; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertTrue([response.dataResponse isKindOfClass:[NSDictionary class]], @"Should be parsed JSON for JSON response."); + NSDictionary *responseAsJson = response.dataResponse; XCTAssertEqualObjects(lastName, responseAsJson[LAST_NAME], @"invalid last name"); XCTAssertEqualObjects(@"John", responseAsJson[FIRST_NAME], @"invalid first name"); // now query object request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 1, @"expected just one query result"); // now search object // Record is not available for search right away - so waiting a bit to prevent the test from flapping [NSThread sleepForTimeInterval:5.0f]; request = [[SFRestAPI sharedInstance] requestForSearch:[NSString stringWithFormat:@"Find {%@}", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - records = ((NSDictionary *)listener.dataResponse)[SEARCH_RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + records = ((NSDictionary *)response.dataResponse)[SEARCH_RECORDS]; } @finally { // now delete object request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:CONTACT objectId:contactId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // well, let's do another query just to be sure request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 0, @"expected no result"); // check the deleted object is here request = [[SFRestAPI sharedInstance] requestForQueryAll:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray* records2 = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray* records2 = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records2 count], 1, @"expected just one query result"); // now search object request = [[SFRestAPI sharedInstance] requestForSearch:[NSString stringWithFormat:@"Find {%@}", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - records = ((NSDictionary *)listener.dataResponse)[SEARCH_RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + records = ((NSDictionary *)response.dataResponse)[SEARCH_RECORDS]; XCTAssertEqual((int)[records count], 0, @"expected no result"); } @@ -515,8 +584,8 @@ - (void)testCreateQuerySearchDelete { // Make sure it succeeds -(void) testEscapingWithSOQLQuery { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForQuery:@"Select Name from Account where LastModifiedDate > 2017-03-21T12:11:06.000+0000" apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // Runs a SOQL query which specifies a batch size @@ -524,9 +593,9 @@ -(void) testEscapingWithSOQLQuery { -(void) testSOQLQueryWithBatchSize { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForQuery:@"Select Name from Account" apiVersion:kSFRestDefaultAPIVersion batchSize:250]; XCTAssertEqualObjects(@"batchSize=250", request.customHeaders[@"Sforce-Query-Options"]); - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // - create object (requestForCreateWithObjectType) @@ -545,54 +614,54 @@ - (void)testCreateUpdateQuerySearchDelete { LAST_NAME: lastName}; SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // make sure we got an id - NSString *contactId = ((NSDictionary *)listener.dataResponse)[LID]; + NSString *contactId = ((NSDictionary *)response.dataResponse)[LID]; XCTAssertNotNil(contactId, @"id not present"); [SFLogger log:[self class] level:SFLogLevelDebug format:@"## contact created with id: %@", contactId]; @try { // now query object request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 1, @"expected just one query result"); // modify object NSDictionary *updatedFields = @{LAST_NAME: updatedLastName}; request = [[SFRestAPI sharedInstance] requestForUpdateWithObjectType:CONTACT objectId:contactId fields:updatedFields apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // query updated object request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", updatedLastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 1, @"expected just one query result"); // let's make sure the old object is not there anymore request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", lastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 0, @"expected no result"); } @finally { // now delete object request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:CONTACT objectId:contactId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } // well, let's do another query just to be sure request = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, FirstName from Contact where LastName='%@'", updatedLastName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 0, @"expected no result"); } @@ -612,17 +681,17 @@ - (void)testUpdateWithIfUnmodifiedSince { fields:fields apiVersion:kSFRestDefaultAPIVersion ]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:createRequest]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); - NSString *accountId = ((NSDictionary *) listener.dataResponse)[LID]; + SFRestAPITestResponse *response = [self sendSyncRequest:createRequest]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); + NSString *accountId = ((NSDictionary *) response.dataResponse)[LID]; // Retrieve to get last modified date - expect updated name SFRestRequest *firstRetrieveRequest = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:ACCOUNT objectId:accountId fieldList:@"Name,LastModifiedDate" apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:firstRetrieveRequest]; - NSString *retrievedName = ((NSDictionary *) listener.dataResponse)[NAME]; + response = [self sendSyncRequest:firstRetrieveRequest]; + NSString *retrievedName = ((NSDictionary *) response.dataResponse)[NAME]; XCTAssertEqualObjects(retrievedName, accountName, "wrong name retrieved"); - NSString *lastModifiedDateStr = ((NSDictionary *) listener.dataResponse)[@"LastModifiedDate"]; + NSString *lastModifiedDateStr = ((NSDictionary *) response.dataResponse)[@"LastModifiedDate"]; NSDateFormatter *httpDateFormatter = [NSDateFormatter new]; httpDateFormatter.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; NSDate *createdDate = [httpDateFormatter dateFromString:lastModifiedDateStr]; @@ -639,14 +708,14 @@ - (void)testUpdateWithIfUnmodifiedSince { fields:fieldsUpdated ifUnmodifiedSinceDate:createdDate apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:updateRequest]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); + response = [self sendSyncRequest:updateRequest]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); // Retrieve - expect updated name SFRestRequest *secondRetrieveRequest = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:ACCOUNT objectId:accountId fieldList:NAME apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:secondRetrieveRequest]; - NSString *secondRetrievedName = ((NSDictionary *) listener.dataResponse)[NAME]; + response = [self sendSyncRequest:secondRetrieveRequest]; + NSString *secondRetrievedName = ((NSDictionary *) response.dataResponse)[NAME]; XCTAssertEqualObjects(secondRetrievedName, accountNameUpdated, "wrong name retrieved"); // Second update with if-unmodified-since with created date - should not update @@ -658,15 +727,15 @@ - (void)testUpdateWithIfUnmodifiedSince { fields:blockedFieldsUpdated ifUnmodifiedSinceDate:pastDate apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:blockedUpdateRequest]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should failed"); - XCTAssertEqual(listener.lastError.code, 412, @"request should have returned a 412"); + response = [self sendSyncRequest:blockedUpdateRequest]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request should failed"); + XCTAssertEqual(response.lastError.code, 412, @"request should have returned a 412"); // Retrieve - expect name from first update SFRestRequest *thirdRetrieveRequest = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:ACCOUNT objectId:accountId fieldList:NAME apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:thirdRetrieveRequest]; - NSString *thirdRetrievedName = ((NSDictionary *) listener.dataResponse)[NAME]; + response = [self sendSyncRequest:thirdRetrieveRequest]; + NSString *thirdRetrievedName = ((NSDictionary *) response.dataResponse)[NAME]; XCTAssertEqualObjects(thirdRetrievedName, accountNameUpdated, "wrong name retrieved"); } @@ -687,9 +756,9 @@ - (void)testUpsertWithBogusExternalIdField { fields:fields apiVersion:kSFRestDefaultAPIVersion ]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); - XCTAssertEqual(404, listener.lastError.code, @"error code should have been 404"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); + XCTAssertEqual(404, response.lastError.code, @"error code should have been 404"); } // Testing upsert calls to the server. @@ -708,15 +777,15 @@ - (void)testUpsert { apiVersion:kSFRestDefaultAPIVersion ]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:firstUpsertRequest]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); - NSString *accountId = ((NSDictionary *) listener.dataResponse)[LID]; + SFRestAPITestResponse *response = [self sendSyncRequest:firstUpsertRequest]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); + NSString *accountId = ((NSDictionary *) response.dataResponse)[LID]; // Retrieve - expect updated name SFRestRequest *firstRetrieveRequest = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:ACCOUNT objectId:accountId fieldList:NAME apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:firstRetrieveRequest]; - NSString *retrievedName = ((NSDictionary *) listener.dataResponse)[NAME]; + response = [self sendSyncRequest:firstRetrieveRequest]; + NSString *retrievedName = ((NSDictionary *) response.dataResponse)[NAME]; XCTAssertEqualObjects(retrievedName, accountName, "wrong name retrieved"); // Update with upsert call @@ -730,36 +799,36 @@ - (void)testUpsert { fields:fieldsUpdated apiVersion:kSFRestDefaultAPIVersion ]; - listener = [self sendSyncRequest:secondUpsertRequest]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); + response = [self sendSyncRequest:secondUpsertRequest]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request should have succeeded"); // Retrieve - expect updated name SFRestRequest *secondRetrieveRequest = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:ACCOUNT objectId:accountId fieldList:NAME apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:secondRetrieveRequest]; - NSString *secondRetrievedName = ((NSDictionary *) listener.dataResponse)[NAME]; + response = [self sendSyncRequest:secondRetrieveRequest]; + NSString *secondRetrievedName = ((NSDictionary *) response.dataResponse)[NAME]; XCTAssertEqualObjects(secondRetrievedName, accountNameUpdated, "wrong name retrieved"); } // issue invalid SOQL and test for errors - (void)testSOQLError { SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:(NSString* _Nonnull)nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail , @"request was supposed to fail"); - XCTAssertEqual(listener.lastError.code, 400, @"invalid code"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail , @"request was supposed to fail"); + XCTAssertEqual(response.lastError.code, 400, @"invalid code"); self.dataCleanupRequired = NO; } // issue invalid retrieve and test for errors - (void)testRetrieveError { SFRestRequest *request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:@"bogus_contact_id" fieldList:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); - XCTAssertEqual(listener.lastError.code, 404, @"invalid code"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); + XCTAssertEqual(response.lastError.code, 404, @"invalid code"); request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:CONTACT objectId:@"bogus_contact_id" fieldList:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); - XCTAssertEqual(listener.lastError.code, 404, @"invalid code"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); + XCTAssertEqual(response.lastError.code, 404, @"invalid code"); self.dataCleanupRequired = NO; } @@ -801,21 +870,21 @@ -(void) testBatchRequest { requestForQuery:[NSString stringWithFormat:@"select Id from Contact where Name = '%@'", contactName] apiVersion:kSFRestDefaultAPIVersion ]; - // Build batch request - SFRestRequest *batchRequest = [[SFRestAPI sharedInstance] - batchRequest:@[createAccountRequest, createContactRequest, queryForAccount, queryForContact] - haltOnError:YES - apiVersion:kSFRestDefaultAPIVersion - ]; + // Build batch request + SFRestRequest *batchRequest = [[SFRestAPI sharedInstance] + batchRequest:@[createAccountRequest, createContactRequest, queryForAccount, queryForContact] + haltOnError:YES + apiVersion:kSFRestDefaultAPIVersion + ]; - // Send request - SFNativeRestRequestListener *listener = [self sendSyncRequest:batchRequest]; + // Send request + SFRestAPITestResponse *response = [self sendSyncRequest:batchRequest]; - // Checking response - NSDictionary * response = listener.dataResponse; - XCTAssertEqual(response[HAS_ERRORS], @NO, @"No errors expected"); - NSArray* results = response[RESULTS]; - XCTAssertEqual(results.count, 4, @"Wrong number of results"); + // Checking response + NSDictionary *dataResponse = response.dataResponse; + XCTAssertEqual(dataResponse[HAS_ERRORS], @NO, @"No errors expected"); + NSArray* results = dataResponse[RESULTS]; + XCTAssertEqual(results.count, 4, @"Wrong number of results"); XCTAssertEqual([results[0][STATUS_CODE] intValue], 201, @"Wrong status for first request"); XCTAssertEqual([results[1][STATUS_CODE] intValue], 201, @"Wrong status for second request"); XCTAssertEqual([results[2][STATUS_CODE] intValue], 200, @"Wrong status for third request"); @@ -872,17 +941,17 @@ -(void)testBatchWithBatchRequest { ]; [batchRequestBuiler addRequest:queryForContact]; - // Build batch request - SFSDKBatchRequest *batchRequest = [batchRequestBuiler buildBatchRequest:kSFRestDefaultAPIVersion]; - - // Send request - SFNativeRestRequestListener *listener = [self sendSyncRequest:batchRequest]; + // Build batch request + SFSDKBatchRequest *batchRequest = [batchRequestBuiler buildBatchRequest:kSFRestDefaultAPIVersion]; + + // Send request + SFRestAPITestResponse *response = [self sendSyncRequest:batchRequest]; - // Checking response - NSDictionary * response = listener.dataResponse; - XCTAssertEqual(response[HAS_ERRORS], @NO, @"No errors expected"); - NSArray* results = response[RESULTS]; - XCTAssertEqual(results.count, 4, @"Wrong number of results"); + // Checking response + NSDictionary *dataResponse = response.dataResponse; + XCTAssertEqual(dataResponse[HAS_ERRORS], @NO, @"No errors expected"); + NSArray* results = dataResponse[RESULTS]; + XCTAssertEqual(results.count, 4, @"Wrong number of results"); XCTAssertEqual([results[0][STATUS_CODE] intValue], 201, @"Wrong status for first request"); XCTAssertEqual([results[1][STATUS_CODE] intValue], 201, @"Wrong status for second request"); XCTAssertEqual([results[2][STATUS_CODE] intValue], 200, @"Wrong status for third request"); @@ -1007,21 +1076,21 @@ - (void) testCompositeRequest { requestForQuery:[NSString stringWithFormat:@"select Id, AccountId from Contact where LastName = '%@'", contactName] apiVersion:kSFRestDefaultAPIVersion ]; - // Build composite request - SFRestRequest *batchRequest = [[SFRestAPI sharedInstance] - compositeRequest:@[createAccountRequest, createContactRequest, queryForContact] - refIds:@[@"refAccount", @"refContact", @"refQuery"] - allOrNone:YES - apiVersion:kSFRestDefaultAPIVersion - ]; + // Build composite request + SFRestRequest *batchRequest = [[SFRestAPI sharedInstance] + compositeRequest:@[createAccountRequest, createContactRequest, queryForContact] + refIds:@[@"refAccount", @"refContact", @"refQuery"] + allOrNone:YES + apiVersion:kSFRestDefaultAPIVersion + ]; - // Send request - SFNativeRestRequestListener *listener = [self sendSyncRequest:batchRequest]; + // Send request + SFRestAPITestResponse *response = [self sendSyncRequest:batchRequest]; - // Checking response - NSDictionary * response = listener.dataResponse; - NSArray* results = response[COMPOSITE_RESPONSE]; - XCTAssertEqual(3, results.count, "Wrong number of results"); + // Checking response + NSDictionary *dataResponse = response.dataResponse; + NSArray* results = dataResponse[COMPOSITE_RESPONSE]; + XCTAssertEqual(3, results.count, "Wrong number of results"); XCTAssertEqual([results[0][HTTP_STATUS_CODE] intValue], 201, @"Wrong status for first request"); XCTAssertEqual([results[1][HTTP_STATUS_CODE] intValue], 201, @"Wrong status for second request"); XCTAssertEqual([results[2][HTTP_STATUS_CODE] intValue], 200, @"Wrong status for third request"); @@ -1074,11 +1143,11 @@ - (void) testRequestWithCompositeRequest { // Build composite request // Send request - SFNativeRestRequestListener *listener = [self sendSyncRequest: [requestBuilder buildCompositeRequest:[SFRestAPI sharedInstance].apiVersion]]; + SFRestAPITestResponse *response = [self sendSyncRequest: [requestBuilder buildCompositeRequest:[SFRestAPI sharedInstance].apiVersion]]; // Checking response - NSDictionary * response = listener.dataResponse; - NSArray* results = response[COMPOSITE_RESPONSE]; + NSDictionary *dataResponse = response.dataResponse; + NSArray* results = dataResponse[COMPOSITE_RESPONSE]; XCTAssertEqual(3, results.count, "Wrong number of results"); XCTAssertEqual([results[0][HTTP_STATUS_CODE] intValue], 201, @"Wrong status for first request"); XCTAssertEqual([results[1][HTTP_STATUS_CODE] intValue], 201, @"Wrong status for second request"); @@ -1200,12 +1269,12 @@ - (void) testSObjectTreeRequest { SFRestRequest *treeRequest = [[SFRestAPI sharedInstance] requestForSObjectTree:ACCOUNT objectTrees:@[accountTree] apiVersion:kSFRestDefaultAPIVersion]; // Send request - SFNativeRestRequestListener *listener = [self sendSyncRequest:treeRequest]; + SFRestAPITestResponse *response = [self sendSyncRequest:treeRequest]; // Checking response - NSDictionary * response = listener.dataResponse; - XCTAssertEqual(response[HAS_ERRORS], @NO, @"No errors expected"); - NSArray* results = response[RESULTS]; + NSDictionary *dataResponse = response.dataResponse; + XCTAssertEqual(dataResponse[HAS_ERRORS], @NO, @"No errors expected"); + NSArray* results = dataResponse[RESULTS]; XCTAssertEqual(3, results.count, "Wrong number of results"); NSString* accountId = results[0][LID]; NSString* contactId = results[1][LID]; @@ -1213,8 +1282,8 @@ - (void) testSObjectTreeRequest { // Running query that should match first contact and its parent SFRestRequest *queryRequest = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, AccountId from Contact where LastName = '%@'", contactName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:queryRequest]; - NSDictionary * queryResponse = listener.dataResponse; + response = [self sendSyncRequest:queryRequest]; + NSDictionary * queryResponse = response.dataResponse; NSArray* queryRecords = queryResponse[RECORDS]; XCTAssertEqual(1, queryRecords.count, "Wrong number of results"); XCTAssertEqualObjects(accountId, queryRecords[0][ACCOUNT_ID], "Account id not returned by query"); @@ -1222,8 +1291,8 @@ - (void) testSObjectTreeRequest { // Running other query that should match other contact and its parent SFRestRequest *otherQueryRequest = [[SFRestAPI sharedInstance] requestForQuery:[NSString stringWithFormat:@"select Id, AccountId from Contact where LastName = '%@'", otherContactName] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:otherQueryRequest]; - NSDictionary * otherQueryResponse = listener.dataResponse; + response = [self sendSyncRequest:otherQueryRequest]; + NSDictionary * otherQueryResponse = response.dataResponse; NSArray* otherQueryRecords = otherQueryResponse[RECORDS]; XCTAssertEqual(1, otherQueryRecords.count, "Wrong number of results"); XCTAssertEqualObjects(accountId, otherQueryRecords[0][ACCOUNT_ID], "Account id not returned by query"); @@ -1233,21 +1302,21 @@ - (void) testSObjectTreeRequest { // Test for priming records request - (void) testGetPrimingRecords { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForPrimingRecords:nil changedAfterTimestamp:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - NSDictionary* response = listener.dataResponse; - XCTAssertNotNil(response[@"primingRecords"]); - XCTAssertNotNil(response[@"relayToken"]); - XCTAssertNotNil(response[@"ruleErrors"]); - XCTAssertNotNil(response[@"stats"]); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + NSDictionary* dataResponse = response.dataResponse; + XCTAssertNotNil(dataResponse[@"primingRecords"]); + XCTAssertNotNil(dataResponse[@"relayToken"]); + XCTAssertNotNil(dataResponse[@"ruleErrors"]); + XCTAssertNotNil(dataResponse[@"stats"]); } // Test parsing priming records response going to server - (void) testParsePrimingRecordsResponseFromServer { SFRestRequest* request = [[SFRestAPI sharedInstance] requestForPrimingRecords:nil changedAfterTimestamp:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - NSDictionary* response = listener.dataResponse; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + NSDictionary* dataResponse = response.dataResponse; @try { - (void)[[SFSDKPrimingRecordsResponse alloc] initWith:response]; + (void)[[SFSDKPrimingRecordsResponse alloc] initWith:dataResponse]; } @catch (NSException *exception) { XCTFail(@"Unexpected error %@", exception); @@ -1309,10 +1378,10 @@ -(void) testCollectionCreate { // Doing a collection create SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedCreateResponse.subResponses.count, 3); @@ -1340,18 +1409,18 @@ - (void) testCollectionRetrieve { // Doing a collection create SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; NSString* firstAccountId = parsedCreateResponse.subResponses[0].objectId; NSString* contactId = parsedCreateResponse.subResponses[1].objectId; NSString* secondAccountId = parsedCreateResponse.subResponses[2].objectId; // Doing a collection retrieve for the accounts SFRestRequest* accountsRetrieveRequest = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Account" objectIds:@[firstAccountId, secondAccountId] fieldList:@[@"Id", @"Name"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:accountsRetrieveRequest]; - NSArray* accountsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:accountsRetrieveRequest]; + NSArray* accountsRetrieved = response.dataResponse; // Checking response XCTAssertEqual(accountsRetrieved.count, 2); @@ -1360,8 +1429,8 @@ - (void) testCollectionRetrieve { // Doing a collection retrieve for the contact SFRestRequest* contactsRetrievedRequest = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Contact" objectIds:@[contactId] fieldList:@[@"Id", @"LastName"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:contactsRetrievedRequest]; - NSArray* contactsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:contactsRetrievedRequest]; + NSArray* contactsRetrieved = response.dataResponse; // Checking response XCTAssertEqual(contactsRetrieved.count, 1); @@ -1379,10 +1448,10 @@ - (void) testCollectionUpsertNewRecords { // Doing a collection upsert SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionUpsert:YES objectType:@"Account" externalIdField:@"Id" records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedUpsertResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedUpsertResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedUpsertResponse.subResponses.count, 2); @@ -1406,10 +1475,10 @@ - (void) testCollectionUpsertExistingRecords { // Doing a collection create SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; NSString* firstAccountId = parsedCreateResponse.subResponses[0].objectId; NSString* secondAccountId = parsedCreateResponse.subResponses[1].objectId; @@ -1422,10 +1491,10 @@ - (void) testCollectionUpsertExistingRecords { ]]; request = [[SFRestAPI sharedInstance] requestForCollectionUpsert:YES objectType:@"Account" externalIdField:@"Id" records:updatedAccounts apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; + response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedUpsertResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedUpsertResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedUpsertResponse.subResponses.count, 2); @@ -1438,8 +1507,8 @@ - (void) testCollectionUpsertExistingRecords { // Checking accounts on server to make sure they were updated request = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Account" objectIds:@[firstAccountId, secondAccountId] fieldList:@[@"Id", @"Name"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - NSArray* accountsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:request]; + NSArray* accountsRetrieved = response.dataResponse; // Checking response XCTAssertEqual(accountsRetrieved.count, 2); @@ -1460,10 +1529,10 @@ - (void) testCollectionUpdate { // Doing a collection create SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; NSString* firstAccountId = parsedCreateResponse.subResponses[0].objectId; NSString* contactId = parsedCreateResponse.subResponses[1].objectId; NSString* secondAccountId = parsedCreateResponse.subResponses[2].objectId; @@ -1477,10 +1546,10 @@ - (void) testCollectionUpdate { ]]; request = [[SFRestAPI sharedInstance] requestForCollectionUpdate:YES records:updatedRecords apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; + response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedUpdateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedUpdateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedUpdateResponse.subResponses.count, 2); @@ -1493,16 +1562,16 @@ - (void) testCollectionUpdate { // Checking accounts on server request = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Account" objectIds:@[firstAccountId, secondAccountId] fieldList:@[@"Id", @"Name"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - NSArray* accountdsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:request]; + NSArray* accountdsRetrieved = response.dataResponse; XCTAssertEqual(accountdsRetrieved.count, 2); XCTAssertEqualObjects(accountdsRetrieved[0][@"Name"], firstAccountNameUpdated); XCTAssertEqualObjects(accountdsRetrieved[1][@"Name"], secondAccountName); // Checking contact on server request = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Contact" objectIds:@[contactId] fieldList:@[@"Id", @"LastName"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - NSArray* contactsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:request]; + NSArray* contactsRetrieved = response.dataResponse; XCTAssertEqual(contactsRetrieved.count, 1); XCTAssertEqualObjects(contactsRetrieved[0][@"LastName"], contactNameUpdated); } @@ -1521,20 +1590,20 @@ - (void) testCollectionDelete { // Doing a collection create SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; NSString* firstAccountId = parsedCreateResponse.subResponses[0].objectId; NSString* contactId = parsedCreateResponse.subResponses[1].objectId; NSString* secondAccountId = parsedCreateResponse.subResponses[2].objectId; // Doing a collection delete for one account and the contact request = [[SFRestAPI sharedInstance] requestForCollectionDelete:YES objectIds:@[firstAccountId, contactId] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; + response = [self sendSyncRequest:request]; // Parsing response - SFSDKCollectionResponse* parsedDeleteResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFSDKCollectionResponse* parsedDeleteResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedDeleteResponse.subResponses.count, 2); @@ -1547,26 +1616,26 @@ - (void) testCollectionDelete { // Making sure deleted account is gone using retrieve request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:@"Account" objectId:firstAccountId fieldList:@"Id,Name" apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqual(404, listener.lastError.code); + response = [self sendSyncRequest:request]; + XCTAssertEqual(404, response.lastError.code); // Making sure deleted account is gone using collection retrieve request = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Account" objectIds:@[firstAccountId, secondAccountId] fieldList:@[@"Id", @"Name"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - NSArray* accountdsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:request]; + NSArray* accountdsRetrieved = response.dataResponse; XCTAssertEqual(accountdsRetrieved.count, 2); XCTAssertEqualObjects(accountdsRetrieved[0], [NSNull null]); XCTAssertEqualObjects(accountdsRetrieved[1][@"Name"], secondAccountName); // Making sure deleted contact is gone using retrieve request = [[SFRestAPI sharedInstance] requestForRetrieveWithObjectType:@"Contact" objectId:contactId fieldList:@"Id,LastName" apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqual(404, listener.lastError.code); + response = [self sendSyncRequest:request]; + XCTAssertEqual(404, response.lastError.code); // Making sure deleted account is gone using collection retrieve request = [[SFRestAPI sharedInstance] requestForCollectionRetrieve:@"Contact" objectIds:@[contactId] fieldList:@[@"Id", @"LastName"] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - NSArray* contactsRetrieved = listener.dataResponse; + response = [self sendSyncRequest:request]; + NSArray* contactsRetrieved = response.dataResponse; XCTAssertEqual(contactsRetrieved.count, 1); XCTAssertEqualObjects(contactsRetrieved[0], [NSNull null]); } @@ -1581,8 +1650,8 @@ - (void) testCollectionCreateWithBadRecordAndAllOrNoneFalse { ]]; SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:NO records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedCreateResponse.subResponses.count, 2); @@ -1605,8 +1674,8 @@ - (void) testCollectionCreateWithBadRecordAndAllOrNoneTrue { ]]; SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCollectionCreate:YES records:records apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:listener.dataResponse]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + SFSDKCollectionResponse* parsedCreateResponse = [[SFSDKCollectionResponse alloc] initWith:response.dataResponse]; // Checking response XCTAssertEqual(parsedCreateResponse.subResponses.count, 2); @@ -1642,12 +1711,12 @@ - (void) testCollectionCreateWithBadRecordAndAllOrNoneTrue { - (void)testOwnedFilesList { // with nil for userId SFRestRequest* request = [[SFRestAPI sharedInstance] requestForOwnedFilesList:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // with actual user id request = [[SFRestAPI sharedInstance] requestForOwnedFilesList:_currentUser.credentials.userId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -1698,12 +1767,12 @@ - (void)testOwnedFilesListWithCommunityWithHeaders { - (void)testFilesInUsersGroups { // with nil for userId SFRestRequest* request = [[SFRestAPI sharedInstance] requestForFilesInUsersGroups:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // with actual user id request = [[SFRestAPI sharedInstance] requestForFilesInUsersGroups:_currentUser.credentials.userId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -1732,12 +1801,12 @@ - (void)testFilesSharedWithUser { // with nil for userId SFRestRequest* request = [[SFRestAPI sharedInstance] requestForFilesSharedWithUser:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // with actual user id request = [[SFRestAPI sharedInstance] requestForFilesSharedWithUser:_currentUser.credentials.userId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -1770,25 +1839,25 @@ - (void)testUploadDownloadDeleteFile { // download content SFRestRequest *request = [[SFRestAPI sharedInstance] requestForFileContents:fileAttrs[LID] version:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqualObjects(listener.dataResponse, fileAttrs[@"data"], @"wrong content"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(response.dataResponse, fileAttrs[@"data"], @"wrong content"); // download rendition (expect 200/success) request = [[SFRestAPI sharedInstance] requestForFileRendition:fileAttrs[LID] version:nil renditionType:@"PDF" page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // delete request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // download content again (expect 404) request = [[SFRestAPI sharedInstance] requestForFileContents:fileAttrs[LID] version:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); - XCTAssertEqual(listener.lastError.code, 404, @"invalid code"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); + XCTAssertEqual(response.lastError.code, 404, @"invalid code"); } // test url for testUploadDownloadDeleteFileWithCommunity @@ -1831,20 +1900,20 @@ - (void)testUploadDetailsDeleteFile { // get details SFRestRequest *request = [[SFRestAPI sharedInstance] requestForFileDetails:fileAttrs[LID] forVersion:nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - [self compareFileAttributes:listener.dataResponse expectedAttrs:fileAttrs]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + [self compareFileAttributes:response.dataResponse expectedAttrs:fileAttrs]; // delete request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // get details again (expect 404) request = [[SFRestAPI sharedInstance] requestForFileDetails:fileAttrs[LID] forVersion:nil apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); - XCTAssertEqual(listener.lastError.code, 404, @"invalid code"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); + XCTAssertEqual(response.lastError.code, 404, @"invalid code"); } - (void)testUploadDetailsDeleteFileWithCommunity { @@ -1879,37 +1948,37 @@ - (void)testUploadBatchDetailsDeleteFiles { // get batch details SFRestRequest *request = [[SFRestAPI sharedInstance] requestForBatchFileDetails:@[fileAttrs[LID], fileAttrs2[LID]] apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual([listener.dataResponse[RESULTS][0][STATUS_CODE] intValue], 200, @"expected 200"); - [self compareFileAttributes:listener.dataResponse[RESULTS][0][RESULT] expectedAttrs:fileAttrs]; - XCTAssertEqual([listener.dataResponse[RESULTS][1][STATUS_CODE] intValue], 200, @"expected 200"); - [self compareFileAttributes:listener.dataResponse[RESULTS][1][RESULT] expectedAttrs:fileAttrs2]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual([response.dataResponse[RESULTS][0][STATUS_CODE] intValue], 200, @"expected 200"); + [self compareFileAttributes:response.dataResponse[RESULTS][0][RESULT] expectedAttrs:fileAttrs]; + XCTAssertEqual([response.dataResponse[RESULTS][1][STATUS_CODE] intValue], 200, @"expected 200"); + [self compareFileAttributes:response.dataResponse[RESULTS][1][RESULT] expectedAttrs:fileAttrs2]; // delete first file request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // get batch details (expect 404 for first file) request = [[SFRestAPI sharedInstance] requestForBatchFileDetails:@[fileAttrs[LID], fileAttrs2[LID]] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual([listener.dataResponse[RESULTS][0][STATUS_CODE] intValue], 404, @"expected 404"); - XCTAssertEqual([listener.dataResponse[RESULTS][1][STATUS_CODE] intValue], 200, @"expected 200"); - [self compareFileAttributes:listener.dataResponse[RESULTS][1][RESULT] expectedAttrs:fileAttrs2]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual([response.dataResponse[RESULTS][0][STATUS_CODE] intValue], 404, @"expected 404"); + XCTAssertEqual([response.dataResponse[RESULTS][1][STATUS_CODE] intValue], 200, @"expected 200"); + [self compareFileAttributes:response.dataResponse[RESULTS][1][RESULT] expectedAttrs:fileAttrs2]; // delete second file request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs2[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // get batch details (expect 404 for both files) request = [[SFRestAPI sharedInstance] requestForBatchFileDetails:@[fileAttrs[LID], fileAttrs2[LID]] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual([listener.dataResponse[RESULTS][0][STATUS_CODE] intValue], 404, @"expected 404"); - XCTAssertEqual([listener.dataResponse[RESULTS][1][STATUS_CODE] intValue], 404, @"expected 404"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual([response.dataResponse[RESULTS][0][STATUS_CODE] intValue], 404, @"expected 404"); + XCTAssertEqual([response.dataResponse[RESULTS][1][STATUS_CODE] intValue], 404, @"expected 404"); } - (void)testUploadBatchDetailsDeleteFilesCommunity { @@ -1942,35 +2011,35 @@ - (void)testUploadOwnedFilesDelete { NSDictionary *fileAttrs = [self uploadFile]; // get owned files SFRestRequest *request = [[SFRestAPI sharedInstance] requestForOwnedFilesList:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - [self compareFileAttributes:listener.dataResponse[@"files"][0] expectedAttrs:fileAttrs]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + [self compareFileAttributes:response.dataResponse[@"files"][0] expectedAttrs:fileAttrs]; // upload other file NSDictionary *fileAttrs2 = [self uploadFile]; // get owned files request = [[SFRestAPI sharedInstance] requestForOwnedFilesList:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - [self compareMultipleFileAttributes:@[ listener.dataResponse[@"files"][0], listener.dataResponse[@"files"][1] ] + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + [self compareMultipleFileAttributes:@[ response.dataResponse[@"files"][0], response.dataResponse[@"files"][1] ] expected:@[ fileAttrs, fileAttrs2 ]]; // delete second file request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs2[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // get owned files request = [[SFRestAPI sharedInstance] requestForOwnedFilesList:nil page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - [self compareFileAttributes:listener.dataResponse[@"files"][0] expectedAttrs:fileAttrs]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + [self compareFileAttributes:response.dataResponse[@"files"][0] expectedAttrs:fileAttrs]; // delete first file request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } @@ -1985,31 +2054,31 @@ - (void)testUploadShareFileSharesSharedFilesUnshareDelete { // get file shares SFRestRequest *request = [[SFRestAPI sharedInstance] requestForFileShares:fileAttrs[LID] page:0 apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual((int)[listener.dataResponse[@"shares"] count], 1, @"expected one share"); - XCTAssertEqualObjects(listener.dataResponse[@"shares"][0][@"entity"][LID], _currentUser.credentials.userId, @"expected share with current user"); - XCTAssertEqualObjects(listener.dataResponse[@"shares"][0][@"sharingType"], @"I", @"wrong sharing type"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual((int)[response.dataResponse[@"shares"] count], 1, @"expected one share"); + XCTAssertEqualObjects(response.dataResponse[@"shares"][0][@"entity"][LID], _currentUser.credentials.userId, @"expected share with current user"); + XCTAssertEqualObjects(response.dataResponse[@"shares"][0][@"sharingType"], @"I", @"wrong sharing type"); // get count files shared with other user request = [[SFRestAPI sharedInstance] requestForFilesSharedWithUser:otherUserId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - int countFilesSharedWithOtherUser = (int)[listener.dataResponse[@"files"] count]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + int countFilesSharedWithOtherUser = (int)[response.dataResponse[@"files"] count]; // share file with other user request = [[SFRestAPI sharedInstance] requestForAddFileShare:fileAttrs[LID] entityId:otherUserId shareType:@"V" apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSString *shareId = listener.dataResponse[LID]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSString *shareId = response.dataResponse[LID]; // get file shares again request = [[SFRestAPI sharedInstance] requestForFileShares:fileAttrs[LID] page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); NSMutableDictionary* actualUserIdToType = [NSMutableDictionary new]; - for (int i=0; i < [listener.dataResponse[@"shares"] count]; i++) { - NSDictionary* share = listener.dataResponse[@"shares"][i]; + for (int i=0; i < [response.dataResponse[@"shares"] count]; i++) { + NSDictionary* share = response.dataResponse[@"shares"][i]; NSString* shareEntityId = share[@"entity"][LID]; NSString* shareType = share[@"sharingType"]; actualUserIdToType[shareEntityId] = shareType; @@ -2022,33 +2091,33 @@ - (void)testUploadShareFileSharesSharedFilesUnshareDelete { // get count files shared with other user request = [[SFRestAPI sharedInstance] requestForFilesSharedWithUser:otherUserId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual((int)[listener.dataResponse[@"files"] count], countFilesSharedWithOtherUser + 1, @"expected one more file shared with other user"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual((int)[response.dataResponse[@"files"] count], countFilesSharedWithOtherUser + 1, @"expected one more file shared with other user"); // unshare file from other user request = [[SFRestAPI sharedInstance] requestForDeleteFileShare:shareId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // get files shares again request = [[SFRestAPI sharedInstance] requestForFileShares:fileAttrs[LID] page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual((int)[listener.dataResponse[@"shares"] count], 1, @"expected one share"); - XCTAssertEqualObjects(listener.dataResponse[@"shares"][0][@"entity"][LID], _currentUser.credentials.userId, @"expected share with current user"); - XCTAssertEqualObjects(listener.dataResponse[@"shares"][0][@"sharingType"], @"I", @"wrong sharing type"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual((int)[response.dataResponse[@"shares"] count], 1, @"expected one share"); + XCTAssertEqualObjects(response.dataResponse[@"shares"][0][@"entity"][LID], _currentUser.credentials.userId, @"expected share with current user"); + XCTAssertEqualObjects(response.dataResponse[@"shares"][0][@"sharingType"], @"I", @"wrong sharing type"); // get count files shared with other user request = [[SFRestAPI sharedInstance] requestForFilesSharedWithUser:otherUserId page:0 apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqual((int)[listener.dataResponse[@"files"] count], countFilesSharedWithOtherUser, @"expected one less file shared with other user"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqual((int)[response.dataResponse[@"files"] count], countFilesSharedWithOtherUser, @"expected one less file shared with other user"); // delete file request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:@"ContentDocument" objectId:fileAttrs[LID] apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testUploadProfilePhoto { @@ -2060,10 +2129,10 @@ - (void)testUploadProfilePhoto { // upload SFRestRequest *request = [[SFRestAPI sharedInstance] requestForProfilePhotoUpload:fileData fileName:fileTitle mimeType:fileMimeType userId:_currentUser.credentials.userId apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // check response - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testUploadProfilePhotoCommunity { @@ -2097,11 +2166,11 @@ - (NSString *) getOtherUser { // query SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:soql apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // check response - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - return listener.dataResponse[RECORDS][0][ID]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + return response.dataResponse[RECORDS][0][ID]; } // Upload file / check response / return new file attributes (id, title, description, data, mimeType, contentSize) @@ -2116,17 +2185,17 @@ - (NSDictionary *) uploadFile { // upload SFRestRequest *request = [[SFRestAPI sharedInstance] requestForUploadFile:fileData name:fileTitle description:fileDescription mimeType:fileMimeType apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; // check response - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - XCTAssertEqualObjects(listener.dataResponse[@"title"], fileTitle, @"wrong title"); - XCTAssertEqualObjects(listener.dataResponse[@"description"], fileDescription, @"wrong description"); - XCTAssertEqual([listener.dataResponse[@"contentSize"] intValue], [fileSize intValue], @"wrong content size"); - XCTAssertEqualObjects(listener.dataResponse[@"mimeType"], fileMimeType, @"wrong mime type"); + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(response.dataResponse[@"title"], fileTitle, @"wrong title"); + XCTAssertEqualObjects(response.dataResponse[@"description"], fileDescription, @"wrong description"); + XCTAssertEqual([response.dataResponse[@"contentSize"] intValue], [fileSize intValue], @"wrong content size"); + XCTAssertEqualObjects(response.dataResponse[@"mimeType"], fileMimeType, @"wrong mime type"); // get id - NSString *fileId = listener.dataResponse[LID]; + NSString *fileId = response.dataResponse[LID]; // making dictionary with file attributes NSDictionary *fileAttrs = @{@"title": fileTitle, @@ -2183,8 +2252,8 @@ - (void)testInvalidAccessTokenWithValidGetRequest { // request (valid) SFRestRequest* request = [[SFRestAPI sharedInstance] requestForResources:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); [SFLogger log:[self class] level:SFLogLevelDebug format:@"latest access token: %@", _currentUser.credentials.accessToken]; // let's make sure we have another access token @@ -2211,9 +2280,9 @@ - (void)testRefreshNotificationWithValidGetRequest { // request (valid) SFRestRequest* request = [[SFRestAPI sharedInstance] requestForResources:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; [self waitForExpectationsWithTimeout:10.0 handler:nil]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); [SFLogger log:[self class] level:SFLogLevelDebug format:@"latest access token: %@", _currentUser.credentials.accessToken]; // let's make sure we have another access token @@ -2233,9 +2302,9 @@ - (void)testInvalidAccessTokenWithValidPostRequest { NSDictionary *fields = @{FIRST_NAME: @"John", LAST_NAME: [self generateRecordName]}; SFRestRequest* request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSString *contactId = ((NSDictionary *)listener.dataResponse)[LID]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSString *contactId = ((NSDictionary *)response.dataResponse)[LID]; XCTAssertNotNil(contactId, @"Contact create result should contain an ID value."); [SFLogger log:[self class] level:SFLogLevelDebug format:@"latest access token: %@", _currentUser.credentials.accessToken]; @@ -2243,8 +2312,8 @@ - (void)testInvalidAccessTokenWithValidPostRequest { NSString *newAccessToken = _currentUser.credentials.accessToken; XCTAssertFalse([newAccessToken isEqualToString:invalidAccessToken], @"access token wasn't refreshed"); request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:CONTACT objectId:contactId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); self.dataCleanupRequired = NO; } @@ -2262,8 +2331,8 @@ - (void)testInvalidAccessTokenWithInvalidRequest { // request (invalid) SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:(NSString* _Nonnull)nil apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request was supposed to fail"); // let's make sure we have another access token NSString *newAccessToken = _currentUser.credentials.accessToken; @@ -2311,11 +2380,11 @@ - (void)testInvalidAccessAndRefreshToken { @try { // request (valid) SFRestRequest* request = [restAPI requestForResources:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request usingInstance:restAPI]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); - XCTAssertEqualObjects(listener.lastError.domain, kSFOAuthErrorDomain, @"invalid domain"); - XCTAssertEqual(listener.lastError.code, kSFOAuthErrorInvalidGrant, @"invalid code"); - XCTAssertNotNil(listener.lastError.userInfo); + SFRestAPITestResponse *response = [self sendSyncRequest:request usingInstance:restAPI]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidFail, @"request should have failed"); + XCTAssertEqualObjects(response.lastError.domain, kSFOAuthErrorDomain, @"invalid domain"); + XCTAssertEqual(response.lastError.code, kSFOAuthErrorInvalidGrant, @"invalid code"); + XCTAssertNotNil(response.lastError.userInfo); } @finally { self.dataCleanupRequired = NO; @@ -2716,11 +2785,11 @@ - (void)testReallyLongSOQL { NSString *lastName = [NSString stringWithFormat:@"Silver-%@", [NSDate date]]; NSDictionary *fields = @{FIRST_NAME: @"LongJohn", LAST_NAME: lastName}; SFRestRequest *request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // Ensures we get an ID back. - NSString *contactId = ((NSDictionary *)listener.dataResponse)[LID]; + NSString *contactId = ((NSDictionary *)response.dataResponse)[LID]; XCTAssertNotNil(contactId, @"id not present"); [SFLogger log:[self class] level:SFLogLevelDebug format:@"## contact created with id: %@", contactId]; @@ -2737,17 +2806,17 @@ - (void)testReallyLongSOQL { // Runs the query. @try { request = [[SFRestAPI sharedInstance] requestForQuery:queryString apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 1, @"expected 1 record"); } @finally { // Deletes the contact we created. request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:CONTACT objectId:contactId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } } @@ -2757,11 +2826,11 @@ - (void) testSOQLWithNewLine { NSString *lastName = [NSString stringWithFormat:@"Silver-%@", [NSDate date]]; NSDictionary *fields = @{FIRST_NAME: @"LongJohn", LAST_NAME: lastName}; SFRestRequest *request = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); // Ensures we get an ID back. - NSString *contactId = ((NSDictionary *)listener.dataResponse)[LID]; + NSString *contactId = ((NSDictionary *)response.dataResponse)[LID]; XCTAssertNotNil(contactId, @"id not present"); [SFLogger log:[self class] level:SFLogLevelDebug format:@"## contact created with id: %@", contactId]; @@ -2772,16 +2841,16 @@ - (void) testSOQLWithNewLine { // Runs the query. @try { request = [[SFRestAPI sharedInstance] requestForQuery:queryString apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); - NSArray *records = ((NSDictionary *)listener.dataResponse)[RECORDS]; + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + NSArray *records = ((NSDictionary *)response.dataResponse)[RECORDS]; XCTAssertEqual((int)[records count], 1, @"expected 1 record"); } @finally { // Deletes the contact we created. request = [[SFRestAPI sharedInstance] requestForDeleteWithObjectType:CONTACT objectId:contactId apiVersion:kSFRestDefaultAPIVersion]; - listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } } @@ -2965,15 +3034,15 @@ - (void)testRedirect { // Create contact to fetch image for NSDictionary *fields = @{FIRST_NAME: @"John", LAST_NAME: [self generateRecordName]}; SFRestRequest *contactRequest = [[SFRestAPI sharedInstance] requestForCreateWithObjectType:CONTACT fields:fields apiVersion:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *contactListener = [self sendSyncRequest:contactRequest]; - NSString *contactId = ((NSDictionary *)contactListener.dataResponse)[LID]; + SFRestAPITestResponse *contactResponse = [self sendSyncRequest:contactRequest]; + NSString *contactId = ((NSDictionary *)contactResponse.dataResponse)[LID]; // Authenticated request for contact image, should automatically redirect NSString *path = [NSString stringWithFormat:@"/services/images/photo/%@", contactId]; SFRestRequest *request = [SFRestRequest requestWithMethod:SFRestMethodGET path:path queryParams:nil]; request.endpoint = @""; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - NSInteger statusCode = [(NSHTTPURLResponse *)listener.rawResponse statusCode]; + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + NSInteger statusCode = [(NSHTTPURLResponse *)response.rawResponse statusCode]; XCTAssertEqual(statusCode, 200, @"Request did not return 200"); } @@ -3014,8 +3083,8 @@ - (NSString *) generateRandomId:(NSInteger)len { - (void)testNotificationsStatus { SFRestRequest *request = [[SFRestAPI sharedInstance] requestForNotificationsStatus:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testGetNotifications { @@ -3024,8 +3093,8 @@ - (void)testGetNotifications { [builder setAfter:yesterdayDate]; [builder setSize:10]; SFRestRequest* request = [builder buildFetchNotificationsRequest:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testUpdateReadNotifications { @@ -3033,8 +3102,8 @@ - (void)testUpdateReadNotifications { [builder setBefore:[NSDate date]]; [builder setRead:NO]; SFRestRequest* request = [builder buildUpdateNotificationsRequest:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testUpdateSeenNotifications { @@ -3042,8 +3111,8 @@ - (void)testUpdateSeenNotifications { [builder setBefore:[NSDate date]]; [builder setSeen:YES]; SFRestRequest* request = [builder buildUpdateNotificationsRequest:kSFRestDefaultAPIVersion]; - SFNativeRestRequestListener *listener = [self sendSyncRequest:request]; - XCTAssertEqualObjects(listener.returnStatus, kTestRequestStatusDidLoad, @"request failed"); + SFRestAPITestResponse *response = [self sendSyncRequest:request]; + XCTAssertEqualObjects(response.returnStatus, kTestRequestStatusDidLoad, @"request failed"); } - (void)testGetNotificationRequestPath {