wulf-pulse/lib/services/autotask-client.test.ts
lorentz 8be10db6e0 test(16-02): add failing test for AutotaskClient.getAttachmentContent
- Asserts items[0] convention for per-attachment-ID GET
- Asserts {item:...}-shaped response yields null (guards against regression)
2026-07-15 10:22:01 -04:00

73 lines
2.5 KiB
TypeScript

import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { AutotaskClient } from './autotask-client';
import type { AutotaskConfig } from '@/lib/types/autotask';
const FIXTURE_CONFIG: AutotaskConfig = {
apiUrl: 'https://webservices.autotask.net/atservicesrest/v1.0',
username: 'fixture@example.com',
password: 'fixture-secret',
apiIntegrationCode: 'FIXTURE-CODE',
};
function jsonResponse(body: unknown, ok = true, status = 200): Response {
return {
ok,
status,
statusText: ok ? 'OK' : 'Error',
text: async () => JSON.stringify(body),
} as unknown as Response;
}
describe('AutotaskClient.getAttachmentContent', () => {
const originalFetch = global.fetch;
beforeEach(() => {
global.fetch = vi.fn();
});
afterEach(() => {
global.fetch = originalFetch;
vi.restoreAllMocks();
});
it('returns items[0] with populated base64 data when the API returns an items-shaped envelope', async () => {
const attachment = { id: 555, fullPath: 'rfc.eml', title: 'rfc.eml', data: 'YmFzZTY0LWNvbnRlbnQ=' };
(global.fetch as unknown as ReturnType<typeof vi.fn>).mockResolvedValue(
jsonResponse({ items: [attachment] })
);
const client = new AutotaskClient(FIXTURE_CONFIG);
const result = await client.getAttachmentContent('Tickets', 12345, 555);
expect(result).toEqual(attachment);
expect(global.fetch).toHaveBeenCalledWith(
`${FIXTURE_CONFIG.apiUrl}/Tickets/12345/Attachments/555`,
expect.objectContaining({ method: 'GET' })
);
});
it('returns null when the API returns an empty items array', async () => {
(global.fetch as unknown as ReturnType<typeof vi.fn>).mockResolvedValue(
jsonResponse({ items: [] })
);
const client = new AutotaskClient(FIXTURE_CONFIG);
const result = await client.getAttachmentContent('Tickets', 12345, 999);
expect(result).toBeNull();
});
it('returns null (not the attachment) when the API returns an {item:...}-shaped response', async () => {
// Guards against a future refactor copying uploadAttachment's `.item`
// convention onto this method — the live shape is `.items`.
const attachment = { id: 555, fullPath: 'rfc.eml', title: 'rfc.eml', data: 'YmFzZTY0LWNvbnRlbnQ=' };
(global.fetch as unknown as ReturnType<typeof vi.fn>).mockResolvedValue(
jsonResponse({ item: attachment })
);
const client = new AutotaskClient(FIXTURE_CONFIG);
const result = await client.getAttachmentContent('Tickets', 12345, 555);
expect(result).toBeNull();
});
});