@@ -8,6 +8,7 @@ import { JSDOM } from "jsdom";
8
8
import * as React from "react" ;
9
9
import * as TestRenderer from "react-test-renderer" ;
10
10
import {
11
+ BrowserRouter ,
11
12
MemoryRouter ,
12
13
Routes ,
13
14
Route ,
@@ -189,6 +190,37 @@ describe("NavLink", () => {
189
190
190
191
expect ( anchor . children [ 0 ] ) . toMatch ( "Home (current)" ) ;
191
192
} ) ;
193
+
194
+ it ( "matches when portions of the url are encoded" , ( ) => {
195
+ let renderer : TestRenderer . ReactTestRenderer ;
196
+
197
+ TestRenderer . act ( ( ) => {
198
+ renderer = TestRenderer . create (
199
+ < BrowserRouter window = { getWindow ( "/users/matt brophy" ) } >
200
+ < Routes >
201
+ < Route
202
+ path = "/users/:name"
203
+ element = {
204
+ < >
205
+ < NavLink to = "." > Matt</ NavLink >
206
+ < NavLink to = "/users/matt brophy" > Matt</ NavLink >
207
+ < NavLink to = "/users/michael jackson" > Michael</ NavLink >
208
+ </ >
209
+ }
210
+ />
211
+ </ Routes >
212
+ </ BrowserRouter >
213
+ ) ;
214
+ } ) ;
215
+
216
+ let anchors = renderer . root . findAllByType ( "a" ) ;
217
+
218
+ expect ( anchors . map ( ( a ) => a . props . className ) ) . toEqual ( [
219
+ "active" ,
220
+ "active" ,
221
+ "" ,
222
+ ] ) ;
223
+ } ) ;
192
224
} ) ;
193
225
194
226
describe ( "when it matches a partial URL segment" , ( ) => {
@@ -712,6 +744,64 @@ describe("NavLink using a data router", () => {
712
744
await waitFor ( ( ) => screen . getByText ( "Baz page" ) ) ;
713
745
expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "" ) ;
714
746
} ) ;
747
+
748
+ it ( "applies the default 'active'/'pending' classNames when the url has encoded characters" , async ( ) => {
749
+ let barDfd = createDeferred ( ) ;
750
+ let bazDfd = createDeferred ( ) ;
751
+ let router = createBrowserRouter (
752
+ createRoutesFromElements (
753
+ < Route path = "/" element = { < Layout /> } >
754
+ < Route path = "foo" element = { < p > Foo page</ p > } />
755
+ < Route
756
+ path = "bar/:param"
757
+ loader = { ( ) => barDfd . promise }
758
+ element = { < p > Bar page</ p > }
759
+ />
760
+ < Route
761
+ path = "baz-✅"
762
+ loader = { ( ) => bazDfd . promise }
763
+ element = { < p > Baz page</ p > }
764
+ />
765
+ </ Route >
766
+ ) ,
767
+ {
768
+ window : getWindow ( "/foo" ) ,
769
+ }
770
+ ) ;
771
+ render ( < RouterProvider router = { router } /> ) ;
772
+
773
+ function Layout ( ) {
774
+ return (
775
+ < >
776
+ < NavLink to = "/foo" > Link to Foo</ NavLink >
777
+ < NavLink to = "/bar/matt brophy" > Link to Bar</ NavLink >
778
+ < NavLink to = "/baz-✅" > Link to Baz</ NavLink >
779
+ < Outlet />
780
+ </ >
781
+ ) ;
782
+ }
783
+
784
+ expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "" ) ;
785
+ expect ( screen . getByText ( "Link to Baz" ) . className ) . toBe ( "" ) ;
786
+
787
+ fireEvent . click ( screen . getByText ( "Link to Bar" ) ) ;
788
+ expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "pending" ) ;
789
+ expect ( screen . getByText ( "Link to Baz" ) . className ) . toBe ( "" ) ;
790
+
791
+ barDfd . resolve ( null ) ;
792
+ await waitFor ( ( ) => screen . getByText ( "Bar page" ) ) ;
793
+ expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "active" ) ;
794
+ expect ( screen . getByText ( "Link to Baz" ) . className ) . toBe ( "" ) ;
795
+
796
+ fireEvent . click ( screen . getByText ( "Link to Baz" ) ) ;
797
+ expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "active" ) ;
798
+ expect ( screen . getByText ( "Link to Baz" ) . className ) . toBe ( "pending" ) ;
799
+
800
+ bazDfd . resolve ( null ) ;
801
+ await waitFor ( ( ) => screen . getByText ( "Baz page" ) ) ;
802
+ expect ( screen . getByText ( "Link to Bar" ) . className ) . toBe ( "" ) ;
803
+ expect ( screen . getByText ( "Link to Baz" ) . className ) . toBe ( "active" ) ;
804
+ } ) ;
715
805
} ) ;
716
806
717
807
describe ( "NavLink under a Routes with a basename" , ( ) => {
0 commit comments