import fetchMock from '@fetch-mock/vitest' import { beforeEach, describe, expect, it } from 'vitest' import { Client, HTTPError, funcs } from '../src/index.js' beforeEach(() => { fetchMock.mockReset() }) function client() { return new Client({ baseUrl: 'https://eu.api.konghq.com/v3', apiKey: 'k', fetch: fetchMock.fetchHandler, }) } describe('void operations do not parse the response body', () => { it('resolves ingest of a single event on an empty 202 Accepted body', async () => { fetchMock.route('*', { status: 202, body: '' }) const result = await funcs.ingestMeteringEvents(client(), { specversion: '1.0', id: 'evt-1', source: 'test', type: 'request', subject: 'customer-1', }) expect(result.ok).toBe(true) expect(result.value).toBeUndefined() }) it('resolves ingest of a batch of events (array body)', async () => { fetchMock.route('*', { status: 202, body: '' }) const result = await funcs.ingestMeteringEvents(client(), [ { specversion: '1.0', id: 'evt-1', source: 'test', type: 'request', subject: 'customer-1', }, { specversion: '1.0', id: 'evt-2', source: 'test', type: 'request', subject: 'customer-2', }, ]) expect(result.ok).toBe(true) expect(result.value).toBeUndefined() const sent = JSON.parse( fetchMock.callHistory.lastCall()!.options.body as string, ) expect(Array.isArray(sent)).toBe(true) expect(sent).toHaveLength(2) }) it('resolves delete on a 204 No Content response', async () => { fetchMock.route('*', { status: 204 }) const result = await funcs.deleteMeter(client(), { meterId: 'm' }) expect(result.ok).toBe(true) expect(result.value).toBeUndefined() }) it('still rejects a void operation on a non-2xx status', async () => { fetchMock.route('*', { status: 500, body: 'oops', headers: { 'Content-Type': 'text/plain' }, }) const result = await funcs.deleteMeter(client(), { meterId: 'm' }) expect(result.ok).toBe(false) expect(result.error).toBeInstanceOf(HTTPError) expect((result.error as HTTPError).status).toBe(500) }) it('preserves problem+json error detail on a void operation', async () => { fetchMock.route('*', { status: 404, body: { type: 't', title: 'Not Found', status: 404, detail: 'nope', instance: '/x', }, headers: { 'Content-Type': 'application/problem+json; charset=utf-8', }, }) const result = await funcs.deleteMeter(client(), { meterId: 'm' }) expect(result.ok).toBe(false) const error = result.error as HTTPError expect(error.status).toBe(404) expect(error.title).toBe('Not Found') expect(error.message).toBe('nope') }) })