RedirectIfAuthed.test.tsx
1.94 KB
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
// REQ-USR-004: RedirectIfAuthed —— 已登录访问 /login 回主页(BR2)
import { describe, it, expect } from 'vitest';
import { screen } from '@testing-library/react';
import { Routes, Route } from 'react-router-dom';
import { renderShell } from './renderShell';
import RedirectIfAuthed from '../../src/router/RedirectIfAuthed';
function LoginScreen() {
return <div data-testid="login-screen">login-screen</div>;
}
function HomeSentinel() {
return <div data-testid="home-sentinel">home-sentinel</div>;
}
function UsersSentinel() {
return <div data-testid="users-sentinel">users-sentinel</div>;
}
function renderTree(
initialEntries: { pathname: string; state?: unknown }[] | string[],
preloadedAuth?: Parameters<typeof renderShell>[1]['preloadedAuth'],
) {
return renderShell(
<Routes>
<Route
path="/login"
element={
<RedirectIfAuthed>
<LoginScreen />
</RedirectIfAuthed>
}
/>
<Route path="/" element={<HomeSentinel />} />
<Route path="/usr/users" element={<UsersSentinel />} />
</Routes>,
{ initialEntries: initialEntries as never, preloadedAuth },
);
}
const READY_USER = {
token: 't',
user: { id: 1, sUserName: '朱子纯', sUserType: '超级管理员', sLanguage: '中文' },
};
describe('RedirectIfAuthed', () => {
it('renders children when unauthenticated', () => {
renderTree(['/login'], { token: null, user: null });
expect(screen.getByTestId('login-screen')).toBeInTheDocument();
});
it('redirects to / when already authenticated', () => {
renderTree(['/login'], READY_USER);
expect(screen.getByTestId('home-sentinel')).toBeInTheDocument();
expect(screen.queryByTestId('login-screen')).not.toBeInTheDocument();
});
it('redirects to from when present', () => {
renderTree([{ pathname: '/login', state: { from: '/usr/users' } }], READY_USER);
expect(screen.getByTestId('users-sentinel')).toBeInTheDocument();
});
});