IcostPro/__tests__/api/suppliers.test.ts
2026-02-12 21:40:57 +01:00

87 lines
2.4 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { GET, POST } from '@/app/api/suppliers/route';
const mockToArray = vi.fn();
const mockSort = vi.fn(() => ({ toArray: mockToArray }));
const mockFind = vi.fn(() => ({ sort: mockSort }));
const mockInsertOne = vi.fn();
const mockCollection = vi.fn(() => ({
find: mockFind,
insertOne: mockInsertOne,
}));
const mockDb = { collection: mockCollection };
vi.mock('@/lib/mongodb', () => ({
getDb: vi.fn(() => Promise.resolve(mockDb)),
}));
describe('GET /api/suppliers', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('returns sorted suppliers', async () => {
const suppliers = [
{ _id: 'sup1', name: 'Acme Foods' },
{ _id: 'sup2', name: 'Best Produce' },
];
mockToArray.mockResolvedValue(suppliers);
const response = await GET();
const data = await response.json();
expect(mockCollection).toHaveBeenCalledWith('suppliers');
expect(mockSort).toHaveBeenCalledWith({ name: 1 });
expect(data).toEqual(suppliers);
});
});
describe('POST /api/suppliers', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('creates supplier and returns 201', async () => {
mockInsertOne.mockResolvedValue({ insertedId: 'new-sup' });
const request = new Request('http://localhost/api/suppliers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Fresh Farms' }),
});
const response = await POST(request);
const data = await response.json();
expect(response.status).toBe(201);
expect(data.name).toBe('Fresh Farms');
expect(data._id).toBe('new-sup');
expect(data.createdAt).toBeDefined();
});
it('returns 400 when name is missing', async () => {
const request = new Request('http://localhost/api/suppliers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});
const response = await POST(request);
const data = await response.json();
expect(response.status).toBe(400);
expect(data.error).toBe('Name is required');
});
it('returns 400 when name is empty string', async () => {
const request = new Request('http://localhost/api/suppliers', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: '' }),
});
const response = await POST(request);
expect(response.status).toBe(400);
});
});