import { beforeEach, describe, expect, it, vi } from 'vitest'; vi.mock('../../lib/sql.js', () => ({ sql: vi.fn() })); vi.mock('../../lib/pricing/price-history.js', () => ({ getPriceHistoryPoints: vi.fn(), })); import { sql } from '../../lib/sql.js'; import { getPriceHistoryPoints } from '../../lib/pricing/price-history.js'; import handler from '../../pages/api/cards/[id]/price-history.js'; function createRes() { const res = { statusCode: 200, body: null, status(code) { res.statusCode = code; return res; }, json(data) { res.body = data; return res; }, }; return res; } describe('GET /api/cards/[id]/price-history', () => { beforeEach(() => { vi.clearAllMocks(); sql.mockResolvedValue({ rows: [{ id: 42 }] }); getPriceHistoryPoints.mockResolvedValue([ { date: '2026-01-01', amount: 1.25, source: 'scryfall', priceType: 'market', currency: 'USD' }, ]); }); it('returns 400 for invalid card id', async () => { const req = { method: 'GET', query: { id: 'nope' } }; const res = createRes(); await handler(req, res); expect(res.statusCode).toBe(400); expect(sql).not.toHaveBeenCalled(); }); it('returns 400 when days is out of range', async () => { const req = { method: 'GET', query: { id: '42', days: '999' } }; const res = createRes(); await handler(req, res); expect(res.statusCode).toBe(400); expect(getPriceHistoryPoints).not.toHaveBeenCalled(); }); it('returns 404 when card does not exist', async () => { sql.mockResolvedValue({ rows: [] }); const req = { method: 'GET', query: { id: '42', days: '30' } }; const res = createRes(); await handler(req, res); expect(res.statusCode).toBe(404); }); it('returns points for a valid request', async () => { const req = { method: 'GET', query: { id: '42', days: '30' } }; const res = createRes(); await handler(req, res); expect(res.statusCode).toBe(200); expect(getPriceHistoryPoints).toHaveBeenCalledWith(42, { days: 30 }); expect(res.body.points).toHaveLength(1); expect(res.body.points[0].amount).toBe(1.25); }); });