Files
Luncher/server/src/tests/service.staleMenu.test.ts
T
mates 1af40bd572
CI / Generate TypeScript types (push) Successful in 17s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 32s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m47s
CI / Build and push Docker image (push) Successful in 1m9s
CI / Notify (push) Successful in 2s
fix: oprava varování "Data jsou z minulého týdne"
2026-09-02 09:43:21 +02:00

88 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const mockStorageData = new Map<string, any>();
jest.mock('../storage', () => ({
__esModule: true,
default: () => ({
hasData: async (key: string) => mockStorageData.has(key),
getData: async <T>(key: string) => mockStorageData.get(key) as T,
setData: async <T>(key: string, val: T) => void mockStorageData.set(key, val),
}),
storageReady: Promise.resolve(),
}));
const mockGetMenuTechTower = jest.fn();
jest.mock('../restaurants', () => ({
...jest.requireActual('../restaurants'),
getMenuTechTower: (...args: any[]) => mockGetMenuTechTower(...args),
}));
import { getMenuKey, getRestaurantMenu } from '../service';
// Středa 2025-01-08 (týden 2025-02)
const STREDA = new Date('2025-01-08T10:00:00');
const HODINA = 60 * 60 * 1000;
/** Menu jednoho dne se všemi náležitostmi, aby nevznikala jiná varování. */
const denniMenu = (nazev: string) => [
{ amount: '-', name: `Polévka ${nazev}`, price: '30 Kč', isSoup: true },
{ amount: '-', name: nazev, price: '150 Kč', isSoup: false },
];
/** Naplní storage týdenním menu TechTower s předaným příznakem zastaralosti. */
const seedWeekMenu = (isStale: boolean, lastUpdate: number) => {
const week = [0, 1, 2, 3, 4].map(i => ({
TECHTOWER: {
lastUpdate,
closed: false,
isStale,
food: denniMenu(`Jídlo z minulého týdne ${i}`),
},
}));
mockStorageData.set(getMenuKey(STREDA), week);
};
describe('getRestaurantMenu – obnovení dat z minulého týdne', () => {
beforeAll(() => {
jest.useFakeTimers();
jest.setSystemTime(STREDA);
});
afterAll(() => {
jest.useRealTimers();
});
beforeEach(() => {
mockStorageData.clear();
mockGetMenuTechTower.mockReset();
});
test('zastaralá data se znovu načtou a varování zmizí', async () => {
seedWeekMenu(true, Date.now() - 2 * HODINA);
mockGetMenuTechTower.mockResolvedValue([0, 1, 2, 3, 4].map(i => denniMenu(`Aktuální jídlo ${i}`)));
const menu = await getRestaurantMenu('TECHTOWER', STREDA);
expect(mockGetMenuTechTower).toHaveBeenCalledTimes(1);
expect(menu.isStale).toBe(false);
expect(menu.food?.[1].name).toBe('Aktuální jídlo 2');
expect(menu.warnings).not.toContain('Data jsou z minulého týdne');
});
test('aktuální data se znovu nenačítají', async () => {
seedWeekMenu(false, Date.now() - 2 * HODINA);
const menu = await getRestaurantMenu('TECHTOWER', STREDA);
expect(mockGetMenuTechTower).not.toHaveBeenCalled();
expect(menu.warnings).toEqual([]);
});
test('zastaralá data se neobnovují častěji než jednou za hodinu', async () => {
seedWeekMenu(true, Date.now() - 5 * 60 * 1000);
const menu = await getRestaurantMenu('TECHTOWER', STREDA);
expect(mockGetMenuTechTower).not.toHaveBeenCalled();
expect(menu.warnings).toContain('Data jsou z minulého týdne');
});
});