Skip to content

Commit 7e73f66

Browse files
committed
Rework model and tests to handle published default site
1 parent 9d68727 commit 7e73f66

File tree

2 files changed

+58
-13
lines changed

2 files changed

+58
-13
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Blaze/BlazeCampaignDashboardViewModel.swift

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
108108
private var subscriptions: Set<AnyCancellable> = []
109109

110110
@Published private var syncingError: Error?
111-
111+
112112
private var cancellables = Set<AnyCancellable>()
113113

114114
init(siteID: Int64,
@@ -124,7 +124,6 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
124124
self.state = .loading
125125

126126
observeIsSiteEligibleForBlaze()
127-
observeAvailability()
128127
observeSectionVisibility()
129128
configureResultsController()
130129
}
@@ -141,14 +140,24 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
141140
return
142141
}
143142

144-
isSiteEligibleForBlaze = await checkSiteEligibility(site)
143+
await updateIsSiteEligibleForBlaze(site)
144+
updateAvailability()
145145
}
146146
}
147147
.store(in: &cancellables)
148148
}
149149

150+
func updateIsSiteEligibleForBlaze() async {
151+
guard let site = stores.sessionManager.defaultSite else {
152+
return
153+
}
154+
155+
await updateIsSiteEligibleForBlaze(site)
156+
}
157+
150158
@MainActor
151159
func checkAvailability() async {
160+
await updateIsSiteEligibleForBlaze()
152161
try? await synchronizePublishedProducts()
153162
}
154163

@@ -159,6 +168,8 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
159168

160169
analytics.track(event: .DynamicDashboard.cardLoadingStarted(type: .blaze))
161170

171+
await updateIsSiteEligibleForBlaze()
172+
162173
guard isSiteEligibleForBlaze else {
163174
update(state: .empty)
164175
return
@@ -242,6 +253,10 @@ private extension BlazeCampaignDashboardViewModel {
242253
return await blazeEligibilityChecker.isSiteEligible(site)
243254
}
244255

256+
func updateIsSiteEligibleForBlaze(_ site: Site) async {
257+
isSiteEligibleForBlaze = await checkSiteEligibility(site)
258+
}
259+
245260
@MainActor
246261
func synchronizeBlazeCampaigns() async throws {
247262
try await withCheckedThrowingContinuation({ continuation in
@@ -302,13 +317,8 @@ private extension BlazeCampaignDashboardViewModel {
302317
onStateChange?()
303318
}
304319

305-
func observeAvailability() {
306-
$isSiteEligibleForBlaze
307-
.combineLatest($latestPublishedProduct)
308-
.map { (isSiteEligibleForBlaze, latestPublishedProduct) in
309-
return isSiteEligibleForBlaze && latestPublishedProduct != nil
310-
}
311-
.assign(to: &$canShowInDashboard)
320+
func updateAvailability() {
321+
canShowInDashboard = isSiteEligibleForBlaze && latestPublishedProduct != nil
312322
}
313323

314324
func updateResults() {
@@ -340,9 +350,11 @@ private extension BlazeCampaignDashboardViewModel {
340350
productResultsController.onDidChangeContent = { [weak self] in
341351
guard let self else { return }
342352
latestPublishedProduct = productResultsController.fetchedObjects.first
353+
updateAvailability()
343354
updateResults()
344355
}
345356
productResultsController.onDidResetContent = { [weak self] in
357+
self?.updateAvailability()
346358
self?.updateResults()
347359
}
348360

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Blaze/BlazeCampaignDashboardViewModelTests.swift

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,17 @@ final class BlazeCampaignDashboardViewModelTests: XCTestCase {
108108
@MainActor
109109
func test_canShowInDashboard_returns_false_if_store_is_ciab_and_other_requirements_met() async {
110110
// Given
111+
112+
let site = Site.fake().copy(
113+
siteID: sampleSiteID,
114+
isJetpackThePluginInstalled: true,
115+
isJetpackConnected: true,
116+
canBlaze: true,
117+
isAdmin: true,
118+
)
119+
120+
stores.updateDefaultStore(site)
121+
111122
let siteCIABChecker = MockCIABEligibilityChecker(
112123
mockedIsCurrentSiteCIAB: true,
113124
mockedCIABSites: [stores.sessionManager.defaultSite ?? .fake()]
@@ -123,7 +134,13 @@ final class BlazeCampaignDashboardViewModelTests: XCTestCase {
123134
blazeEligibilityChecker: blazeEligibilityChecker
124135
)
125136

126-
mockSynchronizeProducts()
137+
mockSynchronizeProducts(
138+
insertProductToStorage: .fake().copy(
139+
siteID: sampleSiteID,
140+
statusKey: (ProductStatus.published.rawValue)
141+
)
142+
)
143+
127144
mockSynchronizeCampaignsList()
128145

129146
// When
@@ -136,6 +153,16 @@ final class BlazeCampaignDashboardViewModelTests: XCTestCase {
136153
@MainActor
137154
func test_canShowInDashboard_returns_true_if_store_is_non_ciab_and_other_requirements_met() async {
138155
// Given
156+
let site = Site.fake().copy(
157+
siteID: sampleSiteID,
158+
isJetpackThePluginInstalled: true,
159+
isJetpackConnected: true,
160+
canBlaze: true,
161+
isAdmin: true,
162+
)
163+
164+
stores.updateDefaultStore(site)
165+
139166
let siteCIABChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false)
140167
let blazeEligibilityChecker = BlazeEligibilityChecker(
141168
stores: stores,
@@ -149,14 +176,20 @@ final class BlazeCampaignDashboardViewModelTests: XCTestCase {
149176
blazeEligibilityChecker: blazeEligibilityChecker
150177
)
151178

152-
mockSynchronizeProducts()
179+
mockSynchronizeProducts(
180+
insertProductToStorage: .fake().copy(
181+
siteID: sampleSiteID,
182+
statusKey: (ProductStatus.published.rawValue)
183+
)
184+
)
185+
153186
mockSynchronizeCampaignsList()
154187

155188
// When
156189
await sut.checkAvailability()
157190

158191
// Then
159-
XCTAssertFalse(sut.canShowInDashboard)
192+
XCTAssertTrue(sut.canShowInDashboard)
160193
}
161194

162195
// MARK: Published product

0 commit comments

Comments
 (0)