Skip to content

Commit 8ea6018

Browse files
authored
Merge pull request #8430 from woocommerce/issue/8318-error-handling-in-data-fetch
[Analytics Hub] Update error handling in data sync
2 parents 7504066 + 40184c0 commit 8ea6018

File tree

2 files changed

+44
-15
lines changed

2 files changed

+44
-15
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModel.swift

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -132,50 +132,48 @@ private extension AnalyticsHubViewModel {
132132
let currentTimeRange = try timeRangeSelection.unwrapCurrentTimeRange()
133133
let previousTimeRange = try timeRangeSelection.unwrapPreviousTimeRange()
134134

135-
try await withThrowingTaskGroup(of: Void.self) { group in
135+
await withTaskGroup(of: Void.self) { group in
136136
group.addTask {
137-
try await self.retrieveOrderStats(currentTimeRange: currentTimeRange, previousTimeRange: previousTimeRange)
137+
await self.retrieveOrderStats(currentTimeRange: currentTimeRange, previousTimeRange: previousTimeRange)
138138
}
139139
group.addTask {
140-
try await self.retrieveItemsSoldStats(currentTimeRange: currentTimeRange, previousTimeRange: previousTimeRange)
140+
await self.retrieveItemsSoldStats(currentTimeRange: currentTimeRange, previousTimeRange: previousTimeRange)
141141
}
142142
group.addTask {
143-
try await self.retrieveSiteStats(currentTimeRange: currentTimeRange)
143+
await self.retrieveSiteStats(currentTimeRange: currentTimeRange)
144144
}
145-
try await group.waitForAll()
146145
}
147146
}
148147

149148
@MainActor
150-
func retrieveOrderStats(currentTimeRange: AnalyticsHubTimeRange, previousTimeRange: AnalyticsHubTimeRange) async throws {
149+
func retrieveOrderStats(currentTimeRange: AnalyticsHubTimeRange, previousTimeRange: AnalyticsHubTimeRange) async {
151150
async let currentPeriodRequest = retrieveStats(earliestDateToInclude: currentTimeRange.start,
152151
latestDateToInclude: currentTimeRange.end,
153152
forceRefresh: true)
154153
async let previousPeriodRequest = retrieveStats(earliestDateToInclude: previousTimeRange.start,
155154
latestDateToInclude: previousTimeRange.end,
156155
forceRefresh: true)
157156

158-
let (currentPeriodStats, previousPeriodStats) = try await (currentPeriodRequest, previousPeriodRequest)
159-
self.currentOrderStats = currentPeriodStats
160-
self.previousOrderStats = previousPeriodStats
157+
let allStats: (currentPeriodStats: OrderStatsV4, previousPeriodStats: OrderStatsV4)?
158+
allStats = try? await (currentPeriodRequest, previousPeriodRequest)
159+
self.currentOrderStats = allStats?.currentPeriodStats
160+
self.previousOrderStats = allStats?.previousPeriodStats
161161
}
162162

163163
@MainActor
164-
func retrieveItemsSoldStats(currentTimeRange: AnalyticsHubTimeRange, previousTimeRange: AnalyticsHubTimeRange) async throws {
164+
func retrieveItemsSoldStats(currentTimeRange: AnalyticsHubTimeRange, previousTimeRange: AnalyticsHubTimeRange) async {
165165
async let itemsSoldRequest = retrieveTopItemsSoldStats(earliestDateToInclude: currentTimeRange.start,
166166
latestDateToInclude: currentTimeRange.end,
167167
forceRefresh: true)
168168

169-
let itemsSoldStats = try await itemsSoldRequest
170-
self.itemsSoldStats = itemsSoldStats
169+
self.itemsSoldStats = try? await itemsSoldRequest
171170
}
172171

173172
@MainActor
174-
func retrieveSiteStats(currentTimeRange: AnalyticsHubTimeRange) async throws {
173+
func retrieveSiteStats(currentTimeRange: AnalyticsHubTimeRange) async {
175174
async let siteStatsRequest = retrieveSiteSummaryStats(latestDateToInclude: currentTimeRange.end)
176175

177-
let summaryStats = try await siteStatsRequest
178-
self.siteStats = summaryStats
176+
self.siteStats = try? await siteStatsRequest
179177
}
180178

181179
@MainActor

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModelTests.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,37 @@ final class AnalyticsHubViewModelTests: XCTestCase {
7979
XCTAssertTrue(vm.sessionsCard.showSyncError)
8080
}
8181

82+
func test_cards_viewmodels_show_sync_error_only_if_underlying_request_fails() async {
83+
// Given
84+
let vm = AnalyticsHubViewModel(siteID: 123, statsTimeRange: .thisMonth, usageTracksEventEmitter: eventEmitter, stores: stores)
85+
stores.whenReceivingAction(ofType: StatsActionV4.self) { action in
86+
switch action {
87+
case let .retrieveCustomStats(_, _, _, _, _, _, completion):
88+
completion(.failure(NSError(domain: "Test", code: 1)))
89+
case let .retrieveTopEarnerStats(_, _, _, _, _, _, _, completion):
90+
let topEarners = TopEarnerStats.fake().copy(items: [.fake()])
91+
completion(.success(topEarners))
92+
case let .retrieveSiteSummaryStats(_, _, _, _, completion):
93+
completion(.failure(NSError(domain: "Test", code: 1)))
94+
default:
95+
break
96+
}
97+
}
98+
99+
// When
100+
await vm.updateData()
101+
102+
// Then
103+
XCTAssertTrue(vm.revenueCard.showSyncError)
104+
XCTAssertTrue(vm.ordersCard.showSyncError)
105+
XCTAssertTrue(vm.productsStatsCard.showStatsError)
106+
107+
XCTAssertFalse(vm.itemsSoldCard.showItemsSoldError)
108+
XCTAssertEqual(vm.itemsSoldCard.itemsSoldData.count, 1)
109+
110+
XCTAssertTrue(vm.sessionsCard.showSyncError)
111+
}
112+
82113
func test_cards_viewmodels_redacted_while_updating_from_network() async {
83114
// Given
84115
let vm = AnalyticsHubViewModel(siteID: 123, statsTimeRange: .thisMonth, usageTracksEventEmitter: eventEmitter, stores: stores)

0 commit comments

Comments
 (0)