import { beforeEach, describe, expect, it, vi } from 'vitest' import { ServiceAccessManagementApi } from './ServiceAccessManagementApi' import type { ApiClient } from '../../core/ApiClient' import type { ServiceAccessManagement } from './types' import type { Paginated } from '../../core/types' // ── Mock client factory ────────────────────────────────────────────── function createMockClient(): ApiClient { return { setAccessToken: vi.fn().mockReturnThis(), request: vi.fn(), get: vi.fn(), post: vi.fn(), put: vi.fn(), patch: vi.fn(), delete: vi.fn(), } } // ── Fixtures ───────────────────────────────────────────────────────── const record: ServiceAccessManagement = { userId: 'user-1', serviceId: 'svc-1', createdAt: '2024-01-01T00:00:00Z', } const paginated: Paginated = { data: [record], total: 1, limit: 10, skip: 0, currentPage: 1, lastPage: 1, from: 1, to: 1, } // ── Tests ──────────────────────────────────────────────────────────── describe('ServiceAccessManagementApi', () => { let client: ReturnType let api: ServiceAccessManagementApi beforeEach(() => { client = createMockClient() api = new ServiceAccessManagementApi(client) }) // ── getMany ────────────────────────────────────────────────────── describe('getMany', () => { it('calls client.get with /service-access-management when no query is provided', async () => { vi.mocked(client.get).mockResolvedValue(paginated) const result = await api.getMany() expect(client.get).toHaveBeenCalledWith('/service-access-management', undefined) expect(result).toEqual(paginated) }) it('serializes query parameters', async () => { vi.mocked(client.get).mockResolvedValue(paginated) await api.getMany({ page: 2, perPage: 5 }) const url = vi.mocked(client.get).mock.calls[0][0] as string expect(url).toContain('/service-access-management?') expect(url).toContain('page=2') }) it('forwards custom headers', async () => { vi.mocked(client.get).mockResolvedValue(paginated) const headers = { 'X-Custom': 'h' } await api.getMany(undefined, headers) expect(client.get).toHaveBeenCalledWith('/service-access-management', headers) }) it('returns unpaginated array when paginate: false', async () => { vi.mocked(client.get).mockResolvedValue([record]) const result = await api.getMany({ paginate: false }) const url = vi.mocked(client.get).mock.calls[0][0] as string expect(url).toContain('paginate=false') expect(result).toEqual([record]) }) it('propagates errors from client.get', async () => { vi.mocked(client.get).mockRejectedValue(new Error('Forbidden')) await expect(api.getMany()).rejects.toThrow('Forbidden') }) }) })