Files
carmanagement/apps/admin/src/lib/api.test.ts
T
2026-06-10 00:40:19 -04:00

48 lines
1.8 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from 'vitest'
afterEach(() => {
delete process.env.API_INTERNAL_URL
delete process.env.NEXT_PUBLIC_API_URL
vi.restoreAllMocks()
Reflect.deleteProperty(globalThis, 'fetch')
vi.resetModules()
})
describe('adminFetch', () => {
it('requests through the server API base and returns the data envelope', async () => {
process.env.API_INTERNAL_URL = 'http://internal-api/api/v1'
const fetchMock = vi.fn(async () => ({
ok: true,
json: async () => ({ data: { companies: [] } }),
}))
Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })
const { adminFetch } = await import('./api')
await expect(adminFetch('/admin/companies', 'admin-token')).resolves.toEqual({ companies: [] })
expect(fetchMock).toHaveBeenCalledWith('http://internal-api/api/v1/admin/companies', {
cache: 'no-store',
credentials: 'include',
})
})
it('omits authorization when no token is supplied', async () => {
delete process.env.API_INTERNAL_URL
const fetchMock = vi.fn(async () => ({ ok: true, json: async () => ({ data: { ok: true } }) }))
Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })
const { adminFetch } = await import('./api')
await adminFetch('/public')
expect((fetchMock as any).mock.calls[0]?.[1]).toEqual({ cache: 'no-store', credentials: 'include' })
})
it('throws the API message from failed responses', async () => {
const fetchMock = vi.fn(async () => ({ ok: false, json: async () => ({ message: 'Admin only' }) }))
Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })
const { adminFetch } = await import('./api')
await expect(adminFetch('/admin/menu')).rejects.toThrow('Admin only')
})
})