Files
hermes-desktop/tests/server/auth-routes-avatar.test.ts
T
toor 01d9e301fc
Build / build (push) Canceled after 0s
Playwright / browser (push) Canceled after 0s
initialize Electron desktop app and remove unused files
2026-10-25 01:09:01 +08:00

90 lines
4.1 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
// Mock the controllers so we only verify wiring
vi.mock('../../packages/server/src/controllers/auth', () => ({
authStatus: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
login: vi.fn(async (ctx: any) => { ctx.body = { token: 'x' } }),
microcontrollerLogin: vi.fn(async (ctx: any) => { ctx.body = { token: 'x', profiles: [] } }),
setupPassword: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
currentUser: vi.fn(async (ctx: any) => { ctx.body = { user: {} } }),
changePassword: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
changeUsername: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
getMyAvatar: vi.fn(async (ctx: any) => { ctx.body = { avatar: '' } }),
updateMyAvatar: vi.fn(async (ctx: any) => { ctx.body = { success: true } }),
removePassword: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
listManagedUsers: vi.fn(async (ctx: any) => { ctx.body = { users: [] } }),
createManagedUser: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
updateManagedUser: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
deleteManagedUser: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
listLockedIps: vi.fn(async (ctx: any) => { ctx.body = { locks: [] } }),
unlockIpHandler: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
}))
const requireSuperAdminMock = vi.fn(async (_ctx: any, next: any) => { await next() })
vi.mock('../../packages/server/src/middleware/user-auth', () => ({
requireSuperAdmin: requireSuperAdminMock,
issueUserJwt: vi.fn(async () => 'jwt'),
}))
describe('auth routes: avatar endpoints', () => {
beforeEach(() => {
vi.resetModules()
vi.clearAllMocks()
})
function findLayer(router: any, method: string, path: string) {
return router.stack.find(
(entry: any) => Array.isArray(entry.methods) && entry.methods.includes(method) && entry.path === path,
)
}
it('mounts GET /api/auth/avatar on the protected router', async () => {
const { authProtectedRoutes } = await import('../../packages/server/src/routes/auth')
const layer = findLayer(authProtectedRoutes, 'GET', '/api/auth/avatar')
expect(layer).toBeDefined()
})
it('mounts PUT /api/auth/avatar on the protected router', async () => {
const { authProtectedRoutes } = await import('../../packages/server/src/routes/auth')
const layer = findLayer(authProtectedRoutes, 'PUT', '/api/auth/avatar')
expect(layer).toBeDefined()
})
it('does not expose the avatar routes on the public router', async () => {
const { authPublicRoutes, authProtectedRoutes } = await import('../../packages/server/src/routes/auth')
expect(findLayer(authPublicRoutes, 'GET', '/api/auth/avatar')).toBeUndefined()
expect(findLayer(authPublicRoutes, 'PUT', '/api/auth/avatar')).toBeUndefined()
expect(findLayer(authProtectedRoutes, 'GET', '/api/auth/avatar')).toBeDefined()
expect(findLayer(authProtectedRoutes, 'PUT', '/api/auth/avatar')).toBeDefined()
})
it('routes GET /api/auth/avatar to getMyAvatar', async () => {
const { authProtectedRoutes } = await import('../../packages/server/src/routes/auth')
const ctrl = await import('../../packages/server/src/controllers/auth')
const layer = findLayer(authProtectedRoutes, 'GET', '/api/auth/avatar')
expect(layer).toBeDefined()
const handler = layer!.stack[0]
const ctx: any = { request: { body: {} }, status: 200, body: null }
const next = vi.fn(async () => {})
await handler(ctx, next)
expect(ctrl.getMyAvatar).toHaveBeenCalledWith(ctx, next)
})
it('routes PUT /api/auth/avatar to updateMyAvatar', async () => {
const { authProtectedRoutes } = await import('../../packages/server/src/routes/auth')
const ctrl = await import('../../packages/server/src/controllers/auth')
const layer = findLayer(authProtectedRoutes, 'PUT', '/api/auth/avatar')
expect(layer).toBeDefined()
const handler = layer!.stack[0]
const ctx: any = { request: { body: { type: 'default' } }, status: 200, body: null }
const next = vi.fn(async () => {})
await handler(ctx, next)
expect(ctrl.updateMyAvatar).toHaveBeenCalledWith(ctx, next)
})
})