96 lines
3.4 KiB
TypeScript
96 lines
3.4 KiB
TypeScript
// src/services/db/price.db.test.ts
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { mockPoolInstance } from '../../tests/setup/tests-setup-unit';
|
|
import { getPool } from './connection.db';
|
|
import { priceRepo } from './price.db';
|
|
import type { PriceHistoryData } from '../../types';
|
|
|
|
// Un-mock the module we are testing to ensure we use the real implementation.
|
|
vi.unmock('./price.db');
|
|
|
|
// Mock dependencies
|
|
vi.mock('./connection.db', () => ({
|
|
getPool: vi.fn(),
|
|
}));
|
|
|
|
vi.mock('../logger.server', () => ({
|
|
logger: {
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
debug: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
import { logger as mockLogger } from '../logger.server';
|
|
|
|
describe('Price DB Service', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
// Make getPool return our mock instance for each test
|
|
vi.mocked(getPool).mockReturnValue(mockPoolInstance as any);
|
|
});
|
|
|
|
describe('getPriceHistory', () => {
|
|
it('should return an empty array if masterItemIds is empty and not query the db', async () => {
|
|
const result = await priceRepo.getPriceHistory([], mockLogger);
|
|
expect(result).toEqual([]);
|
|
expect(mockPoolInstance.query).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('should execute the correct query with default limit and offset', async () => {
|
|
mockPoolInstance.query.mockResolvedValue({ rows: [] });
|
|
await priceRepo.getPriceHistory([1, 2], mockLogger);
|
|
expect(mockPoolInstance.query).toHaveBeenCalledWith(
|
|
expect.stringContaining('LIMIT $2 OFFSET $3'),
|
|
[[1, 2], 1000, 0],
|
|
);
|
|
});
|
|
|
|
it('should execute the correct query with provided limit and offset', async () => {
|
|
mockPoolInstance.query.mockResolvedValue({ rows: [] });
|
|
await priceRepo.getPriceHistory([1, 2], mockLogger, 50, 10);
|
|
expect(mockPoolInstance.query).toHaveBeenCalledWith(
|
|
expect.stringContaining('LIMIT $2 OFFSET $3'),
|
|
[[1, 2], 50, 10],
|
|
);
|
|
});
|
|
|
|
it('should return price history data on success', async () => {
|
|
const mockHistory: PriceHistoryData[] = [
|
|
{ master_item_id: 1, price_in_cents: 199, date: '2024-01-01' },
|
|
{ master_item_id: 1, price_in_cents: 209, date: '2024-01-08' },
|
|
];
|
|
mockPoolInstance.query.mockResolvedValue({ rows: mockHistory });
|
|
|
|
const result = await priceRepo.getPriceHistory([1], mockLogger);
|
|
expect(result).toEqual(mockHistory);
|
|
});
|
|
|
|
it('should log the result count on success', async () => {
|
|
const mockHistory: PriceHistoryData[] = [
|
|
{ master_item_id: 1, price_in_cents: 199, date: '2024-01-01' },
|
|
];
|
|
mockPoolInstance.query.mockResolvedValue({ rows: mockHistory });
|
|
|
|
await priceRepo.getPriceHistory([1], mockLogger, 50, 10);
|
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
{ count: 1, itemIds: 1, limit: 50, offset: 10 },
|
|
'Fetched price history from database.',
|
|
);
|
|
});
|
|
|
|
it('should throw a generic error if the database query fails', async () => {
|
|
const dbError = new Error('DB Connection Error');
|
|
mockPoolInstance.query.mockRejectedValue(dbError);
|
|
|
|
await expect(priceRepo.getPriceHistory([1], mockLogger, 50, 10)).rejects.toThrow(
|
|
'Failed to retrieve price history.',
|
|
);
|
|
expect(mockLogger.error).toHaveBeenCalledWith(
|
|
{ err: dbError, masterItemIds: [1], limit: 50, offset: 10 },
|
|
'Database error in getPriceHistory',
|
|
);
|
|
});
|
|
});
|
|
}); |