@@ -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