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
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:
@@ -259,8 +259,10 @@ export async function getRestaurantMenu(restaurant: Restaurant, date?: Date, for
|
|||||||
const lastFetchExpired = !existingMenu?.lastUpdate ||
|
const lastFetchExpired = !existingMenu?.lastUpdate ||
|
||||||
existingMenu.lastUpdate === now || // freshly initialized, never fetched
|
existingMenu.lastUpdate === now || // freshly initialized, never fetched
|
||||||
(now - existingMenu.lastUpdate) > MENU_REFETCH_TTL_MS;
|
(now - existingMenu.lastUpdate) > MENU_REFETCH_TTL_MS;
|
||||||
const shouldFetch = forceRefresh ||
|
// Data označená jako "z minulého týdne" se musí zkoušet načíst znovu, jinak by u nich
|
||||||
(!existingMenu?.food?.length && !existingMenu?.closed && lastFetchExpired);
|
// 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) {
|
if (shouldFetch) {
|
||||||
const firstDay = getFirstWorkDayOfWeek(usedDate);
|
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');
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user