@@ -89,12 +89,11 @@ fn root_for_browser_router() -> Html {
8989 }
9090}
9191
92- #[ test]
9392async fn link_in_browser_router ( ) {
9493 let div = gloo:: utils:: document ( ) . create_element ( "div" ) . unwrap ( ) ;
9594 let _ = div. set_attribute ( "id" , "browser-router" ) ;
9695 let _ = gloo:: utils:: body ( ) . append_child ( & div) ;
97- yew:: Renderer :: < RootForBrowserRouter > :: with_root ( div) . render ( ) ;
96+ let handle = yew:: Renderer :: < RootForBrowserRouter > :: with_root ( div) . render ( ) ;
9897
9998 sleep ( Duration :: ZERO ) . await ;
10099
@@ -113,26 +112,43 @@ async fn link_in_browser_router() {
113112 "/search?q=Rust&lang=en_US" ,
114113 link_href( "#browser-router ul > li.search-q-lang > a" )
115114 ) ;
115+
116+ handle. destroy ( ) ;
117+ }
118+
119+ #[ derive( PartialEq , Properties ) ]
120+ struct BasenameProps {
121+ basename : Option < String > ,
116122}
117123
118124#[ function_component( RootForBasename ) ]
119- fn root_for_basename ( ) -> Html {
125+ fn root_for_basename ( props : & BasenameProps ) -> Html {
120126 html ! {
121- <BrowserRouter basename="/base/" >
127+ <BrowserRouter basename={ props . basename . clone ( ) } >
122128 <NavigationMenu />
123129 </BrowserRouter >
124130 }
125131}
126132
127- #[ test]
128133async fn link_with_basename ( ) {
129134 let div = gloo:: utils:: document ( ) . create_element ( "div" ) . unwrap ( ) ;
130135 let _ = div. set_attribute ( "id" , "with-basename" ) ;
131136 let _ = gloo:: utils:: body ( ) . append_child ( & div) ;
132- yew:: Renderer :: < RootForBasename > :: with_root ( div) . render ( ) ;
137+ let mut handle = yew:: Renderer :: < RootForBasename > :: with_root_and_props (
138+ div,
139+ BasenameProps {
140+ basename : Some ( "/base/" . to_owned ( ) ) ,
141+ } ,
142+ )
143+ . render ( ) ;
133144
134145 sleep ( Duration :: ZERO ) . await ;
135146
147+ assert_eq ! (
148+ "/base/" ,
149+ gloo:: utils:: window( ) . location( ) . pathname( ) . unwrap( )
150+ ) ;
151+
136152 assert_eq ! ( "/base/posts" , link_href( "#with-basename ul > li.posts > a" ) ) ;
137153 assert_eq ! (
138154 "/base/posts?page=2" ,
@@ -151,6 +167,48 @@ async fn link_with_basename() {
151167 "/base/search?q=Rust&lang=en_US" ,
152168 link_href( "#with-basename ul > li.search-q-lang > a" )
153169 ) ;
170+
171+ // Some(a) -> Some(b)
172+ handle. update ( BasenameProps {
173+ basename : Some ( "/bayes/" . to_owned ( ) ) ,
174+ } ) ;
175+
176+ sleep ( Duration :: ZERO ) . await ;
177+
178+ assert_eq ! (
179+ "/bayes/" ,
180+ gloo:: utils:: window( ) . location( ) . pathname( ) . unwrap( )
181+ ) ;
182+
183+ assert_eq ! (
184+ "/bayes/posts" ,
185+ link_href( "#with-basename ul > li.posts > a" )
186+ ) ;
187+
188+ // Some -> None
189+ handle. update ( BasenameProps { basename : None } ) ;
190+
191+ sleep ( Duration :: ZERO ) . await ;
192+
193+ assert_eq ! ( "/" , gloo:: utils:: window( ) . location( ) . pathname( ) . unwrap( ) ) ;
194+
195+ assert_eq ! ( "/posts" , link_href( "#with-basename ul > li.posts > a" ) ) ;
196+
197+ // None -> Some
198+ handle. update ( BasenameProps {
199+ basename : Some ( "/bass/" . to_string ( ) ) ,
200+ } ) ;
201+
202+ sleep ( Duration :: ZERO ) . await ;
203+
204+ assert_eq ! (
205+ "/bass/" ,
206+ gloo:: utils:: window( ) . location( ) . pathname( ) . unwrap( )
207+ ) ;
208+
209+ assert_eq ! ( "/bass/posts" , link_href( "#with-basename ul > li.posts > a" ) ) ;
210+
211+ handle. destroy ( ) ;
154212}
155213
156214#[ function_component( RootForHashRouter ) ]
@@ -162,12 +220,11 @@ fn root_for_hash_router() -> Html {
162220 }
163221}
164222
165- #[ test]
166223async fn link_in_hash_router ( ) {
167224 let div = gloo:: utils:: document ( ) . create_element ( "div" ) . unwrap ( ) ;
168225 let _ = div. set_attribute ( "id" , "hash-router" ) ;
169226 let _ = gloo:: utils:: body ( ) . append_child ( & div) ;
170- yew:: Renderer :: < RootForHashRouter > :: with_root ( div) . render ( ) ;
227+ let handle = yew:: Renderer :: < RootForHashRouter > :: with_root ( div) . render ( ) ;
171228
172229 sleep ( Duration :: ZERO ) . await ;
173230
@@ -186,4 +243,14 @@ async fn link_in_hash_router() {
186243 "#/search?q=Rust&lang=en_US" ,
187244 link_href( "#hash-router ul > li.search-q-lang > a" )
188245 ) ;
246+
247+ handle. destroy ( ) ;
248+ }
249+
250+ // These cannot be run in concurrently because they all read/write the URL.
251+ #[ test]
252+ async fn sequential_tests ( ) {
253+ link_in_hash_router ( ) . await ;
254+ link_in_browser_router ( ) . await ;
255+ link_with_basename ( ) . await ;
189256}
0 commit comments