import { beforeEach, describe, expect, it, vi } from 'vitest' import { ClientFeedbackApi } from './ClientFeedbackApi' import type { ApiClient } from '../../core/ApiClient' import type { ClientFeedback, CreateClientFeedbackPayload } from './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 feedback: ClientFeedback = { id: 'cf-1', accountId: 'acc-1', ticketId: 'ticket-1', feedback: 'Great service!', createdAt: '2024-01-01T00:00:00Z', updatedAt: '2024-01-01T00:00:00Z', } // ── Tests ──────────────────────────────────────────────────────────── describe('ClientFeedbackApi', () => { let client: ReturnType let api: ClientFeedbackApi beforeEach(() => { client = createMockClient() api = new ClientFeedbackApi(client) }) // ── create ─────────────────────────────────────────────────────── describe('create', () => { it('calls client.post with /client-feedback and body', async () => { vi.mocked(client.post).mockResolvedValue(feedback) const body: CreateClientFeedbackPayload = { accountId: 'acc-1', ticketId: 'ticket-1', feedback: 'Great service!', } const result = await api.create(body) expect(client.post).toHaveBeenCalledWith('/client-feedback', body, undefined) expect(result).toEqual(feedback) }) it('forwards custom headers', async () => { vi.mocked(client.post).mockResolvedValue(feedback) const headers = { 'X-Custom': 'h' } const body: CreateClientFeedbackPayload = { accountId: 'acc-1', ticketId: 'ticket-1', feedback: 'Good', } await api.create(body, headers) expect(client.post).toHaveBeenCalledWith('/client-feedback', body, headers) }) it('propagates errors from client.post', async () => { vi.mocked(client.post).mockRejectedValue(new Error('Bad request')) await expect( api.create({ accountId: 'acc-1', ticketId: 't-1', feedback: 'x' }), ).rejects.toThrow('Bad request') }) }) })