diff --git a/Stripe.xcodeproj/project.pbxproj b/Stripe.xcodeproj/project.pbxproj index 516a0a1918..02db5797ee 100644 --- a/Stripe.xcodeproj/project.pbxproj +++ b/Stripe.xcodeproj/project.pbxproj @@ -300,7 +300,6 @@ 31C5B873252E773100A481A7 /* STPPaymentOptionsViewControllerLocalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111C391252BC78C00207E32 /* STPPaymentOptionsViewControllerLocalizationTests.swift */; }; 31C5B87C252E859300A481A7 /* STPPaymentConfigurationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B013C881F1E784A00DD831B /* STPPaymentConfigurationTest.m */; }; 31C5B87E252E869D00A481A7 /* StripeErrorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111C3F8252BC79D00207E32 /* StripeErrorTest.swift */; }; - 31C5B886252E9AD200A481A7 /* STPAnalyticsClientTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C124A1841CCAB750007D42EE /* STPAnalyticsClientTest.m */; }; 31C5B888252E9C7400A481A7 /* STPCustomerContextTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C1E4F8051EBBEB0F00E611F5 /* STPCustomerContextTest.m */; }; 31C5B88A252E9DBB00A481A7 /* STPEphemeralKeyManagerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C184107D1EC2704700178149 /* STPEphemeralKeyManagerTest.m */; }; 31C5B88C252E9E0600A481A7 /* STPLabeledFormTextFieldViewSnapshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 36AEBFBD241C3B7500CFCAE8 /* STPLabeledFormTextFieldViewSnapshotTests.m */; }; @@ -1347,7 +1346,6 @@ C1054F901FE197AE0033C87E /* STPPaymentContextSnapshotTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = STPPaymentContextSnapshotTests.m; sourceTree = ""; }; C1080F4B1CBED48A007B2D89 /* STPAddressTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPAddressTests.m; sourceTree = ""; }; C11B14961E8AE316000F760C /* OCMock.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OCMock.xcframework; path = Carthage/Build/OCMock.xcframework; sourceTree = ""; }; - C124A1841CCAB750007D42EE /* STPAnalyticsClientTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPAnalyticsClientTest.m; sourceTree = ""; }; C17D24ED1E37DBAC005CB188 /* STPSourceTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPSourceTest.m; sourceTree = ""; }; C184107D1EC2704700178149 /* STPEphemeralKeyManagerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STPEphemeralKeyManagerTest.m; sourceTree = ""; }; C18867D91E8B0C4100A77634 /* STPFixtures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = STPFixtures.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -2451,7 +2449,6 @@ 3111C3BA252BC79300207E32 /* STPAddressViewModelTest.swift */, E61BEEAF265F6CAC0002FA4F /* STPAnalyticsClientPaymentSheetTest.swift */, E61BEEAD265F6BDC0002FA4F /* STPAnalyticsClientPaymentsTest.swift */, - C124A1841CCAB750007D42EE /* STPAnalyticsClientTest.m */, B65E74AB258930500080D9B3 /* STPAnalyticsClientTest.swift */, 3111C3A9252BC79000207E32 /* STPAPIClientTest.swift */, 3111C401252BC79F00207E32 /* STPApplePayContextTest.swift */, @@ -3045,7 +3042,6 @@ 3111C58D252BEC9900207E32 /* STPNumericStringValidatorTests.swift in Sources */, 3667949025B790250094831B /* STPCardFormViewTests.swift in Sources */, 3111C55F252BDB0000207E32 /* NSString+StripeTest.swift in Sources */, - 31C5B886252E9AD200A481A7 /* STPAnalyticsClientTest.m in Sources */, 3111C56B252BDD5000207E32 /* FBSnapshotTestCase+STPViewControllerLoading.swift in Sources */, 31C5B898252EA19200A481A7 /* STPImageLibraryTest.m in Sources */, 368E1F6D254CC87300150A2D /* STPPostalCodeInputTextFieldSnapshotTests.swift in Sources */, diff --git a/Tests/Tests/STPAnalyticsClientPaymentsTest.swift b/Tests/Tests/STPAnalyticsClientPaymentsTest.swift index dd2719a4cd..5ef535b394 100644 --- a/Tests/Tests/STPAnalyticsClientPaymentsTest.swift +++ b/Tests/Tests/STPAnalyticsClientPaymentsTest.swift @@ -99,6 +99,88 @@ class STPAnalyticsClientPaymentsTest: XCTestCase { XCTAssertNotNil(payload["product_usage"]) } + func testTokenTypeFromParameters() { + let card = STPFixtures.cardParams() + let cardDict = buildTokenParams(card) + XCTAssertEqual(STPAnalyticsClient.tokenType(fromParameters: cardDict), "card") + + let account = STPFixtures.accountParams() + let accountDict = buildTokenParams(account) + XCTAssertEqual(STPAnalyticsClient.tokenType(fromParameters: accountDict), "account") + + let bank = STPFixtures.bankAccountParams() + let bankDict = buildTokenParams(bank) + XCTAssertEqual(STPAnalyticsClient.tokenType(fromParameters: bankDict), "bank_account"); + + let applePay = STPFixtures.applePayPayment() + let applePayDict = addTelemetry(STPAPIClient.shared.parameters(for: applePay)) + XCTAssertEqual(STPAnalyticsClient.tokenType(fromParameters: applePayDict), "apple_pay") + } + + // MARK: - Tests various classes report usage + + func testCardTextFieldAddsUsage() { + let _ = STPPaymentCardTextField() + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPPaymentCardTextField")) + } + + func testPaymentContextAddsUsage() { + let keyManager = STPEphemeralKeyManager(keyProvider: MockKeyProvider(), apiVersion: "1", performsEagerFetching: false) + let apiClient = STPAPIClient() + let customerContext = STPCustomerContext.init(keyManager: keyManager, apiClient: apiClient) + let _ = STPPaymentContext(customerContext: customerContext) + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPCustomerContext")) + } + + func testApplePayContextAddsUsage() { + let _ = STPApplePayContext(paymentRequest: STPFixtures.applePayRequest(), delegate: nil) + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPApplePayContext")) + } + + func testCustomerContextAddsUsage() { + let keyManager = STPEphemeralKeyManager(keyProvider: MockKeyProvider(), apiVersion: "1", performsEagerFetching: false) + let apiClient = STPAPIClient() + let _ = STPCustomerContext(keyManager: keyManager, apiClient: apiClient) + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPCustomerContext")) + } + + func testAddCardVCAddsUsage() { + let _ = STPAddCardViewController() + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPAddCardViewController")) + } + + func testBankSelectionVCAddsUsage() { + let _ = STPBankSelectionViewController() + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPBankSelectionViewController")) + } + + func testShippingVCAddsUsage() { + let config = STPFixtures.paymentConfiguration() + config.requiredShippingAddressFields = [STPContactField.postalAddress] + let _ = STPShippingAddressViewController( + configuration: config, + theme: .defaultTheme, + currency: nil, + shippingAddress: nil, + selectedShippingMethod: nil, + prefilledInformation: nil + ) + XCTAssertTrue(STPAnalyticsClient.sharedClient.productUsage.contains("STPShippingAddressViewController")) + } +} + +// MARK - Helpers + +private extension STPAnalyticsClientPaymentsTest { + func buildTokenParams(_ object: T) -> [String: Any] { + return addTelemetry(STPFormEncoder.dictionary(forObject: object)) + } + + func addTelemetry(_ params: [String: Any]) -> [String: Any] { + // STPAPIClient adds these before determining the token type, + // so do the same in the test + return STPTelemetryClient.shared.paramsByAddingTelemetryFields(toParams: params) + } } // MARK: - Mock types @@ -119,3 +201,11 @@ private struct MockAnalyticsClass1: STPAnalyticsProtocol { private struct MockAnalyticsClass2: STPAnalyticsProtocol { static let stp_analyticsIdentifier = "MockAnalyticsClass2" } + +private class MockKeyProvider: NSObject, STPEphemeralKeyProvider { + func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) { + guard apiVersion == "1" else { return } + + completion(nil, NSError.stp_genericConnectionError()) + } +} diff --git a/Tests/Tests/STPAnalyticsClientTest.m b/Tests/Tests/STPAnalyticsClientTest.m deleted file mode 100644 index 21daed688e..0000000000 --- a/Tests/Tests/STPAnalyticsClientTest.m +++ /dev/null @@ -1,121 +0,0 @@ -// -// STPAnalyticsClientTest.m -// Stripe -// -// Created by Ben Guo on 4/22/16. -// Copyright © 2016 Stripe, Inc. All rights reserved. -// - -#import - -#import "STPFixtures.h" - - -@interface STPAPIClient (Testing) -+ (NSDictionary *)parametersForPayment:(PKPayment *)payment; -@end - -@interface STPAnalyticsClient (Testing) -+ (BOOL)shouldCollectAnalytics; -@property (nonatomic) NSSet *productUsage; -@end - -@interface STPAnalyticsClientTest : XCTestCase - -@end - -@implementation STPAnalyticsClientTest - -- (void)testShouldCollectAnalytics_alwaysFalseInTest { - XCTAssertFalse([STPAnalyticsClient shouldCollectAnalytics]); -} - -- (void)testTokenTypeFromParameters { - STPCardParams *card = [STPFixtures cardParams]; - NSDictionary *cardDict = [self buildTokenParams:card]; - XCTAssertEqualObjects([STPAnalyticsClient tokenTypeFromParameters:cardDict], @"card"); - - STPConnectAccountParams *account = [STPFixtures accountParams]; - NSDictionary *accountDict = [self buildTokenParams:account]; - XCTAssertEqualObjects([STPAnalyticsClient tokenTypeFromParameters:accountDict], @"account"); - - STPBankAccountParams *bank = [STPFixtures bankAccountParams]; - NSDictionary *bankDict = [self buildTokenParams:bank]; - XCTAssertEqualObjects([STPAnalyticsClient tokenTypeFromParameters:bankDict], @"bank_account"); - - PKPayment *applePay = [STPFixtures applePayPayment]; - NSDictionary *applePayDict = [self addTelemetry:[[STPAPIClient sharedClient] parametersForPayment:applePay]]; - XCTAssertEqualObjects([STPAnalyticsClient tokenTypeFromParameters:applePayDict], @"apple_pay"); -} - -#pragma mark - Tests various classes report usage - -- (void)testCardTextFieldAddsUsage { - __unused STPPaymentCardTextField *_ = [[STPPaymentCardTextField alloc] init]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPPaymentCardTextField"]); -} - -- (id)mockKeyProvider { - id mockKeyProvider = OCMProtocolMock(@protocol(STPEphemeralKeyProvider)); - OCMStub([mockKeyProvider createCustomerKeyWithAPIVersion:[OCMArg isEqual:@"1"] - completion:[OCMArg any]]) - .andDo(^(NSInvocation *invocation) { - __unsafe_unretained STPJSONResponseCompletionBlock completion; - [invocation getArgument:&completion atIndex:3]; - completion(nil, [NSError stp_genericConnectionError]); - }); - return mockKeyProvider; -} - -- (void)testPaymentContextAddsUsage{ - STPEphemeralKeyManager *keyManager = [[STPEphemeralKeyManager alloc] initWithKeyProvider:[self mockKeyProvider] apiVersion:@"1" performsEagerFetching:NO]; - STPAPIClient *apiClient = [STPAPIClient new]; - STPCustomerContext *customerContext = [[STPCustomerContext alloc] initWithKeyManager:keyManager apiClient:apiClient]; - __unused STPPaymentContext *_ = [[STPPaymentContext alloc] initWithCustomerContext:customerContext]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPCustomerContext"]); -} - -- (void)testApplePayContextAddsUsage{ - id delegate; - __unused STPApplePayContext *_ = [[STPApplePayContext alloc] initWithPaymentRequest:[STPFixtures applePayRequest] delegate:delegate]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPApplePayContext"]); -} - -- (void)testCustomerContextAddsUsage { - STPEphemeralKeyManager *keyManager = [[STPEphemeralKeyManager alloc] initWithKeyProvider:[self mockKeyProvider] apiVersion:@"1" performsEagerFetching:NO]; - STPAPIClient *apiClient = [STPAPIClient new]; - __unused STPCustomerContext *_ = [[STPCustomerContext alloc] initWithKeyManager:keyManager apiClient:apiClient]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPCustomerContext"]); -} - - -- (void)testAddCardVCAddsUsage { - __unused STPAddCardViewController *_ = [[STPAddCardViewController alloc] init]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPAddCardViewController"]); -} - -- (void)testBankSelectionVCAddsUsage { - __unused STPBankSelectionViewController *_ = [[STPBankSelectionViewController alloc] init]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPBankSelectionViewController"]); -} - -- (void)testShippingVCAddsUsage { - STPPaymentConfiguration *config = [STPFixtures paymentConfiguration]; - config.requiredShippingAddressFields = [NSSet setWithObject:STPContactField.postalAddress]; - __unused STPShippingAddressViewController *_ = [[STPShippingAddressViewController alloc] initWithConfiguration:config theme:[STPTheme defaultTheme] currency:nil shippingAddress:nil selectedShippingMethod:nil prefilledInformation:nil]; - XCTAssertTrue([[STPAnalyticsClient sharedClient].productUsage containsObject:@"STPShippingAddressViewController"]); -} - -#pragma mark - Helpers - -- (NSDictionary *)buildTokenParams:(nonnull NSObject *)object { - return [self addTelemetry:[STPFormEncoder dictionaryForObject:object]]; -} - -- (NSDictionary *)addTelemetry:(NSDictionary *)params { - // STPAPIClient adds these before determining the token type, - // so do the same in the test - return [[STPTelemetryClient sharedInstance] paramsByAddingTelemetryFieldsToParams:params]; -} - -@end diff --git a/Tests/Tests/STPAnalyticsClientTest.swift b/Tests/Tests/STPAnalyticsClientTest.swift index 7be06140c1..7442739fb5 100644 --- a/Tests/Tests/STPAnalyticsClientTest.swift +++ b/Tests/Tests/STPAnalyticsClientTest.swift @@ -11,10 +11,14 @@ import XCTest @testable import Stripe -class STPAnalyticsClientTestSwift: XCTestCase { +class STPAnalyticsClientTest: XCTestCase { + + func testShouldCollectAnalytics_alwaysFalseInTest() { + XCTAssertFalse(STPAnalyticsClient.shouldCollectAnalytics()) + } + + // MARK: - Test serialization - // TODO(mludowise|MOBILESDK-292): Migrate objc tests to swift - func testSerializeError() { let userInfo = [ "key1": "value1",