@@ -48,6 +48,8 @@ - (void)setUp {
4848- (void )tearDown {
4949 PFTestSKProductsRequest.validProducts = nil ;
5050
51+ [[NSFileManager defaultManager ] removeItemAtPath: [self sampleReceiptFilePath ] error: nil ];
52+
5153 [super tearDown ];
5254}
5355
@@ -73,20 +75,27 @@ - (NSData *)sampleData {
7375 return [NSData dataWithBytes: sampleData length: sizeof (sampleData)];
7476}
7577
78+ - (NSString *)sampleReceiptFilePath {
79+ return [NSTemporaryDirectory () stringByAppendingPathComponent: @" receipt.data" ];
80+ }
81+
7682// /--------------------------------------
7783#pragma mark - Tests
7884// /--------------------------------------
7985
8086- (void )testConstructor {
8187 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
8288 id fileManager = PFClassMock ([PFFileManager class ]);
89+ id bundle = PFStrictClassMock ([NSBundle class ]);
8390
8491 PFPurchaseController *controller = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
85- fileManager: fileManager];
92+ fileManager: fileManager
93+ bundle: bundle];
8694
8795 XCTAssertNotNil (controller);
8896 XCTAssertEqual (controller.commandRunner , commandRunner);
8997 XCTAssertEqual (controller.fileManager , fileManager);
98+ XCTAssertEqual (controller.bundle , bundle);
9099
91100 // This makes the test less sad.
92101 controller.paymentQueue = PFClassMock ([SKPaymentQueue class ]);
@@ -98,9 +107,11 @@ - (void)testConstructor {
98107- (void )testFindProductsAsync {
99108 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
100109 id fileManager = PFStrictClassMock ([PFFileManager class ]);
110+ id bundle = PFStrictClassMock ([NSBundle class ]);
101111
102112 PFPurchaseController *purchaseController = [PFPurchaseController controllerWithCommandRunner: commandRunner
103- fileManager: fileManager];
113+ fileManager: fileManager
114+ bundle: bundle];
104115
105116 purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
106117
@@ -123,9 +134,11 @@ - (void)testFindProductsAsync {
123134- (void )testBuyProductsAsync {
124135 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
125136 id fileManager = PFStrictClassMock ([PFFileManager class ]);
137+ id bundle = PFStrictClassMock ([NSBundle class ]);
126138
127139 PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
128- fileManager: fileManager];
140+ fileManager: fileManager
141+ bundle: bundle];
129142
130143 purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
131144 purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
@@ -189,9 +202,11 @@ - (void)testBuyProductsAsync {
189202- (void )testDownloadAssetAsync {
190203 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
191204 id fileManager = PFStrictClassMock ([PFFileManager class ]);
205+ id bundle = PFStrictClassMock ([NSBundle class ]);
192206
193207 PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
194- fileManager: fileManager];
208+ fileManager: fileManager
209+ bundle: bundle];
195210
196211 purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
197212 purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
@@ -200,7 +215,10 @@ - (void)testDownloadAssetAsync {
200215 PFTestSKPaymentTransaction *transaction = [PFTestSKPaymentTransaction transactionForPayment: payment
201216 withError: nil
202217 inState: SKPaymentTransactionStatePurchased];
203- transaction.transactionReceipt = [self sampleData ];
218+
219+ NSString *receiptFile = [self sampleReceiptFilePath ];
220+ OCMStub ([bundle appStoreReceiptURL ]).andReturn ([NSURL fileURLWithPath: receiptFile]);
221+ [[self sampleData ] writeToFile: receiptFile atomically: YES ];
204222
205223 PFFile *mockedFile = PFPartialMock ([PFFile fileWithName: @" testData" data: [self sampleData ]]);
206224
@@ -245,9 +263,44 @@ - (void)testDownloadAssetAsync {
245263- (void )testDownloadInvalidReceipt {
246264 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
247265 id fileManager = PFStrictClassMock ([PFFileManager class ]);
266+ id bundle = PFStrictClassMock ([NSBundle class ]);
267+
268+ PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
269+ fileManager: fileManager
270+ bundle: bundle];
271+ purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
272+ purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
273+
274+ SKPayment *payment = [SKPayment paymentWithProduct: [self sampleProduct ]];
275+ PFTestSKPaymentTransaction *transaction = [PFTestSKPaymentTransaction transactionForPayment: payment
276+ withError: nil
277+ inState: SKPaymentTransactionStatePurchased];
278+ OCMStub ([bundle appStoreReceiptURL ]).andReturn (nil );
279+
280+ XCTestExpectation *expectation = [self currentSelectorTestExpectation ];
281+ [[purchaseController downloadAssetAsyncForTransaction: transaction
282+ withProgressBlock: nil
283+ sessionToken: @" token" ] continueWithBlock: ^id (BFTask *task) {
284+ XCTAssertTrue (task.faulted );
285+ XCTAssertNotNil (task.error );
286+ XCTAssertEqual (task.error .code , kPFErrorReceiptMissing );
287+
288+ [expectation fulfill ];
289+
290+ return nil ;
291+ }];
292+
293+ [self waitForTestExpectations ];
294+ }
295+
296+ - (void )testDownloadMissingReceiptData {
297+ id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
298+ id fileManager = PFStrictClassMock ([PFFileManager class ]);
299+ id bundle = PFStrictClassMock ([NSBundle class ]);
248300
249301 PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
250- fileManager: fileManager];
302+ fileManager: fileManager
303+ bundle: bundle];
251304 purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
252305 purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
253306
@@ -256,6 +309,8 @@ - (void)testDownloadInvalidReceipt {
256309 withError: nil
257310 inState: SKPaymentTransactionStatePurchased];
258311
312+ OCMStub ([bundle appStoreReceiptURL ]).andReturn ([NSURL fileURLWithPath: [self sampleReceiptFilePath ]]);
313+
259314 XCTestExpectation *expectation = [self currentSelectorTestExpectation ];
260315 [[purchaseController downloadAssetAsyncForTransaction: transaction
261316 withProgressBlock: nil
@@ -275,17 +330,22 @@ - (void)testDownloadInvalidReceipt {
275330- (void )testDownloadInvalidFile {
276331 id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
277332 id fileManager = PFStrictClassMock ([PFFileManager class ]);
333+ id bundle = PFStrictClassMock ([NSBundle class ]);
278334
279335 PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
280- fileManager: fileManager];
336+ fileManager: fileManager
337+ bundle: bundle];
281338 purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
282339 purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
283340
284341 SKPayment *payment = [SKPayment paymentWithProduct: [self sampleProduct ]];
285342 PFTestSKPaymentTransaction *transaction = [PFTestSKPaymentTransaction transactionForPayment: payment
286343 withError: nil
287344 inState: SKPaymentTransactionStatePurchased];
288- transaction.transactionReceipt = [self sampleData ];
345+
346+ NSString *temporaryFile = [self sampleReceiptFilePath ];
347+ OCMStub ([bundle appStoreReceiptURL ]).andReturn ([NSURL fileURLWithPath: temporaryFile]);
348+ [[self sampleData ] writeToFile: temporaryFile atomically: YES ];
289349
290350 PFCommandResult *mockedResult = [PFCommandResult commandResultWithResult: @{ @" a" : @" Hello" }
291351 resultString: nil
0 commit comments