@@ -82,6 +82,61 @@ final class TurboNavigationHierarchyControllerTests: XCTestCase {
8282 XCTAssert ( navigationController. viewControllers. last is VisitableViewController )
8383 assertVisited ( url: proposal. url, on: . main)
8484 }
85+
86+ func test_default_default_refresh_refreshesPreviousController( ) {
87+ navigator. route ( oneURL)
88+ XCTAssertEqual ( navigationController. viewControllers. count, 1 )
89+
90+ navigator. route ( twoURL)
91+ XCTAssertEqual ( navigator. rootViewController. viewControllers. count, 2 )
92+
93+ /// Refreshing should pop the view controller and refresh the underlying controller.
94+ let proposal = VisitProposal ( presentation: . refresh)
95+ navigator. route ( proposal)
96+
97+ let visitable = navigator. session. activeVisitable as! VisitableViewController
98+ XCTAssertEqual ( visitable. visitableURL, oneURL)
99+ XCTAssertEqual ( navigator. rootViewController. viewControllers. count, 1 )
100+ }
101+
102+ func test_default_modal_refresh_refreshesPreviousController( ) {
103+ navigationController. pushViewController ( UIViewController ( ) , animated: false )
104+ XCTAssertEqual ( navigationController. viewControllers. count, 1 )
105+
106+ let oneURLProposal = VisitProposal ( path: " /one " , context: . modal)
107+ navigator. route ( oneURLProposal)
108+
109+ let twoURLProposal = VisitProposal ( path: " /two " , context: . modal)
110+ navigator. route ( twoURLProposal)
111+ XCTAssertEqual ( modalNavigationController. viewControllers. count, 2 )
112+
113+ /// Refreshing should pop the view controller and refresh the underlying controller.
114+ let proposal = VisitProposal ( presentation: . refresh)
115+ navigator. route ( proposal)
116+
117+ let visitable = navigator. modalSession. activeVisitable as! VisitableViewController
118+ XCTAssertEqual ( visitable. visitableURL, oneURL)
119+ XCTAssertEqual ( modalNavigationController. viewControllers. count, 1 )
120+ }
121+
122+ func test_default_modal_refresh_dismissesAndRefreshesMainStackTopViewController( ) {
123+ navigator. route ( oneURL)
124+ XCTAssertEqual ( navigationController. viewControllers. count, 1 )
125+
126+ let twoURLProposal = VisitProposal ( path: " /two " , context: . modal)
127+ navigator. route ( twoURLProposal)
128+ XCTAssertEqual ( modalNavigationController. viewControllers. count, 1 )
129+
130+ /// Refreshing should dismiss the view controller and refresh the underlying controller.
131+ let proposal = VisitProposal ( context: . modal, presentation: . refresh)
132+ navigator. route ( proposal)
133+
134+ let visitable = navigator. session. activeVisitable as! VisitableViewController
135+ XCTAssertEqual ( visitable. visitableURL, oneURL)
136+
137+ XCTAssertNil ( navigationController. presentedViewController)
138+ XCTAssertEqual ( navigator. rootViewController. viewControllers. count, 1 )
139+ }
85140
86141 func test_default_modal_default_presentsModal( ) {
87142 navigationController. pushViewController ( UIViewController ( ) , animated: false )
@@ -309,7 +364,7 @@ final class TurboNavigationHierarchyControllerTests: XCTestCase {
309364
310365private class EmptyNavigationDelegate : TurboNavigationHierarchyControllerDelegate {
311366 func visit( _: Visitable , on: TurboNavigationHierarchyController . NavigationStackType , with: VisitOptions ) { }
312- func refresh ( navigationStack: TurboNavigationHierarchyController . NavigationStackType ) { }
367+ func refreshVisitable ( navigationStack: TurboNavigationHierarchyController . NavigationStackType , newTopmostVisitable : any Visitable ) { }
313368}
314369
315370// MARK: - VisitProposal extension
0 commit comments