From 3d7c05cdcbb65d57bd943941d560b07d59e6a850 Mon Sep 17 00:00:00 2001 From: Nick Zeng Date: Fri, 17 Apr 2026 14:50:58 +0800 Subject: [PATCH] update --- .../stores/__tests__/admin-api-key.spec.ts | 79 +++++++++++++++++++ frontend/src/stores/admin-api-key.ts | 4 +- 2 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 frontend/src/stores/__tests__/admin-api-key.spec.ts diff --git a/frontend/src/stores/__tests__/admin-api-key.spec.ts b/frontend/src/stores/__tests__/admin-api-key.spec.ts new file mode 100644 index 0000000..0b7df92 --- /dev/null +++ b/frontend/src/stores/__tests__/admin-api-key.spec.ts @@ -0,0 +1,79 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { setActivePinia, createPinia } from 'pinia' + +vi.mock('@/utils/request', () => ({ + api: { + get: vi.fn(), + post: vi.fn(), + put: vi.fn(), + patch: vi.fn(), + delete: vi.fn(), + }, +})) + +import { api } from '@/utils/request' +import { useAdminApiKeyStore } from '../admin-api-key' + +const emptyPage = { items: [], total: 0, page: 1, per_page: 15 } + +describe('useAdminApiKeyStore', () => { + beforeEach(() => { + setActivePinia(createPinia()) + vi.restoreAllMocks() + }) + + describe('fetchAllKeys — enabled 查询参数契约', () => { + it('enabled=true 应序列化为 1(后端期望 integer 0/1)', async () => { + vi.mocked(api.get).mockResolvedValueOnce(emptyPage) + + const store = useAdminApiKeyStore() + store.filters.enabled = true + await store.fetchAllKeys() + + expect(api.get).toHaveBeenCalledWith( + '/api/v1/admin/api-keys', + expect.objectContaining({ enabled: 1 }), + ) + }) + + it('enabled=false 应序列化为 0', async () => { + vi.mocked(api.get).mockResolvedValueOnce(emptyPage) + + const store = useAdminApiKeyStore() + store.filters.enabled = false + await store.fetchAllKeys() + + expect(api.get).toHaveBeenCalledWith( + '/api/v1/admin/api-keys', + expect.objectContaining({ enabled: 0 }), + ) + }) + + it('enabled=undefined 应保持 undefined(不触发筛选)', async () => { + vi.mocked(api.get).mockResolvedValueOnce(emptyPage) + + const store = useAdminApiKeyStore() + await store.fetchAllKeys() + + expect(api.get).toHaveBeenCalledWith( + '/api/v1/admin/api-keys', + expect.objectContaining({ enabled: undefined }), + ) + }) + }) + + describe('toggleUserApiKeyEnabled — 请求体字段名契约', () => { + it('应发送 api_key_enabled 字段(后端 UserController::updateApiKeyEnabled 读取该字段)', async () => { + vi.mocked(api.patch).mockResolvedValueOnce(undefined) + vi.mocked(api.get).mockResolvedValueOnce(emptyPage) + + const store = useAdminApiKeyStore() + await store.toggleUserApiKeyEnabled(42, true) + + expect(api.patch).toHaveBeenCalledWith( + '/api/v1/users/42/api-key-enabled', + { api_key_enabled: true }, + ) + }) + }) +}) diff --git a/frontend/src/stores/admin-api-key.ts b/frontend/src/stores/admin-api-key.ts index 15a7dd1..e23afd9 100644 --- a/frontend/src/stores/admin-api-key.ts +++ b/frontend/src/stores/admin-api-key.ts @@ -21,7 +21,7 @@ export const useAdminApiKeyStore = defineStore('admin-api-key', () => { page: pagination.page, per_page: pagination.per_page, user_id: filters.user_id, - enabled: filters.enabled, + enabled: filters.enabled === undefined ? undefined : filters.enabled ? 1 : 0, }) keys.value = data.items pagination.total = data.total @@ -57,7 +57,7 @@ export const useAdminApiKeyStore = defineStore('admin-api-key', () => { async function toggleUserApiKeyEnabled(userId: number, enabled: boolean) { try { - await api.patch(`/api/v1/users/${userId}/api-key-enabled`, { enabled }) + await api.patch(`/api/v1/users/${userId}/api-key-enabled`, { api_key_enabled: enabled }) await fetchAllKeys() } catch (err: unknown) { const msg = err instanceof Error ? err.message : '操作失败'