@@ -2144,6 +2144,31 @@ describe("a router", () => {
2144
2144
] ) ;
2145
2145
} ) ;
2146
2146
2147
+ it ( "matches root pathless route" , ( ) => {
2148
+ let t = setup ( {
2149
+ routes : [ { id : "root" , children : [ { path : "foo" } ] } ] ,
2150
+ } ) ;
2151
+
2152
+ t . navigate ( "/not-found" ) ;
2153
+ expect ( t . router . state . errors ) . toEqual ( {
2154
+ root : {
2155
+ status : 404 ,
2156
+ statusText : "Not Found" ,
2157
+ data : null ,
2158
+ } ,
2159
+ } ) ;
2160
+ expect ( t . router . state . matches ) . toMatchObject ( [
2161
+ {
2162
+ params : { } ,
2163
+ pathname : "" ,
2164
+ route : {
2165
+ id : "root" ,
2166
+ children : expect . any ( Array ) ,
2167
+ } ,
2168
+ } ,
2169
+ ] ) ;
2170
+ } ) ;
2171
+
2147
2172
it ( "clears prior loader/action data" , async ( ) => {
2148
2173
let t = initializeTmTest ( ) ;
2149
2174
expect ( t . router . state . loaderData ) . toEqual ( {
@@ -3128,11 +3153,7 @@ describe("a router", () => {
3128
3153
formData : createFormData ( { gosh : "dang" } ) ,
3129
3154
} ) ;
3130
3155
expect ( t . router . state . errors ) . toEqual ( {
3131
- child : new ErrorResponse (
3132
- 405 ,
3133
- "Method Not Allowed" ,
3134
- "No action found for [/child]"
3135
- ) ,
3156
+ child : new ErrorResponse ( 405 , "Method Not Allowed" , "" ) ,
3136
3157
} ) ;
3137
3158
expect ( console . warn ) . toHaveBeenCalled ( ) ;
3138
3159
spy . mockReset ( ) ;
@@ -3185,11 +3206,7 @@ describe("a router", () => {
3185
3206
} ) ;
3186
3207
expect ( t . router . state . actionData ) . toBe ( null ) ;
3187
3208
expect ( t . router . state . errors ) . toEqual ( {
3188
- grandchild : new ErrorResponse (
3189
- 405 ,
3190
- "Method Not Allowed" ,
3191
- "No action found for [/child/grandchild]"
3192
- ) ,
3209
+ grandchild : new ErrorResponse ( 405 , "Method Not Allowed" , "" ) ,
3193
3210
} ) ;
3194
3211
} ) ;
3195
3212
} ) ;
@@ -6667,11 +6684,7 @@ describe("a router", () => {
6667
6684
} ) ;
6668
6685
expect ( A . fetcher ) . toBe ( IDLE_FETCHER ) ;
6669
6686
expect ( t . router . state . errors ) . toEqual ( {
6670
- root : new ErrorResponse (
6671
- 405 ,
6672
- "Method Not Allowed" ,
6673
- "No action found for [/]"
6674
- ) ,
6687
+ root : new ErrorResponse ( 405 , "Method Not Allowed" , "" ) ,
6675
6688
} ) ;
6676
6689
} ) ;
6677
6690
@@ -9906,6 +9919,23 @@ describe("a router", () => {
9906
9919
} ) ;
9907
9920
} ) ;
9908
9921
9922
+ it ( "should support document load navigations with HEAD requests" , async ( ) => {
9923
+ let { query } = createStaticHandler ( SSR_ROUTES ) ;
9924
+ let context = await query (
9925
+ createRequest ( "/parent/child" , { method : "HEAD" } )
9926
+ ) ;
9927
+ expect ( context ) . toMatchObject ( {
9928
+ actionData : null ,
9929
+ loaderData : {
9930
+ parent : "PARENT LOADER" ,
9931
+ child : "CHILD LOADER" ,
9932
+ } ,
9933
+ errors : null ,
9934
+ location : { pathname : "/parent/child" } ,
9935
+ matches : [ { route : { id : "parent" } } , { route : { id : "child" } } ] ,
9936
+ } ) ;
9937
+ } ) ;
9938
+
9909
9939
it ( "should support document load navigations returning responses" , async ( ) => {
9910
9940
let { query } = createStaticHandler ( SSR_ROUTES ) ;
9911
9941
let context = await query ( createRequest ( "/parent/json" ) ) ;
@@ -9962,6 +9992,39 @@ describe("a router", () => {
9962
9992
} ) ;
9963
9993
} ) ;
9964
9994
9995
+ it ( "should support alternative submission methods" , async ( ) => {
9996
+ let { query } = createStaticHandler ( SSR_ROUTES ) ;
9997
+ let context ;
9998
+
9999
+ let expected = {
10000
+ actionData : {
10001
+ child : "CHILD ACTION" ,
10002
+ } ,
10003
+ loaderData : {
10004
+ parent : "PARENT LOADER" ,
10005
+ child : "CHILD LOADER" ,
10006
+ } ,
10007
+ errors : null ,
10008
+ location : { pathname : "/parent/child" } ,
10009
+ matches : [ { route : { id : "parent" } } , { route : { id : "child" } } ] ,
10010
+ } ;
10011
+
10012
+ context = await query (
10013
+ createSubmitRequest ( "/parent/child" , { method : "PUT" } )
10014
+ ) ;
10015
+ expect ( context ) . toMatchObject ( expected ) ;
10016
+
10017
+ context = await query (
10018
+ createSubmitRequest ( "/parent/child" , { method : "PATCH" } )
10019
+ ) ;
10020
+ expect ( context ) . toMatchObject ( expected ) ;
10021
+
10022
+ context = await query (
10023
+ createSubmitRequest ( "/parent/child" , { method : "DELETE" } )
10024
+ ) ;
10025
+ expect ( context ) . toMatchObject ( expected ) ;
10026
+ } ) ;
10027
+
9965
10028
it ( "should support document submit navigations returning responses" , async ( ) => {
9966
10029
let { query } = createStaticHandler ( SSR_ROUTES ) ;
9967
10030
let context = await query ( createSubmitRequest ( "/parent/json" ) ) ;
@@ -10202,20 +10265,6 @@ describe("a router", () => {
10202
10265
expect ( e ) . toMatchInlineSnapshot ( `[Error: query() call aborted]` ) ;
10203
10266
} ) ;
10204
10267
10205
- it ( "should not support HEAD requests" , async ( ) => {
10206
- let { query } = createStaticHandler ( SSR_ROUTES ) ;
10207
- let request = createRequest ( "/" , { method : "head" } ) ;
10208
- let e ;
10209
- try {
10210
- await query ( request ) ;
10211
- } catch ( _e ) {
10212
- e = _e ;
10213
- }
10214
- expect ( e ) . toMatchInlineSnapshot (
10215
- `[Error: query()/queryRoute() do not support HEAD requests]`
10216
- ) ;
10217
- } ) ;
10218
-
10219
10268
it ( "should require a signal on the request" , async ( ) => {
10220
10269
let { query } = createStaticHandler ( SSR_ROUTES ) ;
10221
10270
let request = createRequest ( "/" , { signal : undefined } ) ;
@@ -10246,7 +10295,30 @@ describe("a router", () => {
10246
10295
root : {
10247
10296
status : 405 ,
10248
10297
statusText : "Method Not Allowed" ,
10249
- data : "No action found for [/]" ,
10298
+ data : "" ,
10299
+ } ,
10300
+ } ,
10301
+ matches : [ { route : { id : "root" } } ] ,
10302
+ } ) ;
10303
+ } ) ;
10304
+
10305
+ it ( "should handle unsupported methods with a 405 error" , async ( ) => {
10306
+ let { query } = createStaticHandler ( [
10307
+ {
10308
+ id : "root" ,
10309
+ path : "/" ,
10310
+ } ,
10311
+ ] ) ;
10312
+ let request = createRequest ( "/" , { method : "OPTIONS" } ) ;
10313
+ let context = await query ( request ) ;
10314
+ expect ( context ) . toMatchObject ( {
10315
+ actionData : null ,
10316
+ loaderData : { } ,
10317
+ errors : {
10318
+ root : {
10319
+ status : 405 ,
10320
+ statusText : "Method Not Allowed" ,
10321
+ data : null ,
10250
10322
} ,
10251
10323
} ,
10252
10324
matches : [ { route : { id : "root" } } ] ,
@@ -10632,6 +10704,14 @@ describe("a router", () => {
10632
10704
expect ( data ) . toBe ( "CHILD LOADER" ) ;
10633
10705
} ) ;
10634
10706
10707
+ it ( "should support HEAD requests" , async ( ) => {
10708
+ let { queryRoute } = createStaticHandler ( SSR_ROUTES ) ;
10709
+ let data = await queryRoute (
10710
+ createRequest ( "/parent" , { method : "HEAD" } )
10711
+ ) ;
10712
+ expect ( data ) . toBe ( "PARENT LOADER" ) ;
10713
+ } ) ;
10714
+
10635
10715
it ( "should support singular route load navigations (primitives)" , async ( ) => {
10636
10716
let { queryRoute } = createStaticHandler ( SSR_ROUTES ) ;
10637
10717
let data ;
@@ -10800,6 +10880,29 @@ describe("a router", () => {
10800
10880
expect ( data ) . toBe ( "" ) ;
10801
10881
} ) ;
10802
10882
10883
+ it ( "should support alternative submission methods" , async ( ) => {
10884
+ let { queryRoute } = createStaticHandler ( SSR_ROUTES ) ;
10885
+ let data ;
10886
+
10887
+ data = await queryRoute (
10888
+ createSubmitRequest ( "/parent" , { method : "PUT" } ) ,
10889
+ "parent"
10890
+ ) ;
10891
+ expect ( data ) . toBe ( "PARENT ACTION" ) ;
10892
+
10893
+ data = await queryRoute (
10894
+ createSubmitRequest ( "/parent" , { method : "PATCH" } ) ,
10895
+ "parent"
10896
+ ) ;
10897
+ expect ( data ) . toBe ( "PARENT ACTION" ) ;
10898
+
10899
+ data = await queryRoute (
10900
+ createSubmitRequest ( "/parent" , { method : "DELETE" } ) ,
10901
+ "parent"
10902
+ ) ;
10903
+ expect ( data ) . toBe ( "PARENT ACTION" ) ;
10904
+ } ) ;
10905
+
10803
10906
it ( "should support singular route submit navigations (Responses)" , async ( ) => {
10804
10907
/* eslint-disable jest/no-conditional-expect */
10805
10908
let T = setupFlexRouteTest ( ) ;
@@ -11042,20 +11145,6 @@ describe("a router", () => {
11042
11145
expect ( e ) . toMatchInlineSnapshot ( `[Error: queryRoute() call aborted]` ) ;
11043
11146
} ) ;
11044
11147
11045
- it ( "should not support HEAD requests" , async ( ) => {
11046
- let { queryRoute } = createStaticHandler ( SSR_ROUTES ) ;
11047
- let request = createRequest ( "/" , { method : "head" } ) ;
11048
- let e ;
11049
- try {
11050
- await queryRoute ( request , "index" ) ;
11051
- } catch ( _e ) {
11052
- e = _e ;
11053
- }
11054
- expect ( e ) . toMatchInlineSnapshot (
11055
- `[Error: query()/queryRoute() do not support HEAD requests]`
11056
- ) ;
11057
- } ) ;
11058
-
11059
11148
it ( "should require a signal on the request" , async ( ) => {
11060
11149
let { queryRoute } = createStaticHandler ( SSR_ROUTES ) ;
11061
11150
let request = createRequest ( "/" , { signal : undefined } ) ;
@@ -11139,7 +11228,32 @@ describe("a router", () => {
11139
11228
expect ( data . status ) . toBe ( 405 ) ;
11140
11229
expect ( data . statusText ) . toBe ( "Method Not Allowed" ) ;
11141
11230
expect ( data . headers . get ( "X-Remix-Router-Error" ) ) . toBe ( "yes" ) ;
11142
- expect ( await data . text ( ) ) . toBe ( "No action found for [/]" ) ;
11231
+ expect ( await data . text ( ) ) . toBe ( "" ) ;
11232
+ }
11233
+ /* eslint-enable jest/no-conditional-expect */
11234
+ } ) ;
11235
+
11236
+ it ( "should handle unsupported methods with a 405 Response" , async ( ) => {
11237
+ /* eslint-disable jest/no-conditional-expect */
11238
+ let { queryRoute } = createStaticHandler ( [
11239
+ {
11240
+ id : "root" ,
11241
+ path : "/" ,
11242
+ } ,
11243
+ ] ) ;
11244
+
11245
+ try {
11246
+ await queryRoute (
11247
+ createSubmitRequest ( "/" , { method : "OPTIONS" } ) ,
11248
+ "root"
11249
+ ) ;
11250
+ expect ( false ) . toBe ( true ) ;
11251
+ } catch ( data ) {
11252
+ expect ( data instanceof Response ) . toBe ( true ) ;
11253
+ expect ( data . status ) . toBe ( 405 ) ;
11254
+ expect ( data . statusText ) . toBe ( "Method Not Allowed" ) ;
11255
+ expect ( data . headers . get ( "X-Remix-Router-Error" ) ) . toBe ( "yes" ) ;
11256
+ expect ( await data . text ( ) ) . toBe ( "" ) ;
11143
11257
}
11144
11258
/* eslint-enable jest/no-conditional-expect */
11145
11259
} ) ;
0 commit comments