@@ -48,6 +48,8 @@ - (void)setUp {
48
48
- (void )tearDown {
49
49
PFTestSKProductsRequest.validProducts = nil ;
50
50
51
+ [[NSFileManager defaultManager ] removeItemAtPath: [self sampleReceiptFilePath ] error: nil ];
52
+
51
53
[super tearDown ];
52
54
}
53
55
@@ -73,20 +75,27 @@ - (NSData *)sampleData {
73
75
return [NSData dataWithBytes: sampleData length: sizeof (sampleData)];
74
76
}
75
77
78
+ - (NSString *)sampleReceiptFilePath {
79
+ return [NSTemporaryDirectory () stringByAppendingPathComponent: @" receipt.data" ];
80
+ }
81
+
76
82
// /--------------------------------------
77
83
#pragma mark - Tests
78
84
// /--------------------------------------
79
85
80
86
- (void )testConstructor {
81
87
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
82
88
id fileManager = PFClassMock ([PFFileManager class ]);
89
+ id bundle = PFStrictClassMock ([NSBundle class ]);
83
90
84
91
PFPurchaseController *controller = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
85
- fileManager: fileManager];
92
+ fileManager: fileManager
93
+ bundle: bundle];
86
94
87
95
XCTAssertNotNil (controller);
88
96
XCTAssertEqual (controller.commandRunner , commandRunner);
89
97
XCTAssertEqual (controller.fileManager , fileManager);
98
+ XCTAssertEqual (controller.bundle , bundle);
90
99
91
100
// This makes the test less sad.
92
101
controller.paymentQueue = PFClassMock ([SKPaymentQueue class ]);
@@ -98,9 +107,11 @@ - (void)testConstructor {
98
107
- (void )testFindProductsAsync {
99
108
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
100
109
id fileManager = PFStrictClassMock ([PFFileManager class ]);
110
+ id bundle = PFStrictClassMock ([NSBundle class ]);
101
111
102
112
PFPurchaseController *purchaseController = [PFPurchaseController controllerWithCommandRunner: commandRunner
103
- fileManager: fileManager];
113
+ fileManager: fileManager
114
+ bundle: bundle];
104
115
105
116
purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
106
117
@@ -123,9 +134,11 @@ - (void)testFindProductsAsync {
123
134
- (void )testBuyProductsAsync {
124
135
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
125
136
id fileManager = PFStrictClassMock ([PFFileManager class ]);
137
+ id bundle = PFStrictClassMock ([NSBundle class ]);
126
138
127
139
PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
128
- fileManager: fileManager];
140
+ fileManager: fileManager
141
+ bundle: bundle];
129
142
130
143
purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
131
144
purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
@@ -189,9 +202,11 @@ - (void)testBuyProductsAsync {
189
202
- (void )testDownloadAssetAsync {
190
203
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
191
204
id fileManager = PFStrictClassMock ([PFFileManager class ]);
205
+ id bundle = PFStrictClassMock ([NSBundle class ]);
192
206
193
207
PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
194
- fileManager: fileManager];
208
+ fileManager: fileManager
209
+ bundle: bundle];
195
210
196
211
purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
197
212
purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
@@ -200,7 +215,10 @@ - (void)testDownloadAssetAsync {
200
215
PFTestSKPaymentTransaction *transaction = [PFTestSKPaymentTransaction transactionForPayment: payment
201
216
withError: nil
202
217
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 ];
204
222
205
223
PFFile *mockedFile = PFPartialMock ([PFFile fileWithName: @" testData" data: [self sampleData ]]);
206
224
@@ -245,9 +263,44 @@ - (void)testDownloadAssetAsync {
245
263
- (void )testDownloadInvalidReceipt {
246
264
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
247
265
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 ]);
248
300
249
301
PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
250
- fileManager: fileManager];
302
+ fileManager: fileManager
303
+ bundle: bundle];
251
304
purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
252
305
purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
253
306
@@ -256,6 +309,8 @@ - (void)testDownloadInvalidReceipt {
256
309
withError: nil
257
310
inState: SKPaymentTransactionStatePurchased];
258
311
312
+ OCMStub ([bundle appStoreReceiptURL ]).andReturn ([NSURL fileURLWithPath: [self sampleReceiptFilePath ]]);
313
+
259
314
XCTestExpectation *expectation = [self currentSelectorTestExpectation ];
260
315
[[purchaseController downloadAssetAsyncForTransaction: transaction
261
316
withProgressBlock: nil
@@ -275,17 +330,22 @@ - (void)testDownloadInvalidReceipt {
275
330
- (void )testDownloadInvalidFile {
276
331
id commandRunner = PFStrictProtocolMock (@protocol (PFCommandRunning));
277
332
id fileManager = PFStrictClassMock ([PFFileManager class ]);
333
+ id bundle = PFStrictClassMock ([NSBundle class ]);
278
334
279
335
PFPurchaseController *purchaseController = [[PFPurchaseController alloc ] initWithCommandRunner: commandRunner
280
- fileManager: fileManager];
336
+ fileManager: fileManager
337
+ bundle: bundle];
281
338
purchaseController.productsRequestClass = [PFTestSKProductsRequest class ];
282
339
purchaseController.paymentQueue = PFStrictClassMock ([SKPaymentQueue class ]);
283
340
284
341
SKPayment *payment = [SKPayment paymentWithProduct: [self sampleProduct ]];
285
342
PFTestSKPaymentTransaction *transaction = [PFTestSKPaymentTransaction transactionForPayment: payment
286
343
withError: nil
287
344
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 ];
289
349
290
350
PFCommandResult *mockedResult = [PFCommandResult commandResultWithResult: @{ @" a" : @" Hello" }
291
351
resultString: nil
0 commit comments