mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-31 00:24:38 +00:00
Merge remote-tracking branch 'origin/main' into feat/grok-sso-device-oauth
# Conflicts: # frontend/src/api/admin/grok.ts
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import {
|
||||
ADMIN_UI_REQUEST_HEADER,
|
||||
shouldMarkAdminUIRequest,
|
||||
} from '@/api/adminUIRequest'
|
||||
|
||||
describe('Admin UI request marker', () => {
|
||||
it('uses the stable request header name', () => {
|
||||
expect(ADMIN_UI_REQUEST_HEADER).toBe('X-Admin-UI-Request')
|
||||
})
|
||||
|
||||
it.each([
|
||||
'/admin',
|
||||
'/admin/users',
|
||||
'/api/v1/admin',
|
||||
'/api/v1/admin/accounts?status=active',
|
||||
'https://api.example.test/api/v1/admin/dashboard',
|
||||
])('marks Admin API request %s before page navigation', (requestURL) => {
|
||||
expect(shouldMarkAdminUIRequest(requestURL, '/login')).toBe(true)
|
||||
})
|
||||
|
||||
it.each(['/keys', '/groups/available', '/auth/me', '/announcements'])(
|
||||
'marks shared request %s while an Admin page is active',
|
||||
(requestURL) => {
|
||||
expect(shouldMarkAdminUIRequest(requestURL, '/admin/dashboard')).toBe(true)
|
||||
}
|
||||
)
|
||||
|
||||
it.each([
|
||||
['/keys', '/dashboard'],
|
||||
['/api/v1/administer', '/dashboard'],
|
||||
['/keys', '/administrator'],
|
||||
['', '/'],
|
||||
])('does not mark request %s on page %s', (requestURL, pagePath) => {
|
||||
expect(shouldMarkAdminUIRequest(requestURL, pagePath)).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -12,6 +12,7 @@ describe('API Client', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
localStorage.clear()
|
||||
window.history.replaceState({}, '', '/')
|
||||
// 每次测试重新导入以获取干净的模块状态
|
||||
vi.resetModules()
|
||||
const mod = await import('@/api/client')
|
||||
@@ -120,6 +121,55 @@ describe('API Client', () => {
|
||||
const config = adapter.mock.calls[0][0]
|
||||
expect(config.withCredentials).toBe(true)
|
||||
})
|
||||
|
||||
it('Admin API 在进入管理页面前也带 Admin UI 标记', async () => {
|
||||
const adapter = vi.fn().mockResolvedValue({
|
||||
status: 200,
|
||||
data: { code: 0, data: {} },
|
||||
headers: {},
|
||||
config: {},
|
||||
statusText: 'OK',
|
||||
})
|
||||
apiClient.defaults.adapter = adapter
|
||||
|
||||
await apiClient.get('/admin/users')
|
||||
|
||||
const config = adapter.mock.calls[0][0]
|
||||
expect(config.headers.get('X-Admin-UI-Request')).toBe('1')
|
||||
})
|
||||
|
||||
it('管理页面调用共享 API 时带 Admin UI 标记', async () => {
|
||||
window.history.replaceState({}, '', '/admin/dashboard')
|
||||
const adapter = vi.fn().mockResolvedValue({
|
||||
status: 200,
|
||||
data: { code: 0, data: {} },
|
||||
headers: {},
|
||||
config: {},
|
||||
statusText: 'OK',
|
||||
})
|
||||
apiClient.defaults.adapter = adapter
|
||||
|
||||
await apiClient.get('/groups/available')
|
||||
|
||||
const config = adapter.mock.calls[0][0]
|
||||
expect(config.headers.get('X-Admin-UI-Request')).toBe('1')
|
||||
})
|
||||
|
||||
it('普通用户页面调用共享 API 时不带 Admin UI 标记', async () => {
|
||||
const adapter = vi.fn().mockResolvedValue({
|
||||
status: 200,
|
||||
data: { code: 0, data: {} },
|
||||
headers: {},
|
||||
config: {},
|
||||
statusText: 'OK',
|
||||
})
|
||||
apiClient.defaults.adapter = adapter
|
||||
|
||||
await apiClient.get('/groups/available')
|
||||
|
||||
const config = adapter.mock.calls[0][0]
|
||||
expect(config.headers.get('X-Admin-UI-Request')).toBeFalsy()
|
||||
})
|
||||
})
|
||||
|
||||
// --- 响应拦截器 ---
|
||||
|
||||
Reference in New Issue
Block a user