fix: oprava varování "Data jsou z minulého týdne"
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

This commit is contained in:
2026-09-02 09:43:21 +02:00
parent e5fc358c0a
commit 1af40bd572
2 changed files with 91 additions and 2 deletions
+4 -2
View File
@@ -259,8 +259,10 @@ export async function getRestaurantMenu(restaurant: Restaurant, date?: Date, for
const lastFetchExpired = !existingMenu?.lastUpdate ||
existingMenu.lastUpdate === now || // freshly initialized, never fetched
(now - existingMenu.lastUpdate) > MENU_REFETCH_TTL_MS;
const shouldFetch = forceRefresh ||
(!existingMenu?.food?.length && !existingMenu?.closed && lastFetchExpired);
// Data označená jako "z minulého týdne" se musí zkoušet načíst znovu, jinak by u nich
// varování zůstalo viset celý týden i poté, co podnik nabídku na svém webu aktualizuje.
const needsData = existingMenu?.isStale || (!existingMenu?.food?.length && !existingMenu?.closed);
const shouldFetch = forceRefresh || (needsData && lastFetchExpired);
if (shouldFetch) {
const firstDay = getFirstWorkDayOfWeek(usedDate);
@@ -0,0 +1,87 @@
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');
});
});