Commit 86047b7a by Dima Bart

Update checkout operation to wrap 3 calls, update tests.

parent b5c0b88a
...@@ -47,7 +47,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg"; ...@@ -47,7 +47,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg";
@implementation BUYClient_Test @implementation BUYClient_Test
- (void)startTask:(BUYRequestOperation *)task - (void)startOperation:(BUYOperation *)operation
{ {
// Do nothing // Do nothing
} }
...@@ -128,7 +128,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg"; ...@@ -128,7 +128,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg";
{ {
BUYCheckout *checkout = [[BUYCheckout alloc] initWithModelManager:self.client.modelManager JSONDictionary:@{@"token": @"abcdef", @"payment_due": @0}]; BUYCheckout *checkout = [[BUYCheckout alloc] initWithModelManager:self.client.modelManager JSONDictionary:@{@"token": @"abcdef", @"payment_due": @0}];
BUYRequestOperation *task = [self.client completeCheckout:checkout paymentToken:nil completion:^(BUYCheckout *checkout, NSError *error) {}]; BUYOperation *task = [self.client completeCheckout:checkout paymentToken:nil completion:^(BUYCheckout *checkout, NSError *error) {}];
XCTAssertNotNil(task); XCTAssertNotNil(task);
} }
......
...@@ -272,68 +272,13 @@ ...@@ -272,68 +272,13 @@
[self.client completeCheckout:_checkout paymentToken:paymentToken completion:^(BUYCheckout *returnedCheckout, NSError *error) { [self.client completeCheckout:_checkout paymentToken:paymentToken completion:^(BUYCheckout *returnedCheckout, NSError *error) {
XCTAssertNil(error); XCTAssertNil(error);
XCTAssertNotNil(returnedCheckout); XCTAssertNotNil(returnedCheckout);
XCTAssertNotNil(returnedCheckout.order);
XCTAssertNotNil(returnedCheckout.order.identifier);
XCTAssertNotNil(returnedCheckout.order.statusURL);
XCTAssertNotNil(returnedCheckout.order.name);
_checkout = returnedCheckout; _checkout = returnedCheckout;
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:10 handler:^(NSError *error) {
XCTAssertNil(error);
}];
}
- (void)pollUntilCheckoutIsComplete
{
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest * _Nonnull request) {
return [self shouldUseMocks];
} withStubResponse:^OHHTTPStubsResponse * _Nonnull(NSURLRequest * _Nonnull request) {
return [OHHTTPStubsResponse responseWithKey:@"testCheckoutFlowUsingCreditCard_14"];
}];
__block BUYStatus checkoutStatus = BUYStatusUnknown;
__block NSError *checkoutError = nil;
while (_checkout.token && checkoutStatus != BUYStatusFailed && checkoutStatus != BUYStatusComplete) {
NSLog(@"Checking completion status...");
XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];
[self.client getCompletionStatusOfCheckout:_checkout completion:^(BUYStatus status, NSError *error) {
XCTAssertNil(error);
checkoutError = error;
checkoutStatus = status;
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:10 handler:^(NSError *error) {
XCTAssertNil(error);
}];
if (checkoutStatus != BUYStatusComplete) {
[NSThread sleepForTimeInterval:0.5f];
}
}
XCTAssertNil(checkoutError);
XCTAssertEqual(checkoutStatus, BUYStatusComplete);
}
- (void)verifyCompletedCheckout
{
XCTAssertNil(_checkout.order.identifier);
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest * _Nonnull request) {
return [self shouldUseMocks];
} withStubResponse:^OHHTTPStubsResponse * _Nonnull(NSURLRequest * _Nonnull request) {
return [OHHTTPStubsResponse responseWithKey:@"testCheckoutFlowUsingCreditCard_15"];
}];
XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];
[self.client getCheckout:_checkout completion:^(BUYCheckout *returnedCheckout, NSError *error) {
XCTAssertNil(error);
XCTAssertNotNil(returnedCheckout);
_checkout = returnedCheckout;
XCTAssertNotNil(_checkout.order.identifier);
XCTAssertNotNil(_checkout.order.statusURL);
XCTAssertNotNil(_checkout.order.name);
[expectation fulfill]; [expectation fulfill];
[self confirmCreditCard]; [self confirmCreditCard];
...@@ -994,9 +939,6 @@ ...@@ -994,9 +939,6 @@
[self updateCheckout]; [self updateCheckout];
[self completeCheckoutWithToken:[self addCreditCardToCheckout]]; [self completeCheckoutWithToken:[self addCreditCardToCheckout]];
[self pollUntilCheckoutIsComplete];
[self verifyCompletedCheckout];
} }
- (void)testCheckoutWithAPartialAddress - (void)testCheckoutWithAPartialAddress
...@@ -1042,9 +984,6 @@ ...@@ -1042,9 +984,6 @@
//We use a credit card here because we're not generating apple pay tokens in the tests //We use a credit card here because we're not generating apple pay tokens in the tests
id<BUYPaymentToken> token = [self addCreditCardToCheckout]; id<BUYPaymentToken> token = [self addCreditCardToCheckout];
[self completeCheckoutWithToken:token]; [self completeCheckoutWithToken:token];
[self pollUntilCheckoutIsComplete];
[self verifyCompletedCheckout];
} }
- (void)testCheckoutCreationWithApplicableDiscount - (void)testCheckoutCreationWithApplicableDiscount
......
...@@ -164,7 +164,9 @@ ...@@ -164,7 +164,9 @@
} }
- (BUYOperation *)completeCheckout:(BUYCheckout *)checkout paymentToken:(id<BUYPaymentToken>)paymentToken completion:(BUYDataCheckoutBlock)block { - (BUYOperation *)completeCheckout:(BUYCheckout *)checkout paymentToken:(id<BUYPaymentToken>)paymentToken completion:(BUYDataCheckoutBlock)block {
return [[BUYCheckoutOperation alloc] initWithClient:self checkout:checkout token:paymentToken completion:block]; BUYCheckoutOperation *operation = [[BUYCheckoutOperation alloc] initWithClient:self checkout:checkout token:paymentToken completion:block];
[self startOperation:operation];
return operation;
} }
- (BUYRequestOperation *)beginCheckout:(BUYCheckout *)checkout paymentToken:(id<BUYPaymentToken>)paymentToken completion:(BUYDataCheckoutBlock)block - (BUYRequestOperation *)beginCheckout:(BUYCheckout *)checkout paymentToken:(id<BUYPaymentToken>)paymentToken completion:(BUYDataCheckoutBlock)block
......
...@@ -52,4 +52,6 @@ typedef void (^BUYClientRequestJSONCompletion)(NSDictionary *json, NSURLResponse ...@@ -52,4 +52,6 @@ typedef void (^BUYClientRequestJSONCompletion)(NSDictionary *json, NSURLResponse
- (BUYStatus)statusForStatusCode:(NSUInteger)statusCode error:(NSError *)error; - (BUYStatus)statusForStatusCode:(NSUInteger)statusCode error:(NSError *)error;
- (NSError *)errorFromJSON:(NSDictionary *)json response:(NSURLResponse *)response; - (NSError *)errorFromJSON:(NSDictionary *)json response:(NSURLResponse *)response;
- (void)startOperation:(BUYOperation *)operation;
@end @end
...@@ -173,9 +173,9 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -173,9 +173,9 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
#pragma mark - Generic Requests #pragma mark - Generic Requests
- (void)startTask:(BUYRequestOperation *)task - (void)startOperation:(BUYOperation *)operation
{ {
[self.requestQueue addOperation:task]; [self.requestQueue addOperation:operation];
} }
- (NSString *)authorizationHeader - (NSString *)authorizationHeader
...@@ -213,7 +213,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -213,7 +213,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
}]; }];
if (start) { if (start) {
[self startTask:operation]; [self startOperation:operation];
} }
return operation; return operation;
} }
......
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
- (BUYRequestOperation *)getCompletionStatusOfCheckoutToken:(NSString *)token start:(BOOL)start completion:(BUYDataStatusBlock)block; - (BUYRequestOperation *)getCompletionStatusOfCheckoutToken:(NSString *)token start:(BOOL)start completion:(BUYDataStatusBlock)block;
- (BUYRequestOperation *)getCheckout:(BUYCheckout *)checkout start:(BOOL)start completion:(BUYDataCheckoutBlock)block; - (BUYRequestOperation *)getCheckout:(BUYCheckout *)checkout start:(BOOL)start completion:(BUYDataCheckoutBlock)block;
- (void)startOperation:(BUYOperation *)operation;
@end @end
@interface BUYCheckoutOperation () @interface BUYCheckoutOperation ()
...@@ -44,7 +46,7 @@ ...@@ -44,7 +46,7 @@
@property (strong, nonatomic, readonly) id<BUYPaymentToken> token; @property (strong, nonatomic, readonly) id<BUYPaymentToken> token;
@property (strong, nonatomic, readonly) BUYCheckoutOperationCompletion completion; @property (strong, nonatomic, readonly) BUYCheckoutOperationCompletion completion;
@property (strong, nonatomic, readonly) NSArray *operations; @property (strong, nonatomic) BUYRequestOperation *currentOperation;
@end @end
...@@ -87,48 +89,84 @@ ...@@ -87,48 +89,84 @@
- (void)startExecution - (void)startExecution
{ {
if (self.isCancelled) {
return;
}
[super startExecution]; [super startExecution];
__weak typeof(self) weakSelf = self; __weak typeof(self) weakSelf = self;
BUYRequestOperation *beginOperation = [self.client beginCheckout:self.checkout paymentToken:self.token completion:^(BUYCheckout *checkout, NSError *error) { BUYRequestOperation *beginOperation = [weakSelf.client beginCheckout:weakSelf.checkout paymentToken:weakSelf.token completion:^(BUYCheckout *checkout, NSError *error) {
if (weakSelf.isCancelled || !checkout) { if (weakSelf.isCancelled) {
[weakSelf cancel];
return; return;
} }
}];
if (!checkout) {
BUYRequestOperation *pollingOperation = [self.client getCompletionStatusOfCheckoutToken:self.checkout.token start:NO completion:^(BUYStatus status, NSError *error) { [weakSelf finishWithError:error];
if (weakSelf.isCancelled || status != BUYStatusComplete) {
[weakSelf cancel];
return; return;
} }
BUYRequestOperation *pollOperation = [weakSelf.client getCompletionStatusOfCheckoutToken:weakSelf.checkout.token start:NO completion:^(BUYStatus status, NSError *error) {
if (weakSelf.isCancelled) {
return;
}
if (status != BUYStatusComplete) {
[weakSelf finishWithError:error];
return;
}
BUYRequestOperation *getOperation = [weakSelf.client getCheckout:weakSelf.checkout start:NO completion:^(BUYCheckout *checkout, NSError *error) {
if (weakSelf.isCancelled) {
return;
}
if (checkout) {
[weakSelf finishWithCheckout:checkout];
} else {
[weakSelf finishWithError:error];
}
}];
// Update current operation
[weakSelf locked:^{
weakSelf.currentOperation = getOperation;
}];
NSLog(@"Getting completed checkout.");
[weakSelf.client startOperation:getOperation];
}];
pollOperation.pollingHandler = ^BOOL (NSDictionary *json, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Polling checkout...");
return response.statusCode == BUYStatusProcessing;
};
// Update current operation
[weakSelf locked:^{
weakSelf.currentOperation = pollOperation;
}];
NSLog(@"Starting checkout status polling.");
[weakSelf.client startOperation:pollOperation];
}]; }];
pollingOperation.pollingHandler = ^BOOL (NSDictionary *json, NSHTTPURLResponse *response, NSError *error) {
return response.statusCode == BUYStatusProcessing;
};
BUYRequestOperation *getOperation = [self.client getCheckout:self.checkout completion:^(BUYCheckout *checkout, NSError *error) {
if (weakSelf.isCancelled || !checkout) {
[weakSelf cancel];
return;
}
}];
// Update current operation
[self locked:^{ [self locked:^{
_operations = @[beginOperation, pollingOperation, getOperation]; self.currentOperation = beginOperation;
}]; }];
[self.client.requestQueue addOperations:self.operations waitUntilFinished:NO]; NSLog(@"Starting checkout.");
[self.client startOperation:beginOperation];
} }
- (void)cancelExecution - (void)cancelExecution
{ {
[super cancelExecution]; [super cancelExecution];
for (NSOperation *operation in self.operations) { __block BUYRequestOperation *currentOperation = nil;
[operation cancel]; [self locked:^{
} currentOperation = self.currentOperation;
}];
[currentOperation cancel];
} }
@end @end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment