diff --git a/CHANGELOG.md b/CHANGELOG.md index 0df5f0f2e70..32c0c3c6d1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -* Adding Masterpass support to `STPSourceParams` [#928](https://github.com/stripe/stripe-ios/pull/928) -* Added community submitted Norwegian (nb) translation. Thank @Nailer! -* Fixed example app usage of localization files (they were not able to be tested in Finnish and Norwegian before) +* Remove Bitcoin source support. See MIGRATING.md. [#931](https://github.com/stripe/stripe-ios/pull/931) +* Add Masterpass support to `STPSourceParams` [#928](https://github.com/stripe/stripe-ios/pull/928) +* Add community submitted Norwegian (nb) translation. Thank @Nailer! +* Fix example app usage of localization files (they were not able to be tested in Finnish and Norwegian before) * Silence STPAddress deprecation warnings we ignore to stay compatible with older iOS versions * Fix "Card IO" link in full SDK reference https://github.com/stripe/stripe-ios/pull/913 diff --git a/MIGRATING.md b/MIGRATING.md index ba0756c2e66..30bfdbd40ed 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -1,5 +1,10 @@ ## Migration Guides +### Migrating from versions < 13.0.0 +* Remove Bitcoin source support because Stripe no longer processes Bitcoin payments: https://stripe.com/blog/ending-bitcoin-support + * Sources can no longer have a "STPSourceTypeBitcoin" source type. These sources will now be interpreted as "STPSourceTypeUnknown". + * You can no longer `createBitcoinParams`. Please use a different payment method. + ### Migrating from versions < 12.0.0 * The SDK now requires iOS 9+ and Xcode version 9+. If you need to support iOS 8 or Xcode 8, the last supported version is [11.5.0](https://github.com/stripe/stripe-ios/releases/tag/v11.5.0) * `STPPaymentConfiguration.requiredShippingAddress` now is a set of `STPContactField` objects instead of a `PKAddressField` bitmask. diff --git a/Stripe.xcodeproj/project.pbxproj b/Stripe.xcodeproj/project.pbxproj index d8b93d2ab35..22bb8d2c530 100644 --- a/Stripe.xcodeproj/project.pbxproj +++ b/Stripe.xcodeproj/project.pbxproj @@ -361,7 +361,6 @@ 8BCB6E612053389800629978 /* stp_card_unionpay_en@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8BCB6E552053389800629978 /* stp_card_unionpay_en@3x.png */; }; 8BD213371F044B57007F6FD1 /* BankAccount.json in Resources */ = {isa = PBXBuildFile; fileRef = 8BD213361F044B57007F6FD1 /* BankAccount.json */; }; 8BD213391F0457A1007F6FD1 /* FileUpload.json in Resources */ = {isa = PBXBuildFile; fileRef = 8BD213381F0457A1007F6FD1 /* FileUpload.json */; }; - 8BD2133C1F0458F5007F6FD1 /* BitcoinSource.json in Resources */ = {isa = PBXBuildFile; fileRef = 8BD2133B1F0458F5007F6FD1 /* BitcoinSource.json */; }; 8BD2133E1F045D31007F6FD1 /* SEPADebitSource.json in Resources */ = {isa = PBXBuildFile; fileRef = 8BD2133D1F045D31007F6FD1 /* SEPADebitSource.json */; }; 8BD87B881EFB131700269C2B /* STPSourceCardDetails+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD87B871EFB131400269C2B /* STPSourceCardDetails+Private.h */; }; 8BD87B891EFB131800269C2B /* STPSourceCardDetails+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD87B871EFB131400269C2B /* STPSourceCardDetails+Private.h */; }; @@ -2514,7 +2513,6 @@ C1CFCB7A1ED5F88D00BE45DF /* stp_test_upload_image.jpeg in Resources */, F152322F1EA9344600D65C67 /* iDEALSource.json in Resources */, F16AA26F1F5A0F1700207FFF /* AlipaySource.json in Resources */, - 8BD2133C1F0458F5007F6FD1 /* BitcoinSource.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Stripe/PublicHeaders/STPSourceEnums.h b/Stripe/PublicHeaders/STPSourceEnums.h index b5c500dcb27..1174806a0d7 100644 --- a/Stripe/PublicHeaders/STPSourceEnums.h +++ b/Stripe/PublicHeaders/STPSourceEnums.h @@ -106,11 +106,6 @@ typedef NS_ENUM(NSInteger, STPSourceType) { */ STPSourceTypeBancontact, - /** - A Bitcoin source. @see https://stripe.com/docs/sources/bitcoin - */ - STPSourceTypeBitcoin, - /** A card source. @see https://stripe.com/docs/sources/cards */ diff --git a/Stripe/PublicHeaders/STPSourceParams.h b/Stripe/PublicHeaders/STPSourceParams.h index 351d10ce267..eb33bd4a533 100644 --- a/Stripe/PublicHeaders/STPSourceParams.h +++ b/Stripe/PublicHeaders/STPSourceParams.h @@ -109,20 +109,6 @@ NS_ASSUME_NONNULL_BEGIN returnURL:(NSString *)returnURL statementDescriptor:(nullable NSString *)statementDescriptor; -/** - Creates params for a Bitcoin source. - @see https://stripe.com/docs/bitcoin#creating-and-displaying-a-source-object - - @param amount The amount to charge the customer. - @param currency The currency the payment is being created in. - @param email The customer's email address. - - @return an STPSourceParams object populated with the provided values. - */ -+ (STPSourceParams *)bitcoinParamsWithAmount:(NSUInteger)amount - currency:(NSString *)currency - email:(NSString *)email; - /** Creates params for a Card source. @see https://stripe.com/docs/sources/cards#create-source diff --git a/Stripe/STPSource.m b/Stripe/STPSource.m index 3db03df9d72..c845d35598c 100644 --- a/Stripe/STPSource.m +++ b/Stripe/STPSource.m @@ -52,7 +52,6 @@ @implementation STPSource + (NSDictionary *)stringToTypeMapping { return @{ @"bancontact": @(STPSourceTypeBancontact), - @"bitcoin": @(STPSourceTypeBitcoin), @"card": @(STPSourceTypeCard), @"giropay": @(STPSourceTypeGiropay), @"ideal": @(STPSourceTypeIDEAL), diff --git a/Stripe/STPSourceParams.m b/Stripe/STPSourceParams.m index 7c291f1c8e0..5db82d7738f 100644 --- a/Stripe/STPSourceParams.m +++ b/Stripe/STPSourceParams.m @@ -101,17 +101,6 @@ + (STPSourceParams *)bancontactParamsWithAmount:(NSUInteger)amount return params; } -+ (STPSourceParams *)bitcoinParamsWithAmount:(NSUInteger)amount - currency:(NSString *)currency - email:(NSString *)email { - STPSourceParams *params = [self new]; - params.type = STPSourceTypeBitcoin; - params.amount = @(amount); - params.currency = currency; - params.owner = @{ @"email": email }; - return params; -} - + (STPSourceParams *)cardParamsWithCard:(STPCardParams *)card { STPSourceParams *params = [self new]; params.type = STPSourceTypeCard; diff --git a/Tests/Tests/3DSSource.json b/Tests/Tests/3DSSource.json index 4417f2bcea9..bff1578344d 100644 --- a/Tests/Tests/3DSSource.json +++ b/Tests/Tests/3DSSource.json @@ -10,14 +10,36 @@ "livemode": false, "metadata": {}, "owner": { - "address": null, - "email": null, - "name": null, - "phone": null, - "verified_address": null, - "verified_email": null, - "verified_name": null, - "verified_phone": null + "address": { + "city": "Pittsburgh", + "country": "US", + "line1": "123 Fake St", + "line2": "Apt 1", + "postal_code": "19219", + "state": "PA" + }, + "email": "jenny.rosen@example.com", + "name": "Jenny Rosen", + "phone": "555-867-5309", + "verified_address": { + "city": "Pittsburgh", + "country": "US", + "line1": "123 Fake St", + "line2": "Apt 1", + "postal_code": "19219", + "state": "PA" + }, + "verified_email": "jenny.rosen@example.com", + "verified_name": "Jenny Rosen", + "verified_phone": "555-867-5309" + }, + "receiver": { + "address": "test_1MBhWS3uv4ynCfQXF3xQjJkzFPukr4K56N", + "amount_charged": 300, + "amount_received": 200, + "amount_returned": 100, + "refund_attributes_method": "email", + "refund_attributes_status": "missing" }, "redirect": { "return_url": "exampleappschema://stripe_callback", diff --git a/Tests/Tests/BitcoinSource.json b/Tests/Tests/BitcoinSource.json deleted file mode 100644 index 67c6a5aadc8..00000000000 --- a/Tests/Tests/BitcoinSource.json +++ /dev/null @@ -1,57 +0,0 @@ -// Source: https://stripe.com/docs/api#source_object -{ - "id": "src_1AZnr12eZvKYlo2Cl6OACPB1", - "object": "source", - "amount": 1000, - "client_secret": "src_client_secret_rAzjPq1N4nWJ1iVqxAzGZzix", - "created": 1498685863, - "currency": "usd", - "flow": "receiver", - "livemode": false, - "metadata": { - "order_id": "6735" - }, - "owner": { - "address": { - "city": "Pittsburgh", - "country": "US", - "line1": "123 Fake St", - "line2": "Apt 1", - "postal_code": "19219", - "state": "PA" - }, - "email": "jenny.rosen@example.com", - "name": "Jenny Rosen", - "phone": "555-867-5309", - "verified_address": { - "city": "Pittsburgh", - "country": "US", - "line1": "123 Fake St", - "line2": "Apt 1", - "postal_code": "19219", - "state": "PA" - }, - "verified_email": "jenny.rosen@example.com", - "verified_name": "Jenny Rosen", - "verified_phone": "555-867-5309" - }, - "receiver": { - "address": "test_1MBhWS3uv4ynCfQXF3xQjJkzFPukr4K56N", - "amount_charged": 300, - "amount_received": 200, - "amount_returned": 100, - "refund_attributes_method": "email", - "refund_attributes_status": "missing" - }, - "status": "pending", - "type": "bitcoin", - "usage": "single_use", - "bitcoin": { - "address": "test_1MBhWS3uv4ynCfQXF3xQjJkzFPukr4K56N", - "amount": 2371000, - "amount_charged": 0, - "amount_received": 0, - "amount_returned": 0, - "uri": "bitcoin:test_1MBhWS3uv4ynCfQXF3xQjJkzFPukr4K56N?amount=0.02371000" - } -} diff --git a/Tests/Tests/STPCustomerSourceTupleTest.m b/Tests/Tests/STPCustomerSourceTupleTest.m index 44f45bf22f2..0e546940af4 100644 --- a/Tests/Tests/STPCustomerSourceTupleTest.m +++ b/Tests/Tests/STPCustomerSourceTupleTest.m @@ -108,8 +108,7 @@ - (void)testSourceTupleCreationInvalidSourcesOnly { STPCustomer *customer = [STPFixtures customerWithSourcesFromJSONKeys:@[STPTestJSONSource3DS, STPTestJSONSourceAlipay, STPTestJSONSourceiDEAL, - STPTestJSONSourceSEPADebit, - STPTestJSONSourceBitcoin] + STPTestJSONSourceSEPADebit] defaultSource:STPTestJSONSourceiDEAL]; [self performSourceTupleTestWithCustomer:customer expectedValidSources:0 @@ -123,8 +122,7 @@ - (void)testSourceTupleCreationMixedValidAndInvalidSourcesWithInvalidDefaultSour STPTestJSONSourceCard, STPTestJSONSourceiDEAL, STPTestJSONSourceSEPADebit, - STPTestJSONCard, - STPTestJSONSourceBitcoin] + STPTestJSONCard] defaultSource:STPTestJSONSourceiDEAL]; [self performSourceTupleTestWithCustomer:customer @@ -138,8 +136,7 @@ - (void)testSourceTupleCreationMixedValidAndInvalidSourcesWithValidDefaultSource STPTestJSONSourceCard, STPTestJSONSourceiDEAL, STPTestJSONSourceSEPADebit, - STPTestJSONCard, - STPTestJSONSourceBitcoin] + STPTestJSONCard] defaultSource:STPTestJSONCard]; [self performSourceTupleTestWithCustomer:customer expectedValidSources:2 diff --git a/Tests/Tests/STPFixtures.h b/Tests/Tests/STPFixtures.h index 4445d063f72..81bcebb2b54 100644 --- a/Tests/Tests/STPFixtures.h +++ b/Tests/Tests/STPFixtures.h @@ -16,7 +16,6 @@ extern NSString *const STPTestJSONCustomer; extern NSString *const STPTestJSONCard; extern NSString *const STPTestJSONSourceAlipay; -extern NSString *const STPTestJSONSourceBitcoin; extern NSString *const STPTestJSONSourceCard; extern NSString *const STPTestJSONSource3DS; extern NSString *const STPTestJSONSourceiDEAL; diff --git a/Tests/Tests/STPFixtures.m b/Tests/Tests/STPFixtures.m index 1e8c4f2e900..b41af11a6ec 100644 --- a/Tests/Tests/STPFixtures.m +++ b/Tests/Tests/STPFixtures.m @@ -15,7 +15,6 @@ NSString *const STPTestJSONCard = @"Card"; NSString *const STPTestJSONSourceAlipay = @"AlipaySource"; -NSString *const STPTestJSONSourceBitcoin = @"BitcoinSource"; NSString *const STPTestJSONSourceCard = @"CardSource"; NSString *const STPTestJSONSource3DS = @"3DSSource"; NSString *const STPTestJSONSourceiDEAL = @"iDEALSource"; diff --git a/Tests/Tests/STPSourceFunctionalTest.m b/Tests/Tests/STPSourceFunctionalTest.m index 0e93db41afb..a52e54630fa 100644 --- a/Tests/Tests/STPSourceFunctionalTest.m +++ b/Tests/Tests/STPSourceFunctionalTest.m @@ -48,33 +48,6 @@ - (void)testCreateSource_bancontact { [self waitForExpectationsWithTimeout:5.0f handler:nil]; } -- (void)testCreateSource_bitcoin { - STPSourceParams *params = [STPSourceParams bitcoinParamsWithAmount:1000 - currency:@"usd" - email:@"user@example.com"]; - params.metadata = @{@"foo": @"bar"}; - - STPAPIClient *client = [[STPAPIClient alloc] initWithPublishableKey:apiKey]; - XCTestExpectation *expectation = [self expectationWithDescription:@"Source creation"]; - [client createSourceWithParams:params completion:^(STPSource *source, NSError * error) { - XCTAssertNil(error); - XCTAssertNotNil(source); - XCTAssertEqual(source.type, STPSourceTypeBitcoin); - XCTAssertEqualObjects(source.amount, params.amount); - XCTAssertEqualObjects(source.currency, params.currency); - XCTAssertEqualObjects(source.owner.email, params.owner[@"email"]); - XCTAssertEqualObjects(source.metadata, params.metadata); - XCTAssertNotNil(source.receiver); - XCTAssertNotNil(source.receiver.address); - XCTAssertNotNil(source.receiver.amountCharged); - XCTAssertNotNil(source.receiver.amountReceived); - XCTAssertNotNil(source.receiver.amountReturned); - - [expectation fulfill]; - }]; - [self waitForExpectationsWithTimeout:5.0f handler:nil]; -} - - (void)testCreateSource_card { STPCardParams *card = [[STPCardParams alloc] init]; card.number = @"4242 4242 4242 4242"; diff --git a/Tests/Tests/STPSourceOwnerTest.m b/Tests/Tests/STPSourceOwnerTest.m index 6a9a66b786a..130880c96fe 100644 --- a/Tests/Tests/STPSourceOwnerTest.m +++ b/Tests/Tests/STPSourceOwnerTest.m @@ -11,6 +11,7 @@ #import "STPSourceOwner.h" #import "STPAddress.h" +#import "STPFixtures.h" #import "STPTestUtils.h" @interface STPSourceOwnerTest : XCTestCase @@ -25,17 +26,17 @@ - (void)testDecodedObjectFromAPIResponseRequiredFields { NSArray *requiredFields = @[]; for (NSString *field in requiredFields) { - NSMutableDictionary *response = [[STPTestUtils jsonNamed:@"BitcoinSource"][@"owner"] mutableCopy]; + NSMutableDictionary *response = [[STPTestUtils jsonNamed:STPTestJSONSource3DS][@"owner"] mutableCopy]; [response removeObjectForKey:field]; XCTAssertNil([STPSourceOwner decodedObjectFromAPIResponse:response]); } - XCTAssert([STPSourceOwner decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"][@"owner"]]); + XCTAssert([STPSourceOwner decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:STPTestJSONSource3DS][@"owner"]]); } - (void)testDecodedObjectFromAPIResponseMapping { - NSDictionary *response = [STPTestUtils jsonNamed:@"BitcoinSource"][@"owner"]; + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSource3DS][@"owner"]; STPSourceOwner *owner = [STPSourceOwner decodedObjectFromAPIResponse:response]; XCTAssertEqualObjects(owner.address.city, @"Pittsburgh"); diff --git a/Tests/Tests/STPSourceParamsTest.m b/Tests/Tests/STPSourceParamsTest.m index 73c8008e44a..973bc49e387 100644 --- a/Tests/Tests/STPSourceParamsTest.m +++ b/Tests/Tests/STPSourceParamsTest.m @@ -44,9 +44,6 @@ - (void)testType { sourceParams.rawTypeString = @"bancontact"; XCTAssertEqual(sourceParams.type, STPSourceTypeBancontact); - sourceParams.rawTypeString = @"bitcoin"; - XCTAssertEqual(sourceParams.type, STPSourceTypeBitcoin); - sourceParams.rawTypeString = @"card"; XCTAssertEqual(sourceParams.type, STPSourceTypeCard); @@ -85,9 +82,6 @@ - (void)testSetType { sourceParams.type = STPSourceTypeBancontact; XCTAssertEqualObjects(sourceParams.rawTypeString, @"bancontact"); - sourceParams.type = STPSourceTypeBitcoin; - XCTAssertEqualObjects(sourceParams.rawTypeString, @"bitcoin"); - sourceParams.type = STPSourceTypeCard; XCTAssertEqualObjects(sourceParams.rawTypeString, @"card"); diff --git a/Tests/Tests/STPSourceReceiverTest.m b/Tests/Tests/STPSourceReceiverTest.m index 286a9704d9c..63104323f58 100644 --- a/Tests/Tests/STPSourceReceiverTest.m +++ b/Tests/Tests/STPSourceReceiverTest.m @@ -10,6 +10,7 @@ #import "STPSourceReceiver.h" +#import "STPFixtures.h" #import "STPTestUtils.h" @interface STPSourceReceiverTest : XCTestCase @@ -21,7 +22,7 @@ @implementation STPSourceReceiverTest #pragma mark - Description Tests - (void)testDescription { - STPSourceReceiver *receiver = [STPSourceReceiver decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"][@"receiver"]]; + STPSourceReceiver *receiver = [STPSourceReceiver decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:STPTestJSONSource3DS][@"receiver"]]; XCTAssert(receiver.description); } @@ -33,17 +34,17 @@ - (void)testDecodedObjectFromAPIResponseRequiredFields { ]; for (NSString *field in requiredFields) { - NSMutableDictionary *response = [[STPTestUtils jsonNamed:@"BitcoinSource"][@"receiver"] mutableCopy]; + NSMutableDictionary *response = [[STPTestUtils jsonNamed:STPTestJSONSource3DS][@"receiver"] mutableCopy]; [response removeObjectForKey:field]; XCTAssertNil([STPSourceReceiver decodedObjectFromAPIResponse:response]); } - XCTAssert([STPSourceReceiver decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"][@"receiver"]]); + XCTAssert([STPSourceReceiver decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:STPTestJSONSource3DS][@"receiver"]]); } - (void)testDecodedObjectFromAPIResponseMapping { - NSDictionary *response = [STPTestUtils jsonNamed:@"BitcoinSource"][@"receiver"]; + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSource3DS][@"receiver"]; STPSourceReceiver *receiver = [STPSourceReceiver decodedObjectFromAPIResponse:response]; XCTAssertEqualObjects(receiver.address, @"test_1MBhWS3uv4ynCfQXF3xQjJkzFPukr4K56N"); diff --git a/Tests/Tests/STPSourceTest.m b/Tests/Tests/STPSourceTest.m index 540ee514c4f..1d6c28240bf 100644 --- a/Tests/Tests/STPSourceTest.m +++ b/Tests/Tests/STPSourceTest.m @@ -11,8 +11,11 @@ #import "STPSource.h" #import "STPSource+Private.h" +#import "STPFixtures.h" #import "STPTestUtils.h" +#import "NSDictionary+Stripe.h" + @interface STPSource () + (STPSourceFlow)flowFromString:(NSString *)string; @@ -36,9 +39,6 @@ - (void)testTypeFromString { XCTAssertEqual([STPSource typeFromString:@"bancontact"], STPSourceTypeBancontact); XCTAssertEqual([STPSource typeFromString:@"BANCONTACT"], STPSourceTypeBancontact); - XCTAssertEqual([STPSource typeFromString:@"bitcoin"], STPSourceTypeBitcoin); - XCTAssertEqual([STPSource typeFromString:@"BITCOIN"], STPSourceTypeBitcoin); - XCTAssertEqual([STPSource typeFromString:@"card"], STPSourceTypeCard); XCTAssertEqual([STPSource typeFromString:@"CARD"], STPSourceTypeCard); @@ -73,7 +73,6 @@ - (void)testTypeFromString { - (void)testStringFromType { NSArray *values = @[ @(STPSourceTypeBancontact), - @(STPSourceTypeBitcoin), @(STPSourceTypeCard), @(STPSourceTypeGiropay), @(STPSourceTypeIDEAL), @@ -93,9 +92,6 @@ - (void)testStringFromType { case STPSourceTypeBancontact: XCTAssertEqualObjects(string, @"bancontact"); break; - case STPSourceTypeBitcoin: - XCTAssertEqualObjects(string, @"bitcoin"); - break; case STPSourceTypeCard: XCTAssertEqualObjects(string, @"card"); break; @@ -279,8 +275,8 @@ - (void)testStringFromUsage { #pragma mark - Equality Tests - (void)testSourceEquals { - STPSource *source1 = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"]]; - STPSource *source2 = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"]]; + STPSource *source1 = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"AlipaySource"]]; + STPSource *source2 = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"AlipaySource"]]; XCTAssertNotEqual(source1, source2); @@ -294,7 +290,7 @@ - (void)testSourceEquals { #pragma mark - Description Tests - (void)testDescription { - STPSource *source = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"]]; + STPSource *source = [STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"AlipaySource"]]; XCTAssert(source.description); } @@ -309,119 +305,92 @@ - (void)testDecodedObjectFromAPIResponseRequiredFields { ]; for (NSString *field in requiredFields) { - NSMutableDictionary *response = [[STPTestUtils jsonNamed:@"BitcoinSource"] mutableCopy]; + NSMutableDictionary *response = [[STPTestUtils jsonNamed:@"AlipaySource"] mutableCopy]; [response removeObjectForKey:field]; XCTAssertNil([STPSource decodedObjectFromAPIResponse:response]); } - XCTAssert([STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"BitcoinSource"]]); + XCTAssert([STPSource decodedObjectFromAPIResponse:[STPTestUtils jsonNamed:@"AlipaySource"]]); } -- (void)testDecodedObjectFromAPIResponseMapping { - NSDictionary *response = [STPTestUtils jsonNamed:@"BitcoinSource"]; +- (void)testDecodingSource_3ds { + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSource3DS]; STPSource *source = [STPSource decodedObjectFromAPIResponse:response]; - - XCTAssertEqualObjects(source.stripeID, @"src_1AZnr12eZvKYlo2Cl6OACPB1"); - XCTAssertEqualObjects(source.amount, @(1000)); - XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_rAzjPq1N4nWJ1iVqxAzGZzix"); - XCTAssertEqualObjects(source.created, [NSDate dateWithTimeIntervalSince1970:1498685863]); - XCTAssertEqualObjects(source.currency, @"usd"); - XCTAssertEqual(source.flow, STPSourceFlowReceiver); - XCTAssertFalse(source.livemode); - XCTAssertEqualObjects(source.metadata, @{@"order_id": @"6735"}); + XCTAssertEqualObjects(source.stripeID, @"src_456"); + XCTAssertEqualObjects(source.amount, @1099); + XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_456"); + XCTAssertEqualWithAccuracy([source.created timeIntervalSince1970], 1483663790.0, 1.0); + XCTAssertEqualObjects(source.currency, @"eur"); + XCTAssertEqual(source.flow, STPSourceFlowRedirect); + XCTAssertEqual(source.livemode, NO); + XCTAssertEqualObjects(source.metadata, @{}); XCTAssert(source.owner); // STPSourceOwnerTest XCTAssert(source.receiver); // STPSourceReceiverTest + XCTAssert(source.redirect); // STPSourceRedirectTest XCTAssertEqual(source.status, STPSourceStatusPending); - XCTAssertEqual(source.type, STPSourceTypeBitcoin); + XCTAssertEqual(source.type, STPSourceTypeThreeDSecure); XCTAssertEqual(source.usage, STPSourceUsageSingleUse); - XCTAssertEqualObjects(source.details, response[@"bitcoin"]); - - XCTAssertNotEqual(source.allResponseFields, response); - XCTAssertEqualObjects(source.allResponseFields, response); + XCTAssertNil(source.verification); + XCTAssertEqualObjects(source.details, [response[@"three_d_secure"] stp_dictionaryByRemovingNulls]); + XCTAssertNil(source.cardDetails); // STPSourceCardDetailsTest + XCTAssertNil(source.sepaDebitDetails); // STPSourceSEPADebitDetailsTest + XCTAssertNotEqual(source.allResponseFields, response); // Verify is copy + XCTAssertEqualObjects(source.allResponseFields, [response stp_dictionaryByRemovingNulls]); } -- (NSDictionary *)buildTestResponse_ideal { - // Source: https://stripe.com/docs/sources/ideal - NSDictionary *dict = @{ - @"id": @"src_123", - @"object": @"source", - @"amount": @1099, - @"client_secret": @"src_client_secret_123", - @"created": @1445277809, - @"currency": @"eur", - @"flow": @"redirect", - @"livemode": @YES, - @"owner": @{ - @"address": [NSNull null], - @"email": [NSNull null], - @"name": @"Jenny Rosen", - @"phone": [NSNull null], - @"verified_address": [NSNull null], - @"verified_email": [NSNull null], - @"verified_name": @"Jenny Rosen", - @"verified_phone": [NSNull null], - }, - @"redirect": @{ - @"return_url": @"https://shop.foo.com/crtABC", - @"status": @"pending", - @"url": @"https://pay.stripe.com/redirect/src_123?client_secret=src_client_secret_123" - }, - @"status": @"pending", - @"type": @"ideal", - @"usage": @"single_use", - @"ideal": @{ - @"bank": @"ing" - } - }; - return dict; +- (void)testDecodingSource_alipay { + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSourceAlipay]; + STPSource *source = [STPSource decodedObjectFromAPIResponse:response]; + XCTAssertEqualObjects(source.stripeID, @"src_123"); + XCTAssertEqualObjects(source.amount, @1099); + XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_123"); + XCTAssertEqualWithAccuracy([source.created timeIntervalSince1970], 1445277809.0, 1.0); + XCTAssertEqualObjects(source.currency, @"usd"); + XCTAssertEqual(source.flow, STPSourceFlowRedirect); + XCTAssertEqual(source.livemode, YES); + XCTAssertNil(source.metadata); + XCTAssert(source.owner); // STPSourceOwnerTest + XCTAssertNil(source.receiver); // STPSourceReceiverTest + XCTAssert(source.redirect); // STPSourceRedirectTest + XCTAssertEqual(source.status, STPSourceStatusPending); + XCTAssertEqual(source.type, STPSourceTypeAlipay); + XCTAssertEqual(source.usage, STPSourceUsageSingleUse); + XCTAssertNil(source.verification); + XCTAssertEqualObjects(source.details, [response[@"alipay"] stp_dictionaryByRemovingNulls]); + XCTAssertNil(source.cardDetails); // STPSourceCardDetailsTest + XCTAssertNil(source.sepaDebitDetails); // STPSourceSEPADebitDetailsTest + XCTAssertNotEqual(source.allResponseFields, response); // Verify is copy + XCTAssertEqualObjects(source.allResponseFields, [response stp_dictionaryByRemovingNulls]); } -- (NSDictionary *)buildTestResponse_sepa_debit { - // Source: https://stripe.com/docs/sources/sepa-debit - NSDictionary *dict = @{ - @"id": @"src_123", - @"object": @"source", - @"amount": [NSNull null], - @"client_secret": @"src_client_secret_123", - @"created": @1445277809, - @"currency": @"eur", - @"flow": @"none", - @"livemode": @NO, - @"owner": @{ - @"address": @{ - @"city": @"Berlin", - @"country": @"DE", - @"line1": @"Nollendorfstraße 27", - @"line2": [NSNull null], - @"postal_code": @"10777", - @"state": [NSNull null] - }, - @"email": [NSNull null], - @"name": @"Jenny Rosen", - @"phone": [NSNull null], - @"verified_address": [NSNull null], - @"verified_email": [NSNull null], - @"verified_name": [NSNull null], - @"verified_phone": [NSNull null], - }, - @"status": @"chargeable", - @"type": @"sepa_debit", - @"usage": @"reusable", - @"sepa_debit": @{ - @"bank_code": @37040044, - @"country": @"DE", - @"fingerprint": @"NxdSyRegc9PsMkWy", - @"last4": @3001, - @"mandate_reference": @"NXDSYREGC9PSMKWY", - @"mandate_url": @"https://hooks.stripe.com/adapter/sepa_debit/file/src_123/src_client_secret_123" - } - }; - return dict; +- (void)testDecodingSource_card { + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSourceCard]; + STPSource *source = [STPSource decodedObjectFromAPIResponse:response]; + XCTAssertEqualObjects(source.stripeID, @"src_123"); + XCTAssertNil(source.amount); + XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_123"); + XCTAssertEqualWithAccuracy([source.created timeIntervalSince1970], 1483575790.0, 1.0); + XCTAssertNil(source.currency); + XCTAssertEqual(source.flow, STPSourceFlowNone); + XCTAssertEqual(source.livemode, NO); + XCTAssertEqualObjects(source.metadata, @{}); + XCTAssert(source.owner); // STPSourceOwnerTest + XCTAssertNil(source.receiver); // STPSourceReceiverTest + XCTAssertNil(source.redirect); // STPSourceRedirectTest + XCTAssertEqual(source.status, STPSourceStatusChargeable); + XCTAssertEqual(source.type, STPSourceTypeCard); + XCTAssertEqual(source.usage, STPSourceUsageReusable); + XCTAssertNil(source.verification); + XCTAssertEqualObjects(source.details, response[@"card"]); + XCTAssert(source.cardDetails); // STPSourceCardDetailsTest + XCTAssertNil(source.sepaDebitDetails); // STPSourceSEPADebitDetailsTest + XCTAssertNotEqual(source.allResponseFields, response); // Verify is copy + XCTAssertEqualObjects(source.allResponseFields, [response stp_dictionaryByRemovingNulls]); } - (void)testDecodingSource_ideal { - NSDictionary *response = [self buildTestResponse_ideal]; + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSourceiDEAL]; STPSource *source = [STPSource decodedObjectFromAPIResponse:response]; XCTAssertEqualObjects(source.stripeID, @"src_123"); XCTAssertEqualObjects(source.amount, @1099); @@ -430,36 +399,46 @@ - (void)testDecodingSource_ideal { XCTAssertEqualObjects(source.currency, @"eur"); XCTAssertEqual(source.flow, STPSourceFlowRedirect); XCTAssertEqual(source.livemode, YES); - XCTAssertEqualObjects(source.owner.name, @"Jenny Rosen"); - XCTAssertEqualObjects(source.owner.verifiedName, @"Jenny Rosen"); - XCTAssertEqual(source.redirect.status, STPSourceRedirectStatusPending); - XCTAssertEqualObjects(source.redirect.returnURL, [NSURL URLWithString:@"https://shop.foo.com/crtABC"]); - XCTAssertEqualObjects(source.redirect.url, [NSURL URLWithString:@"https://pay.stripe.com/redirect/src_123?client_secret=src_client_secret_123"]); + XCTAssertNil(source.metadata); + XCTAssert(source.owner); // STPSourceOwnerTest + XCTAssertNil(source.receiver); // STPSourceReceiverTest + XCTAssert(source.redirect); // STPSourceRedirectTest XCTAssertEqual(source.status, STPSourceStatusPending); XCTAssertEqual(source.type, STPSourceTypeIDEAL); XCTAssertEqual(source.usage, STPSourceUsageSingleUse); + XCTAssertNil(source.verification); XCTAssertEqualObjects(source.details, response[@"ideal"]); + XCTAssertNil(source.cardDetails); // STPSourceCardDetailsTest + XCTAssertNil(source.sepaDebitDetails); // STPSourceSEPADebitDetailsTest + XCTAssertNotEqual(source.allResponseFields, response); // Verify is copy + XCTAssertEqualObjects(source.allResponseFields, [response stp_dictionaryByRemovingNulls]); } - (void)testDecodingSource_sepa_debit { - NSDictionary *response = [self buildTestResponse_sepa_debit]; + NSDictionary *response = [STPTestUtils jsonNamed:STPTestJSONSourceSEPADebit]; STPSource *source = [STPSource decodedObjectFromAPIResponse:response]; - XCTAssertEqualObjects(source.stripeID, @"src_123"); + XCTAssertEqualObjects(source.stripeID, @"src_18HgGjHNCLa1Vra6Y9TIP6tU"); XCTAssertNil(source.amount); - XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_123"); - XCTAssertEqualWithAccuracy([source.created timeIntervalSince1970], 1445277809.0, 1.0); + XCTAssertEqualObjects(source.clientSecret, @"src_client_secret_XcBmS94nTg5o0xc9MSliSlDW"); + XCTAssertEqualWithAccuracy([source.created timeIntervalSince1970], 1464803577.0, 1.0); XCTAssertEqualObjects(source.currency, @"eur"); XCTAssertEqual(source.flow, STPSourceFlowNone); XCTAssertEqual(source.livemode, NO); + XCTAssertNil(source.metadata); XCTAssertEqualObjects(source.owner.name, @"Jenny Rosen"); - XCTAssertEqualObjects(source.owner.address.city, @"Berlin"); - XCTAssertEqualObjects(source.owner.address.country, @"DE"); - XCTAssertEqualObjects(source.owner.address.line1, @"Nollendorfstraße 27"); - XCTAssertEqualObjects(source.owner.address.postalCode, @"10777"); + XCTAssert(source.owner); // STPSourceOwnerTest + XCTAssertNil(source.receiver); // STPSourceReceiverTest + XCTAssertNil(source.redirect); // STPSourceRedirectTest XCTAssertEqual(source.status, STPSourceStatusChargeable); XCTAssertEqual(source.type, STPSourceTypeSEPADebit); XCTAssertEqual(source.usage, STPSourceUsageReusable); + XCTAssertEqualObjects(source.verification.attemptsRemaining, @5); + XCTAssertEqual(source.verification.status, STPSourceVerificationStatusPending); XCTAssertEqualObjects(source.details, response[@"sepa_debit"]); + XCTAssertNil(source.cardDetails); // STPSourceCardDetailsTest + XCTAssert(source.sepaDebitDetails); // STPSourceSEPADebitDetailsTest + XCTAssertNotEqual(source.allResponseFields, response); // Verify is copy + XCTAssertEqualObjects(source.allResponseFields, [response stp_dictionaryByRemovingNulls]); } @end diff --git a/Tests/Tests/iDEALSource.json b/Tests/Tests/iDEALSource.json index 0ec39937038..335e814fd9f 100644 --- a/Tests/Tests/iDEALSource.json +++ b/Tests/Tests/iDEALSource.json @@ -1,3 +1,4 @@ +// Source: https://stripe.com/docs/sources/ideal { "id": "src_123", "object": "source",