@@ -241,3 +241,122 @@ async fn doesnt_panic_if_used_with_nested_router() {
241241 let res = client. get ( "/foobar" ) . send ( ) . await ;
242242 assert_eq ! ( res. status( ) , StatusCode :: OK ) ;
243243}
244+
245+ #[ crate :: test]
246+ async fn issue_2072 ( ) {
247+ let nested_routes = Router :: new ( ) . fallback ( inner_fallback) ;
248+
249+ let app = Router :: new ( )
250+ . nest ( "/nested" , nested_routes)
251+ . merge ( Router :: new ( ) ) ;
252+
253+ let client = TestClient :: new ( app) ;
254+
255+ let res = client. get ( "/nested/does-not-exist" ) . send ( ) . await ;
256+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
257+ assert_eq ! ( res. text( ) . await , "inner" ) ;
258+
259+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
260+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
261+ assert_eq ! ( res. text( ) . await , "" ) ;
262+ }
263+
264+ #[ crate :: test]
265+ async fn issue_2072_outer_fallback_before_merge ( ) {
266+ let nested_routes = Router :: new ( ) . fallback ( inner_fallback) ;
267+
268+ let app = Router :: new ( )
269+ . nest ( "/nested" , nested_routes)
270+ . fallback ( outer_fallback)
271+ . merge ( Router :: new ( ) ) ;
272+
273+ let client = TestClient :: new ( app) ;
274+
275+ let res = client. get ( "/nested/does-not-exist" ) . send ( ) . await ;
276+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
277+ assert_eq ! ( res. text( ) . await , "inner" ) ;
278+
279+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
280+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
281+ assert_eq ! ( res. text( ) . await , "outer" ) ;
282+ }
283+
284+ #[ crate :: test]
285+ async fn issue_2072_outer_fallback_after_merge ( ) {
286+ let nested_routes = Router :: new ( ) . fallback ( inner_fallback) ;
287+
288+ let app = Router :: new ( )
289+ . nest ( "/nested" , nested_routes)
290+ . merge ( Router :: new ( ) )
291+ . fallback ( outer_fallback) ;
292+
293+ let client = TestClient :: new ( app) ;
294+
295+ let res = client. get ( "/nested/does-not-exist" ) . send ( ) . await ;
296+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
297+ assert_eq ! ( res. text( ) . await , "inner" ) ;
298+
299+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
300+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
301+ assert_eq ! ( res. text( ) . await , "outer" ) ;
302+ }
303+
304+ #[ crate :: test]
305+ async fn merge_router_with_fallback_into_nested_router_with_fallback ( ) {
306+ let nested_routes = Router :: new ( ) . fallback ( inner_fallback) ;
307+
308+ let app = Router :: new ( )
309+ . nest ( "/nested" , nested_routes)
310+ . merge ( Router :: new ( ) . fallback ( outer_fallback) ) ;
311+
312+ let client = TestClient :: new ( app) ;
313+
314+ let res = client. get ( "/nested/does-not-exist" ) . send ( ) . await ;
315+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
316+ assert_eq ! ( res. text( ) . await , "inner" ) ;
317+
318+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
319+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
320+ assert_eq ! ( res. text( ) . await , "outer" ) ;
321+ }
322+
323+ #[ crate :: test]
324+ async fn merging_nested_router_with_fallback_into_router_with_fallback ( ) {
325+ let nested_routes = Router :: new ( ) . fallback ( inner_fallback) ;
326+
327+ let app = Router :: new ( )
328+ . fallback ( outer_fallback)
329+ . merge ( Router :: new ( ) . nest ( "/nested" , nested_routes) ) ;
330+
331+ let client = TestClient :: new ( app) ;
332+
333+ let res = client. get ( "/nested/does-not-exist" ) . send ( ) . await ;
334+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
335+ assert_eq ! ( res. text( ) . await , "inner" ) ;
336+
337+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
338+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
339+ assert_eq ! ( res. text( ) . await , "outer" ) ;
340+ }
341+
342+ #[ crate :: test]
343+ async fn merge_empty_into_router_with_fallback ( ) {
344+ let app = Router :: new ( ) . fallback ( outer_fallback) . merge ( Router :: new ( ) ) ;
345+
346+ let client = TestClient :: new ( app) ;
347+
348+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
349+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
350+ assert_eq ! ( res. text( ) . await , "outer" ) ;
351+ }
352+
353+ #[ crate :: test]
354+ async fn merge_router_with_fallback_into_empty ( ) {
355+ let app = Router :: new ( ) . merge ( Router :: new ( ) . fallback ( outer_fallback) ) ;
356+
357+ let client = TestClient :: new ( app) ;
358+
359+ let res = client. get ( "/does-not-exist" ) . send ( ) . await ;
360+ assert_eq ! ( res. status( ) , StatusCode :: NOT_FOUND ) ;
361+ assert_eq ! ( res. text( ) . await , "outer" ) ;
362+ }
0 commit comments