LoginPage.test.tsx
2.39 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import { describe, it, expect, vi, beforeEach } from 'vitest'
import { render, screen, waitFor, act } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { Provider } from 'react-redux'
import { MemoryRouter } from 'react-router-dom'
import { configureStore } from '@reduxjs/toolkit'
import authReducer, { UserInfoVO } from '../store/slices/authSlice'
import LoginPage from '../pages/usr/LoginPage'
import * as authApi from '../api/auth'
vi.mock('../api/auth', () => ({
getBrands: vi.fn(),
login: vi.fn()
}))
vi.mock('../api/request', () => ({
default: { get: vi.fn(), post: vi.fn() }
}))
function makeStore() {
return configureStore({ reducer: { auth: authReducer } })
}
function renderLoginPage(store = makeStore()) {
return {
store,
...render(
<Provider store={store}>
<MemoryRouter>
<LoginPage />
</MemoryRouter>
</Provider>
)
}
}
describe('LoginPage', () => {
beforeEach(() => {
vi.mocked(authApi.getBrands).mockResolvedValue([
{ sNo: 'STD', sName: '标准版' }
])
})
it('renders_brandSelect_username_and_password_fields', async () => {
renderLoginPage()
await waitFor(() => expect(screen.getByText('公司/版本')).toBeInTheDocument())
expect(screen.getByText('用户名')).toBeInTheDocument()
expect(screen.getByText('密码')).toBeInTheDocument()
expect(screen.getByRole('button', { name: /登\s*录/ })).toBeInTheDocument()
})
it('submit_withValidCredentials_dispatchesSetCredentials', async () => {
const mockUserInfo: UserInfoVO = {
userId: 'u1', username: 'admin', userType: '超级管理员', language: '中文', brandId: 'b1'
}
vi.mocked(authApi.login).mockResolvedValue({
accessToken: 'at',
refreshToken: 'rt',
expiresIn: 86400,
userInfo: mockUserInfo
})
const { store } = renderLoginPage()
// Flush getBrands().then() callback so form.setFieldValue('brandNo') runs before submit
await act(async () => { await Promise.resolve() })
await userEvent.type(screen.getByPlaceholderText('请输入用户名'), 'admin')
await userEvent.type(screen.getByPlaceholderText('请输入密码'), '666666')
await userEvent.click(screen.getByRole('button', { name: /登\s*录/ }))
await waitFor(() => expect(store.getState().auth.accessToken).toBe('at'))
expect(store.getState().auth.userInfo?.userId).toBe('u1')
})
})