import { describe, it, expect, vi, beforeEach } from 'vitest';
import { getVulnDetailsBatch } from '../src/api';
import axios from 'axios';
vi.mock('axios');
const mockedAxios = axios as any;
describe('API', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('getVulnDetailsBatch should fetch multiple IDs', async () => {
const ids = ['GHSA-1', 'CVE-2'];
mockedAxios.get.mockImplementation((url: string) => {
if (url.includes('GHSA-1')) {
return Promise.resolve({ data: { id: 'GHSA-1', summary: 'Vuln 1' } });
}
if (url.includes('CVE-2')) {
return Promise.resolve({ data: { id: 'CVE-2', summary: 'Vuln 2' } });
}
return Promise.reject(new Error('Not found'));
});
const results = await getVulnDetailsBatch(ids);
expect(results).toHaveLength(2);
expect(results[0]).toEqual({ id: 'GHSA-1', summary: 'Vuln 1' });
expect(results[1]).toEqual({ id: 'CVE-2', summary: 'Vuln 2' });
expect(mockedAxios.get).toHaveBeenCalledTimes(2);
});
it('getVulnDetailsBatch should handle some missing IDs', async () => {
const ids = ['GHSA-1', 'MISSING'];
mockedAxios.get.mockImplementation((url: string) => {
if (url.includes('GHSA-1')) {
return Promise.resolve({ data: { id: 'GHSA-1', summary: 'Vuln 1' } });
}
if (url.includes('MISSING')) {
const err: any = new Error('Not Found');
err.response = { status: 404 };
err.isAxiosError = true;
return Promise.reject(err);
}
return Promise.reject(new Error('Unknown'));
});
// Mock isAxiosError since we are mocking the module
mockedAxios.isAxiosError = (payload: any) => payload?.isAxiosError === true;
const results = await getVulnDetailsBatch(ids);
expect(results).toHaveLength(2);
expect(results[0]).toEqual({ id: 'GHSA-1', summary: 'Vuln 1' });
expect(results[1]).toBeNull();
});
});