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') }) })