48 lines
1.8 KiB
TypeScript
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')
|
|
})
|
|
})
|