import { beforeEach, describe, expect, it, vi } from 'vitest' import { TicketsApi } from './TicketsApi' import type { ApiClient } from '../../core/ApiClient' // ── 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(), } } // ── Tests ──────────────────────────────────────────────────────────── describe('TicketsApi', () => { let client: ReturnType let api: TicketsApi beforeEach(() => { client = createMockClient() api = new TicketsApi(client) }) describe('closeMany', () => { it('PUTs /tickets/close-many with explicit ids', async () => { vi.mocked(client.put).mockResolvedValue({ ok: true }) const result = await api.closeMany({ ids: ['t1', 't2'] }) expect(client.put).toHaveBeenCalledWith( '/tickets/close-many', { ids: ['t1', 't2'] }, undefined, ) expect(result).toEqual({ ok: true }) }) it('PUTs /tickets/close-many with a JSON-stringified query for the select-all variant', async () => { vi.mocked(client.put).mockResolvedValue({ ok: true }) await api.closeMany({ allContactsSelected: true, query: { query: '{"where":{}}' } }) expect(client.put).toHaveBeenCalledWith( '/tickets/close-many', { allContactsSelected: true, query: { query: '{"where":{}}' } }, undefined, ) }) it('forwards custom headers', async () => { vi.mocked(client.put).mockResolvedValue({ ok: true }) const headers = { 'X-Custom': 'value' } await api.closeMany({ ids: ['t1'] }, headers) expect(client.put).toHaveBeenCalledWith('/tickets/close-many', { ids: ['t1'] }, headers) }) it('propagates errors', async () => { vi.mocked(client.put).mockRejectedValue(new Error('Forbidden')) await expect(api.closeMany({ ids: ['t1'] })).rejects.toThrow('Forbidden') }) }) })