/
useMatch-test.tsx
137 lines (123 loc) · 3.64 KB
/
useMatch-test.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import * as React from "react";
import * as TestRenderer from "react-test-renderer";
import { MemoryRouter, PathMatch, Routes, Route, useMatch } from "react-router";
function ShowMatch({ pattern }: { pattern: string }) {
return <pre>{JSON.stringify(useMatch(pattern), null, 2)}</pre>;
}
describe("useMatch", () => {
describe("when the path matches the current URL", () => {
it("returns the match", () => {
let renderer: TestRenderer.ReactTestRenderer;
TestRenderer.act(() => {
renderer = TestRenderer.create(
<MemoryRouter initialEntries={["/home"]}>
<Routes>
<Route path="/" element={<ShowMatch pattern="home" />}>
<Route path="/home" element={<h1>Home</h1>} />
</Route>
</Routes>
</MemoryRouter>
);
});
expect(renderer.toJSON()).toMatchInlineSnapshot(`
<pre>
{
"params": {},
"pathname": "/home",
"pathnameBase": "/home",
"pattern": {
"path": "home",
"caseSensitive": false,
"end": true
}
}
</pre>
`);
});
});
describe("when the current URL ends with a slash", () => {
it("returns the match.pathname with the trailing slash", () => {
let renderer: TestRenderer.ReactTestRenderer;
TestRenderer.act(() => {
renderer = TestRenderer.create(
<MemoryRouter initialEntries={["/home/"]}>
<Routes>
<Route path="/" element={<ShowMatch pattern="home" />}>
<Route path="/home" element={<h1>Home</h1>} />
</Route>
</Routes>
</MemoryRouter>
);
});
expect(renderer.toJSON()).toMatchInlineSnapshot(`
<pre>
{
"params": {},
"pathname": "/home/",
"pathnameBase": "/home",
"pattern": {
"path": "home",
"caseSensitive": false,
"end": true
}
}
</pre>
`);
});
});
describe("when the path does not match the current URL", () => {
it("returns null", () => {
let renderer: TestRenderer.ReactTestRenderer;
TestRenderer.act(() => {
renderer = TestRenderer.create(
<MemoryRouter initialEntries={["/home"]}>
<Routes>
<Route path="/" element={<ShowMatch pattern="about" />}>
<Route path="/home" element={<h1>Home</h1>} />
</Route>
</Routes>
</MemoryRouter>
);
});
expect(renderer.toJSON()).toMatchInlineSnapshot(`
<pre>
null
</pre>
`);
});
});
describe("when re-rendered with the same URL", () => {
it("returns the memoized match", () => {
let path = "/home";
let match: PathMatch<string>;
let firstMatch: PathMatch<string>;
function HomePage() {
match = useMatch(path);
if (!firstMatch) {
firstMatch = match;
}
return null;
}
let renderer: TestRenderer.ReactTestRenderer;
TestRenderer.act(() => {
renderer = TestRenderer.create(
<MemoryRouter initialEntries={[path]}>
<Routes>
<Route path={path} element={<HomePage />} />
</Routes>
</MemoryRouter>
);
});
TestRenderer.act(() => {
renderer.update(
<MemoryRouter initialEntries={[path]}>
<Routes>
<Route path={path} element={<HomePage />} />
</Routes>
</MemoryRouter>
);
});
expect(match).toBe(firstMatch);
});
});
});