Files
user-system/frontend/admin/src/services/devices.test.ts
long-agent 40d146b6aa test: add Stage 1 lib and Stage 2 services test coverage
Add comprehensive unit tests for:
- lib layer: config, device-fingerprint, errors, storage, hooks/useBreadcrumbs, http
- services layer: devices, login-logs, operation-logs, permissions, profile, roles, settings, stats, import-export

All 491 tests pass across 74 test files.
2026-04-17 23:59:15 +08:00

126 lines
3.6 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
const getMock = vi.fn()
const postMock = vi.fn()
const putMock = vi.fn()
const delMock = vi.fn()
vi.mock('@/lib/http/client', () => ({
get: getMock,
post: postMock,
put: putMock,
del: delMock,
}))
describe('devices service', () => {
beforeEach(() => {
getMock.mockReset()
postMock.mockReset()
putMock.mockReset()
delMock.mockReset()
})
it('lists user devices', async () => {
const { listDevices } = await import('./devices')
await listDevices({ page: 1, page_size: 10 })
expect(getMock).toHaveBeenCalledWith('/devices', { page: 1, page_size: 10 })
})
it('lists all devices for admin', async () => {
const { listAllDevices } = await import('./devices')
await listAllDevices({ page: 1, page_size: 20, status: 1 })
expect(getMock).toHaveBeenCalledWith('/admin/devices', { page: 1, page_size: 20, status: 1 })
})
it('gets a single device by id', async () => {
const { getDevice } = await import('./devices')
await getDevice(5)
expect(getMock).toHaveBeenCalledWith('/devices/5')
})
it('deletes a user device', async () => {
const { deleteDevice } = await import('./devices')
await deleteDevice(3)
expect(delMock).toHaveBeenCalledWith('/devices/3')
})
it('deletes a device by admin', async () => {
const { adminDeleteDevice } = await import('./devices')
await adminDeleteDevice(7)
expect(delMock).toHaveBeenCalledWith('/admin/devices/7')
})
it('updates device status', async () => {
const { updateDeviceStatus } = await import('./devices')
await updateDeviceStatus(2, 1)
expect(putMock).toHaveBeenCalledWith('/devices/2/status', { status: 1 })
})
it('updates device status by admin', async () => {
const { adminUpdateDeviceStatus } = await import('./devices')
await adminUpdateDeviceStatus(4, 0)
expect(putMock).toHaveBeenCalledWith('/admin/devices/4/status', { status: 0 })
})
it('trusts a device', async () => {
const { trustDevice } = await import('./devices')
await trustDevice(1, '30d')
expect(postMock).toHaveBeenCalledWith('/devices/1/trust', { trust_duration: '30d' })
})
it('trusts a device by admin', async () => {
const { adminTrustDevice } = await import('./devices')
await adminTrustDevice(6, '7d')
expect(postMock).toHaveBeenCalledWith('/admin/devices/6/trust', { trust_duration: '7d' })
})
it('trusts a device by device id string', async () => {
const { trustDeviceByDeviceId } = await import('./devices')
await trustDeviceByDeviceId('device-abc-123', '30d')
expect(postMock).toHaveBeenCalledWith(
'/devices/by-device-id/device-abc-123/trust',
{ trust_duration: '30d' },
)
})
it('untrusts a device', async () => {
const { untrustDevice } = await import('./devices')
await untrustDevice(2)
expect(delMock).toHaveBeenCalledWith('/devices/2/trust')
})
it('untrusts a device by admin', async () => {
const { adminUntrustDevice } = await import('./devices')
await adminUntrustDevice(8)
expect(delMock).toHaveBeenCalledWith('/admin/devices/8/trust')
})
it('gets my trusted devices', async () => {
const { getMyTrustedDevices } = await import('./devices')
await getMyTrustedDevices()
expect(getMock).toHaveBeenCalledWith('/devices/me/trusted')
})
it('logs out other devices', async () => {
const { logoutOtherDevices } = await import('./devices')
await logoutOtherDevices('current-device-id')
expect(postMock).toHaveBeenCalledWith('/devices/me/logout-others', {
current_device_id: 'current-device-id',
})
})
})