Skip to content

Commit b912624

Browse files
authored
Merge pull request #6829 from woocommerce/issue/6824-sync-failure-analytics
Order Creation: Track when new order fails to sync remotely
2 parents 47d9bb3 + 720218a commit b912624

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,13 @@ extension WooAnalyticsEvent {
419419
Keys.errorDescription: errorDescription
420420
])
421421
}
422+
423+
static func orderSyncFailed(errorContext: String, errorDescription: String) -> WooAnalyticsEvent {
424+
WooAnalyticsEvent(statName: .orderSyncFailed, properties: [
425+
Keys.errorContext: errorContext,
426+
Keys.errorDescription: errorDescription
427+
])
428+
}
422429
}
423430
}
424431

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ public enum WooAnalyticsStat: String {
236236
case orderTrackingProvidersLoaded = "order_tracking_providers_loaded"
237237
case orderFeeAdd = "order_fee_add"
238238
case orderShippingMethodAdd = "order_shipping_method_add"
239+
case orderSyncFailed = "order_sync_failed"
239240

240241
// MARK: Order List Sorting/Filtering
241242
//

WooCommerce/Classes/ViewRelated/Orders/Order Creation/NewOrderViewModel.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ private extension NewOrderViewModel {
526526
switch state {
527527
case .error(let error):
528528
DDLogError("⛔️ Error syncing new order remotely: \(error)")
529+
self.trackSyncOrderFailure(error: error)
529530
return NoticeFactory.syncOrderErrorNotice(error, with: self.orderSynchronizer)
530531
default:
531532
return nil
@@ -689,6 +690,13 @@ private extension NewOrderViewModel {
689690
errorDescription: error.localizedDescription))
690691
}
691692

693+
/// Tracks an order remote sync failure
694+
///
695+
func trackSyncOrderFailure(error: Error) {
696+
analytics.track(event: WooAnalyticsEvent.Orders.orderSyncFailed(errorContext: String(describing: error),
697+
errorDescription: error.localizedDescription))
698+
}
699+
692700
/// Creates an `OrderSyncAddressesInput` type from a `NewOrderAddressData` type.
693701
/// Expects `billing` and `shipping` addresses to exists together,
694702
///

WooCommerce/WooCommerceTests/ViewRelated/Orders/Order Creation/NewOrderViewModelTests.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,32 @@ final class NewOrderViewModelTests: XCTestCase {
889889
XCTAssertTrue(analytics.receivedEvents.isEmpty)
890890
}
891891

892+
func test_sync_failure_tracked_when_sync_fails() {
893+
// Given
894+
let analytics = MockAnalyticsProvider()
895+
let stores = MockStoresManager(sessionManager: .testingInstance)
896+
let viewModel = NewOrderViewModel(siteID: sampleSiteID, stores: stores, analytics: WooAnalytics(analyticsProvider: analytics))
897+
898+
// When
899+
waitForExpectation { expectation in
900+
stores.whenReceivingAction(ofType: OrderAction.self) { action in
901+
switch action {
902+
case let .createOrder(_, _, onCompletion):
903+
onCompletion(.failure(NSError(domain: "Error", code: 0)))
904+
expectation.fulfill()
905+
default:
906+
XCTFail("Received unsupported action: \(action)")
907+
}
908+
}
909+
910+
// When remote sync is triggered
911+
viewModel.saveShippingLine(ShippingLine.fake())
912+
}
913+
914+
// Then
915+
XCTAssertTrue(analytics.receivedEvents.contains(WooAnalyticsStat.orderSyncFailed.rawValue))
916+
}
917+
892918
// MARK: -
893919

894920
func test_customer_note_section_is_updated_when_note_is_added_to_order() {

0 commit comments

Comments
 (0)