Skip to content

Commit ccdb4ea

Browse files
committed
Track enable Cash on Delivery result events
1 parent e13bea3 commit ccdb4ea

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,32 @@ extension WooAnalyticsEvent {
11861186
])
11871187
}
11881188

1189+
/// Tracked when the Cash on Delivery Payment Gateway is successfully enabled, e.g. from the IPP onboarding flow.
1190+
///
1191+
/// - Parameters:
1192+
/// - countryCode: the country code of the store.
1193+
///
1194+
static func enableCashOnDeliverySuccess(countryCode: String) -> WooAnalyticsEvent {
1195+
WooAnalyticsEvent(statName: .enableCashOnDeliverySuccess,
1196+
properties: [
1197+
Keys.countryCode: countryCode
1198+
])
1199+
}
1200+
1201+
/// Tracked when the Cash on Delivery Payment Gateway enabling fails, e.g. from the IPP onboarding flow.
1202+
///
1203+
/// - Parameters:
1204+
/// - countryCode: the country code of the store.
1205+
///
1206+
static func enableCashOnDeliveryFailed(countryCode: String,
1207+
error: Error?) -> WooAnalyticsEvent {
1208+
WooAnalyticsEvent(statName: .enableCashOnDeliveryFailed,
1209+
properties: [
1210+
Keys.countryCode: countryCode
1211+
],
1212+
error: error)
1213+
}
1214+
11891215
/// Tracked when the user taps on the "See Receipt" button to view a receipt.
11901216
/// - Parameter countryCode: the country code of the store.
11911217
///

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ public enum WooAnalyticsStat: String {
187187
case cardPresentOnboardingStepSkipped = "card_present_onboarding_step_skipped"
188188
case cardPresentOnboardingCtaTapped = "card_present_onboarding_cta_tapped"
189189

190+
// MARK: Cash on Delivery Enable events
191+
case enableCashOnDeliverySuccess = "enable_cash_on_delivery_success"
192+
case enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed"
193+
190194
// MARK: Payment Gateways selection
191195
case cardPresentPaymentGatewaySelected = "card_present_payment_gateway_selected"
192196

WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel: Obser
7979
DDLogError("💰 Could not update Payment Gateway: \(String(describing: result.failure))")
8080
self.awaitingResponse = false
8181
self.displayEnableCashOnDeliveryFailureNotice()
82+
self.trackEnableCashOnDeliveryFailed(error: result.failure)
8283
return
8384
}
8485

86+
self.trackEnableCashOnDeliverySuccess()
8587
self.completion()
8688
}
8789
stores.dispatch(action)
@@ -128,6 +130,17 @@ private extension InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel
128130
countryCode: cardPresentPaymentsConfiguration.countryCode)
129131
analytics.track(event: event)
130132
}
133+
134+
func trackEnableCashOnDeliverySuccess() {
135+
let event = Event.enableCashOnDeliverySuccess(countryCode: cardPresentPaymentsConfiguration.countryCode)
136+
analytics.track(event: event)
137+
}
138+
139+
func trackEnableCashOnDeliveryFailed(error: Error?) {
140+
let event = Event.enableCashOnDeliveryFailed(countryCode: cardPresentPaymentsConfiguration.countryCode,
141+
error: error)
142+
analytics.track(event: event)
143+
}
131144
}
132145

133146
private enum Localization {

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,70 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests:
149149
assertEqual(AnalyticProperties.cashOnDeliveryDisabledReason, eventProperties[AnalyticProperties.reasonKey] as? String)
150150
assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String)
151151
}
152+
153+
func test_enable_success_logs_enable_success_event() throws {
154+
// Given
155+
assertEmpty(analyticsProvider.receivedEvents)
156+
stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in
157+
switch action {
158+
case let .updatePaymentGateway(paymentGateway, onCompletion):
159+
onCompletion(.success(paymentGateway))
160+
default:
161+
break
162+
}
163+
}
164+
165+
let _: Void = waitFor { promise in
166+
let sut = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(dependencies: self.dependencies,
167+
configuration: self.configuration,
168+
completion: {
169+
promise(())
170+
})
171+
// When
172+
sut.enableTapped()
173+
}
174+
175+
// Then
176+
assertNotEmpty(analyticsProvider.receivedEvents)
177+
let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.enableCashOnDeliverySuccess }))
178+
let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent])
179+
assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String)
180+
}
181+
182+
func test_enable_failure_logs_enable_failure_event() throws {
183+
// Given
184+
stores.whenReceivingAction(ofType: PaymentGatewayAction.self) { action in
185+
switch action {
186+
case let .updatePaymentGateway(_, onCompletion):
187+
onCompletion(.failure(DotcomError.noRestRoute))
188+
default:
189+
break
190+
}
191+
}
192+
193+
// When
194+
sut.enableTapped()
195+
196+
// Then
197+
assertNotEmpty(analyticsProvider.receivedEvents)
198+
let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.enableCashOnDeliveryFailed }))
199+
let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent])
200+
assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String)
201+
assertEqual("Dotcom Invalid REST Route", eventProperties[AnalyticProperties.errorDescriptionKey] as? String)
202+
}
152203
}
153204

154205
private enum AnalyticEvents {
155206
static let skippedEvent = "card_present_onboarding_step_skipped"
156207
static let ctaTappedEvent = "card_present_onboarding_cta_tapped"
208+
static let enableCashOnDeliverySuccess = "enable_cash_on_delivery_success"
209+
static let enableCashOnDeliveryFailed = "enable_cash_on_delivery_failed"
157210
}
158211

159212
private enum AnalyticProperties {
160213
static let reasonKey = "reason"
161214
static let cashOnDeliveryDisabledReason = "cash_on_delivery_disabled"
162215
static let remindLaterKey = "remind_later"
163216
static let countryCodeKey = "country"
217+
static let errorDescriptionKey = "error_description"
164218
}

0 commit comments

Comments
 (0)