diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsEvent+ApplicationPassword.swift b/WooCommerce/Classes/Analytics/WooAnalyticsEvent+ApplicationPassword.swift index c9f65f6d345..3897a2ed1ad 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsEvent+ApplicationPassword.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsEvent+ApplicationPassword.swift @@ -5,6 +5,7 @@ extension WooAnalyticsEvent { private enum Key { static let scenario = "scenario" static let cause = "cause" + static let experimentVariant = "experiment_variant" } enum Scenario: String { @@ -19,6 +20,13 @@ extension WooAnalyticsEvent { case other = "other" } + /// Tracks the REST API A/B test variation + /// + static func restAPILoginExperiment(variation: String) -> WooAnalyticsEvent { + WooAnalyticsEvent(statName: .trackRestAPILoginExperimentVariation, + properties: [Key.experimentVariant: variation]) + } + /// Tracks when generating application password succeeds /// static func applicationPasswordGeneratedSuccessfully(scenario: Scenario) -> WooAnalyticsEvent { diff --git a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift index e44291e8a16..40893800e1f 100644 --- a/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift +++ b/WooCommerce/Classes/Analytics/WooAnalyticsStat.swift @@ -821,6 +821,7 @@ public enum WooAnalyticsStat: String { // MARK: Application password Events case applicationPasswordsNewPasswordCreated = "application_passwords_new_password_created" case applicationPasswordsGenerationFailed = "application_passwords_generation_failed" + case trackRestAPILoginExperimentVariation = "rest_api_login_experiment" } public extension WooAnalyticsStat { diff --git a/WooCommerce/Classes/ViewRelated/AppCoordinator.swift b/WooCommerce/Classes/ViewRelated/AppCoordinator.swift index 0a2c5d271f9..fe6cf72f201 100644 --- a/WooCommerce/Classes/ViewRelated/AppCoordinator.swift +++ b/WooCommerce/Classes/ViewRelated/AppCoordinator.swift @@ -142,6 +142,8 @@ private extension AppCoordinator { } else { configureAndDisplayAuthenticator() } + + analytics.track(event: .ApplicationPassword.restAPILoginExperiment(variation: ABTest.applicationPasswordAuthentication.variation.analyticsValue)) } /// Configures the WPAuthenticator and sets the authenticator UI as the window's root view. diff --git a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift index b483d788719..b60d300540c 100644 --- a/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift +++ b/WooCommerce/WooCommerceTests/AppCoordinatorTests.swift @@ -318,7 +318,25 @@ final class AppCoordinatorTests: XCTestCase { appCoordinator.start() // Then - XCTAssertEqual(analytics.receivedEvents, [WooAnalyticsStat.loginOnboardingShown.rawValue]) + _ = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == WooAnalyticsStat.loginOnboardingShown.rawValue})) + } + + func test_trackRestAPILoginExperimentVariation_is_tracked_after_presenting_onboarding() throws { + // Given + stores.deauthenticate() + let analytics = MockAnalyticsProvider() + let appCoordinator = makeCoordinator(window: window, + stores: stores, + authenticationManager: authenticationManager, + analytics: WooAnalytics(analyticsProvider: analytics)) + + // When + appCoordinator.start() + + // Then + let indexOfEvent = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == "rest_api_login_experiment" })) + let eventProperties = try XCTUnwrap(analytics.receivedProperties[indexOfEvent]) + XCTAssertNotNil(eventProperties["experiment_variant"] as? String) } // MARK: - Login reminder analytics @@ -340,10 +358,12 @@ final class AppCoordinatorTests: XCTestCase { pushNotesManager.sendLocalNotificationResponse(response) // Then - XCTAssertEqual(analytics.receivedEvents, [WooAnalyticsStat.loginLocalNotificationTapped.rawValue]) - let actionPropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["action"] as? String) + let indexOfEvent = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == WooAnalyticsStat.loginLocalNotificationTapped.rawValue})) + let eventProperties = try XCTUnwrap(analytics.receivedProperties[indexOfEvent]) + + let actionPropertyValue = try XCTUnwrap(eventProperties["action"] as? String) XCTAssertEqual(actionPropertyValue, "contact_support") - let typePropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["type"] as? String) + let typePropertyValue = try XCTUnwrap(eventProperties["type"] as? String) XCTAssertEqual(typePropertyValue, "site_address_error") } @@ -364,10 +384,12 @@ final class AppCoordinatorTests: XCTestCase { pushNotesManager.sendLocalNotificationResponse(response) // Then - XCTAssertEqual(analytics.receivedEvents, [WooAnalyticsStat.loginLocalNotificationTapped.rawValue]) - let actionPropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["action"] as? String) + let indexOfEvent = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == WooAnalyticsStat.loginLocalNotificationTapped.rawValue})) + let eventProperties = try XCTUnwrap(analytics.receivedProperties[indexOfEvent]) + + let actionPropertyValue = try XCTUnwrap(eventProperties["action"] as? String) XCTAssertEqual(actionPropertyValue, "login_with_wpcom") - let typePropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["type"] as? String) + let typePropertyValue = try XCTUnwrap(eventProperties["type"] as? String) XCTAssertEqual(typePropertyValue, "site_address_error") } @@ -388,10 +410,12 @@ final class AppCoordinatorTests: XCTestCase { pushNotesManager.sendLocalNotificationResponse(response) // Then - XCTAssertEqual(analytics.receivedEvents, [WooAnalyticsStat.loginLocalNotificationTapped.rawValue]) - let actionPropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["action"] as? String) + let indexOfEvent = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == WooAnalyticsStat.loginLocalNotificationTapped.rawValue})) + let eventProperties = try XCTUnwrap(analytics.receivedProperties[indexOfEvent]) + + let actionPropertyValue = try XCTUnwrap(eventProperties["action"] as? String) XCTAssertEqual(actionPropertyValue, "default") - let typePropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["type"] as? String) + let typePropertyValue = try XCTUnwrap(eventProperties["type"] as? String) XCTAssertEqual(typePropertyValue, "site_address_error") } @@ -412,8 +436,10 @@ final class AppCoordinatorTests: XCTestCase { pushNotesManager.sendLocalNotificationResponse(response) // Then - XCTAssertEqual(analytics.receivedEvents, [WooAnalyticsStat.loginLocalNotificationDismissed.rawValue]) - let typePropertyValue = try XCTUnwrap(analytics.receivedProperties.first?["type"] as? String) + let indexOfEvent = try XCTUnwrap(analytics.receivedEvents.firstIndex(where: { $0 == WooAnalyticsStat.loginLocalNotificationDismissed.rawValue})) + let eventProperties = try XCTUnwrap(analytics.receivedProperties[indexOfEvent]) + + let typePropertyValue = try XCTUnwrap(eventProperties["type"] as? String) XCTAssertEqual(typePropertyValue, "site_address_error") } }