@@ -158,6 +158,154 @@ final class MainTabBarController_TabsTests: XCTestCase {
158158 XCTAssertEqual ( tabBarController. tabRootViewControllers. count, 4 )
159159 }
160160
161+ func test_tab_view_controllers_include_bookings_tab_when_bookings_tab_is_visible( ) throws {
162+ // Given
163+ let mockBookingsEligibilityChecker = MockBookingsEligibilityChecker ( )
164+ mockBookingsEligibilityChecker. visibility = true
165+
166+ let storesManager = MockStoresManager ( sessionManager: . makeForTesting( ) )
167+
168+ guard let tabBarController = UIStoryboard ( name: " Main " , bundle: nil ) . instantiateInitialViewController ( creator: { coder in
169+ return MainTabBarController ( coder: coder,
170+ featureFlagService: MockFeatureFlagService ( ) ,
171+ stores: storesManager,
172+ bookingsEligibilityCheckerFactory: { _ in mockBookingsEligibilityChecker } )
173+ } ) else {
174+ return
175+ }
176+
177+ // Trigger `viewDidLoad`
178+ XCTAssertNotNil ( tabBarController. view)
179+
180+ // When
181+ let siteID : Int64 = 314
182+ storesManager. updateDefaultStore ( storeID: siteID)
183+ storesManager. updateDefaultStore ( . fake( ) . copy ( siteID: siteID) )
184+
185+ // Then
186+ waitUntil {
187+ tabBarController. tabRootViewControllers. count == 5
188+ }
189+ assertThat ( tabBarController. tabRootViewController (
190+ tab: . myStore,
191+ isPOSTabVisible: false ,
192+ isBookingsTabVisible: true
193+ ) , isAnInstanceOf: DashboardViewHostingController . self)
194+ assertThat ( tabBarController. tabRootViewController (
195+ tab: . orders,
196+ isPOSTabVisible: false ,
197+ isBookingsTabVisible: true
198+ ) , isAnInstanceOf: OrdersSplitViewWrapperController . self)
199+ assertThat ( tabBarController. tabRootViewController (
200+ tab: . products,
201+ isPOSTabVisible: false ,
202+ isBookingsTabVisible: true
203+ ) , isAnInstanceOf: ProductsViewController . self)
204+ assertThat ( tabBarController. tabRootViewController (
205+ tab: . bookings,
206+ isPOSTabVisible: false ,
207+ isBookingsTabVisible: true
208+ ) , isAnInstanceOf: BookingsTabViewHostingController . self)
209+
210+ let hubMenuNavigationController = try XCTUnwrap ( tabBarController. tabRootViewController (
211+ tab: . hubMenu,
212+ isPOSTabVisible: false ,
213+ isBookingsTabVisible: true
214+ ) as? UINavigationController )
215+ assertThat ( hubMenuNavigationController. topViewController,
216+ isAnInstanceOf: HubMenuViewController . self)
217+ }
218+
219+ func test_tab_view_controllers_exclude_bookings_tab_when_bookings_tab_is_not_visible( ) throws {
220+ // Given
221+ let mockBookingsEligibilityChecker = MockBookingsEligibilityChecker ( )
222+ mockBookingsEligibilityChecker. visibility = false
223+
224+ let storesManager = MockStoresManager ( sessionManager: . makeForTesting( ) )
225+
226+ guard let tabBarController = UIStoryboard ( name: " Main " , bundle: nil ) . instantiateInitialViewController ( creator: { coder in
227+ return MainTabBarController ( coder: coder,
228+ featureFlagService: MockFeatureFlagService ( ) ,
229+ stores: storesManager,
230+ bookingsEligibilityCheckerFactory: { _ in mockBookingsEligibilityChecker } )
231+ } ) else {
232+ return
233+ }
234+
235+ // Trigger `viewDidLoad`
236+ XCTAssertNotNil ( tabBarController. view)
237+
238+ // When
239+ let siteID : Int64 = 707
240+ storesManager. updateDefaultStore ( storeID: siteID)
241+ storesManager. updateDefaultStore ( . fake( ) . copy ( siteID: siteID) )
242+
243+ // Then
244+ waitUntil {
245+ tabBarController. tabRootViewControllers. count == 4
246+ }
247+ assertThat ( tabBarController. tabRootViewController (
248+ tab: . myStore,
249+ isPOSTabVisible: false ,
250+ isBookingsTabVisible: false
251+ ) , isAnInstanceOf: DashboardViewHostingController . self)
252+ assertThat ( tabBarController. tabRootViewController (
253+ tab: . orders,
254+ isPOSTabVisible: false ,
255+ isBookingsTabVisible: false
256+ ) , isAnInstanceOf: OrdersSplitViewWrapperController . self)
257+ assertThat ( tabBarController. tabRootViewController (
258+ tab: . products,
259+ isPOSTabVisible: false ,
260+ isBookingsTabVisible: false
261+ ) , isAnInstanceOf: ProductsViewController . self)
262+
263+ let hubMenuNavigationController = try XCTUnwrap ( tabBarController. tabRootViewController (
264+ tab: . hubMenu,
265+ isPOSTabVisible: false ,
266+ isBookingsTabVisible: false
267+ ) as? UINavigationController )
268+ assertThat ( hubMenuNavigationController. topViewController,
269+ isAnInstanceOf: HubMenuViewController . self)
270+ }
271+
272+ func test_tab_view_controllers_do_not_change_when_bookings_visibility_changes( ) throws {
273+ // Given
274+ let mockBookingsEligibilityChecker = MockBookingsEligibilityChecker ( )
275+ mockBookingsEligibilityChecker. visibility = false
276+
277+ let storesManager = MockStoresManager ( sessionManager: . makeForTesting( ) )
278+
279+ guard let tabBarController = UIStoryboard ( name: " Main " , bundle: nil ) . instantiateInitialViewController ( creator: { coder in
280+ return MainTabBarController ( coder: coder,
281+ featureFlagService: MockFeatureFlagService ( ) ,
282+ stores: storesManager,
283+ bookingsEligibilityCheckerFactory: { _ in mockBookingsEligibilityChecker } )
284+ } ) else {
285+ return
286+ }
287+
288+ // Trigger `viewDidLoad`
289+ XCTAssertNotNil ( tabBarController. view)
290+
291+ // When
292+ let siteID : Int64 = 303
293+ storesManager. updateDefaultStore ( storeID: siteID)
294+ storesManager. updateDefaultStore ( . fake( ) . copy ( siteID: siteID) )
295+
296+ // Then initial state
297+ waitUntil {
298+ tabBarController. tabRootViewControllers. count == 4
299+ }
300+
301+ // When - change bookings eligibility
302+ mockBookingsEligibilityChecker. visibility = true
303+
304+ // Then tabs remain the same
305+ XCTAssertEqual ( tabBarController. tabRootViewControllers. count, 4 )
306+ }
307+
308+
161309 func test_tab_root_viewControllers_are_replaced_after_updating_to_a_different_site( ) throws {
162310 // Arrange
163311 let stores = MockStoresManager ( sessionManager: . makeForTesting( ) )
@@ -219,3 +367,17 @@ final class MainTabBarController_TabsTests: XCTestCase {
219367 XCTAssertEqual ( viewControllersBeforeSiteChange, viewControllersAfterSiteChange)
220368 }
221369}
370+
371+ private final class MockBookingsEligibilityChecker {
372+ var visibility : Bool = false
373+ }
374+
375+ extension MockBookingsEligibilityChecker : BookingsTabEligibilityCheckerProtocol {
376+ func checkInitialVisibility( ) -> Bool {
377+ visibility
378+ }
379+
380+ func checkVisibility( ) async -> Bool {
381+ visibility
382+ }
383+ }
0 commit comments