Some checks failed
Deploy to Test Environment / deploy-to-test (push) Failing after 51s
99 lines
2.8 KiB
TypeScript
99 lines
2.8 KiB
TypeScript
// src/services/db/deals.db.test.ts
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { DealsRepository } from './deals.db';
|
|
import type { WatchedItemDeal } from '../../types';
|
|
|
|
// Un-mock the module we are testing to ensure we use the real implementation.
|
|
vi.unmock('./deals.db');
|
|
|
|
// Mock the logger to prevent console output during tests
|
|
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('Deals DB Service', () => {
|
|
// Import the Pool type to use for casting the mock instance.
|
|
let dealsRepo: DealsRepository;
|
|
const mockDb = {
|
|
query: vi.fn()
|
|
};
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
|
|
mockDb.query.mockReset()
|
|
|
|
// Instantiate the repository with the minimal mock db for each test
|
|
dealsRepo = new DealsRepository(mockDb);
|
|
});
|
|
|
|
describe('findBestPricesForWatchedItems', () => {
|
|
it('should execute the correct query and return deals', async () => {
|
|
// Arrange
|
|
const mockDeals: WatchedItemDeal[] = [
|
|
{
|
|
master_item_id: 1,
|
|
item_name: 'Apples',
|
|
best_price_in_cents: 199,
|
|
store_name: 'Good Food',
|
|
flyer_id: 10,
|
|
valid_to: '2025-12-25',
|
|
},
|
|
{
|
|
master_item_id: 2,
|
|
item_name: 'Milk',
|
|
best_price_in_cents: 350,
|
|
store_name: 'Super Grocer',
|
|
flyer_id: 11,
|
|
valid_to: '2025-12-24',
|
|
},
|
|
];
|
|
mockDb.query.mockResolvedValue({ rows: mockDeals });
|
|
|
|
// Act
|
|
const result = await dealsRepo.findBestPricesForWatchedItems('user-123', mockLogger);
|
|
|
|
// Assert
|
|
expect(result).toEqual(mockDeals);
|
|
expect(mockDb.query).toHaveBeenCalledWith(
|
|
expect.stringContaining('FROM flyer_items fi'),
|
|
['user-123'],
|
|
);
|
|
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
{ userId: 'user-123' },
|
|
'Finding best prices for watched items.',
|
|
);
|
|
});
|
|
|
|
it('should return an empty array if no deals are found', async () => {
|
|
mockDb.query.mockResolvedValue({ rows: [] });
|
|
|
|
const result = await dealsRepo.findBestPricesForWatchedItems(
|
|
'user-with-no-deals',
|
|
mockLogger,
|
|
);
|
|
|
|
expect(result).toEqual([]);
|
|
});
|
|
|
|
it('should throw a generic error if the database query fails', async () => {
|
|
const dbError = new Error('DB Connection Error');
|
|
mockDb.query.mockRejectedValue(dbError);
|
|
|
|
await expect(dealsRepo.findBestPricesForWatchedItems('user-1', mockLogger)).rejects.toThrow(
|
|
'Failed to find best prices for watched items.',
|
|
);
|
|
expect(mockLogger.error).toHaveBeenCalledWith(
|
|
{ err: dbError, userId: 'user-1' },
|
|
'Database error in findBestPricesForWatchedItems',
|
|
);
|
|
});
|
|
});
|
|
});
|