import { createPinia, setActivePinia } from 'pinia' import { beforeEach, describe, expect, it, vi } from 'vitest' import { usersApi } from '../api/users' import { useUsersStore } from './users' vi.mock('../api/users', () => ({ usersApi: { getAll: vi.fn(), create: vi.fn(), update: vi.fn(), delete: vi.fn() } })) describe('users store 的筛选保持', () => { beforeEach(() => { setActivePinia(createPinia()) vi.clearAllMocks() usersApi.getAll.mockResolvedValue({ data: { items: [], total: 0 } }) usersApi.create.mockResolvedValue({ data: {} }) usersApi.update.mockResolvedValue({ data: {} }) usersApi.delete.mockResolvedValue({ data: {} }) }) // 编辑/删除都在原地重新拉取列表,那次拉取必须沿用搜索框里的用户名:否则列表会悄悄 // 退回全量,而搜索框里还显示着用户输入的内容——用户会把全量列表当成筛选结果,接着 // 的删除操作就打在误认的那一条上。 it('编辑用户后刷新列表要沿用当前的搜索关键字', async () => { const store = useUsersStore() await store.fetchUsers(2, 'zhangsan') usersApi.getAll.mockClear() await store.updateUser(7, { username: 'zhangsan', role_ids: [2] }) expect(usersApi.getAll).toHaveBeenCalledWith({ limit: 20, offset: 20, search: 'zhangsan' }) }) it('删除用户后刷新列表要沿用当前的搜索关键字', async () => { const store = useUsersStore() await store.fetchUsers(1, 'zhangsan') usersApi.getAll.mockClear() await store.deleteUser(7) expect(usersApi.getAll).toHaveBeenCalledWith({ limit: 20, offset: 0, search: 'zhangsan' }) }) // 这处刻意与上面相反:新建的用户不一定匹配当前关键字,沿用搜索就看不见它,用户会 // 以为没建成功。 it('新建用户后要清空筛选并回到第 1 页', async () => { const store = useUsersStore() await store.fetchUsers(3, 'zhangsan') usersApi.getAll.mockClear() await store.createUser({ username: 'lisi', role_ids: [2] }) expect(usersApi.getAll).toHaveBeenCalledWith({ limit: 20, offset: 0, search: '' }) }) // 首次加载没有筛选条件,别把上一次的筛选状态带到新页面上。 it('不带筛选条件地重新查询会清掉旧的筛选状态', async () => { const store = useUsersStore() await store.fetchUsers(2, 'zhangsan') usersApi.getAll.mockClear() await store.fetchUsers() expect(usersApi.getAll).toHaveBeenCalledWith({ limit: 20, offset: 0, search: '' }) }) })