Skip to content

Commit 1100256

Browse files
committed
Check for booking when checking booking tab eligibility
1 parent 2de6170 commit 1100256

File tree

2 files changed

+119
-4
lines changed

2 files changed

+119
-4
lines changed

WooCommerce/Classes/Bookings/BookingsTabEligibilityChecker.swift

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,16 @@ final class BookingsTabEligibilityChecker: BookingsTabEligibilityCheckerProtocol
4545
return false
4646
}
4747

48+
async let hasBookableProducts = await checkIfStoreHasBookableProducts()
49+
async let hasBookings = await checkIfStoreHasBookings()
50+
51+
if await hasBookableProducts == false,
52+
await hasBookings == false {
53+
return false
54+
}
55+
4856
// Cache the result
49-
let isVisible = await checkIfStoreHasBookableProducts()
57+
let isVisible = true
5058
userDefaults.cacheBookingsTabVisibility(siteID: site.siteID, isVisible: isVisible)
5159

5260
return isVisible
@@ -65,6 +73,16 @@ private extension BookingsTabEligibilityChecker {
6573
})
6674
}
6775
}
76+
77+
@MainActor
78+
func checkIfStoreHasBookings() async -> Bool {
79+
await withCheckedContinuation { continuation in
80+
stores.dispatch(BookingAction.checkIfStoreHasBookings(siteID: site.siteID) { result in
81+
let hasBookings = (try? result.get()) ?? false
82+
continuation.resume(returning: hasBookings)
83+
})
84+
}
85+
}
6886
}
6987

7088
extension UserDefaults {

WooCommerce/WooCommerceTests/Bookings/BookingsTabEligibilityCheckerTests.swift

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct BookingsTabEligibilityCheckerTests {
9898
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
9999
let ciabEligibilityChecker = MockCIABEligibilityChecker(mockedIsCurrentSiteCIAB: false)
100100
setupStoreHasBookableProducts(hasProducts: true)
101+
setupStoreHasBookings(hasBookings: true)
101102
let checker = BookingsTabEligibilityChecker(site: site,
102103
stores: stores,
103104
featureFlagService: featureFlagService,
@@ -111,11 +112,12 @@ struct BookingsTabEligibilityCheckerTests {
111112
#expect(result == false)
112113
}
113114

114-
@Test func checkVisibility_returns_false_when_store_has_no_bookable_products() async throws {
115+
@Test func checkVisibility_returns_false_when_store_has_no_bookable_products_and_no_bookings() async throws {
115116
// Given
116117
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
117118
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
118119
setupStoreHasBookableProducts(hasProducts: false)
120+
setupStoreHasBookings(hasBookings: false)
119121
let checker = BookingsTabEligibilityChecker(site: site,
120122
stores: stores,
121123
featureFlagService: featureFlagService,
@@ -129,11 +131,12 @@ struct BookingsTabEligibilityCheckerTests {
129131
#expect(result == false)
130132
}
131133

132-
@Test func checkVisibility_returns_true_when_all_conditions_are_satisfied() async throws {
134+
@Test func checkVisibility_returns_true_when_store_has_bookable_products() async throws {
133135
// Given
134136
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
135137
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
136138
setupStoreHasBookableProducts(hasProducts: true)
139+
setupStoreHasBookings(hasBookings: false)
137140
let checker = BookingsTabEligibilityChecker(site: site,
138141
stores: stores,
139142
featureFlagService: featureFlagService,
@@ -152,6 +155,7 @@ struct BookingsTabEligibilityCheckerTests {
152155
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
153156
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
154157
setupStoreHasBookableProducts(hasProducts: true)
158+
setupStoreHasBookings(hasBookings: false)
155159
let checker = BookingsTabEligibilityChecker(site: site,
156160
stores: stores,
157161
featureFlagService: featureFlagService,
@@ -171,6 +175,7 @@ struct BookingsTabEligibilityCheckerTests {
171175
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
172176
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
173177
setupStoreHasBookableProducts(hasProducts: false)
178+
setupStoreHasBookings(hasBookings: false)
174179
let checker = BookingsTabEligibilityChecker(site: site,
175180
stores: stores,
176181
featureFlagService: featureFlagService,
@@ -185,11 +190,88 @@ struct BookingsTabEligibilityCheckerTests {
185190
#expect(userDefaults.loadCachedBookingsTabVisibility(siteID: siteID) == false)
186191
}
187192

188-
@Test func checkVisibility_handles_store_check_failure_gracefully() async throws {
193+
@Test func checkVisibility_handles_bookable_products_check_failure_gracefully() async throws {
189194
// Given
190195
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
191196
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
192197
setupStoreHasBookableProducts(hasProducts: false, shouldFail: true)
198+
setupStoreHasBookings(hasBookings: false)
199+
let checker = BookingsTabEligibilityChecker(site: site,
200+
stores: stores,
201+
featureFlagService: featureFlagService,
202+
ciabEligibilityChecker: ciabEligibilityChecker,
203+
userDefaults: userDefaults)
204+
205+
// When
206+
let result = await checker.checkVisibility()
207+
208+
// Then
209+
#expect(result == false)
210+
}
211+
212+
@Test func checkVisibility_returns_true_when_store_has_bookings_but_no_bookable_products() async throws {
213+
// Given
214+
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
215+
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
216+
setupStoreHasBookableProducts(hasProducts: false)
217+
setupStoreHasBookings(hasBookings: true)
218+
let checker = BookingsTabEligibilityChecker(site: site,
219+
stores: stores,
220+
featureFlagService: featureFlagService,
221+
ciabEligibilityChecker: ciabEligibilityChecker,
222+
userDefaults: userDefaults)
223+
224+
// When
225+
let result = await checker.checkVisibility()
226+
227+
// Then
228+
#expect(result == true)
229+
}
230+
231+
@Test func checkVisibility_returns_true_when_store_has_both_bookings_and_bookable_products() async throws {
232+
// Given
233+
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
234+
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
235+
setupStoreHasBookableProducts(hasProducts: true)
236+
setupStoreHasBookings(hasBookings: true)
237+
let checker = BookingsTabEligibilityChecker(site: site,
238+
stores: stores,
239+
featureFlagService: featureFlagService,
240+
ciabEligibilityChecker: ciabEligibilityChecker,
241+
userDefaults: userDefaults)
242+
243+
// When
244+
let result = await checker.checkVisibility()
245+
246+
// Then
247+
#expect(result == true)
248+
}
249+
250+
@Test func checkVisibility_handles_bookings_check_failure_gracefully() async throws {
251+
// Given
252+
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
253+
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
254+
setupStoreHasBookableProducts(hasProducts: false)
255+
setupStoreHasBookings(hasBookings: false, shouldFail: true)
256+
let checker = BookingsTabEligibilityChecker(site: site,
257+
stores: stores,
258+
featureFlagService: featureFlagService,
259+
ciabEligibilityChecker: ciabEligibilityChecker,
260+
userDefaults: userDefaults)
261+
262+
// When
263+
let result = await checker.checkVisibility()
264+
265+
// Then
266+
#expect(result == false)
267+
}
268+
269+
@Test func checkVisibility_handles_both_checks_failure_gracefully() async throws {
270+
// Given
271+
let userDefaults = UserDefaults(suiteName: UUID().uuidString)!
272+
let featureFlagService = MockFeatureFlagService(isCIABBookingsEnabled: true)
273+
setupStoreHasBookableProducts(hasProducts: false, shouldFail: true)
274+
setupStoreHasBookings(hasBookings: false, shouldFail: true)
193275
let checker = BookingsTabEligibilityChecker(site: site,
194276
stores: stores,
195277
featureFlagService: featureFlagService,
@@ -276,4 +358,19 @@ private extension BookingsTabEligibilityCheckerTests {
276358
}
277359
}
278360
}
361+
362+
func setupStoreHasBookings(hasBookings: Bool, shouldFail: Bool = false) {
363+
stores.whenReceivingAction(ofType: BookingAction.self) { action in
364+
switch action {
365+
case .checkIfStoreHasBookings(_, let completion):
366+
if shouldFail {
367+
completion(.failure(NSError(domain: "test", code: 500)))
368+
} else {
369+
completion(.success(hasBookings))
370+
}
371+
default:
372+
break
373+
}
374+
}
375+
}
279376
}

0 commit comments

Comments
 (0)