CI / Generate TypeScript types (push) Successful in 12s
CI / Server unit tests (push) Successful in 22s
CI / Build server (push) Successful in 28s
CI / Build client (push) Successful in 41s
CI / Playwright E2E tests (push) Successful in 1m48s
CI / Build and push Docker image (push) Successful in 53s
CI / Notify (push) Successful in 2s
Nové zaškrtávátko v Nastavení → Notifikace pod výběrem času připomínky. Když skupinová objednávka sledovaná přes Bolt Food přejde do stavu delivered/finished, dostanou push členové skupiny, kteří si to zapnuli. Zakladatel skupiny notifikaci nedostává — ten je informován aplikací Bolt. Push subscription byla dosud svázaná s časem připomínky (subscribe endpoint bez reminderTime vracel 400), takže by nový přepínač samostatně nefungoval. Čas připomínky je nově v registru volitelný a scheduler připomínek záznamy bez času přeskakuje. Service worker nemá natvrdo tag a akci "Mám vlastní/neobědvám" — obojí se řídí payloadem, aby je doručovací notifikace nedědila.
78 lines
3.4 KiB
TypeScript
78 lines
3.4 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { loginViaApi } from './helpers';
|
|
|
|
const BOLT_LABEL = 'Upozornění na doručení objednávky (Bolt Food)';
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await loginViaApi(page, 'e2e-user');
|
|
await page.reload();
|
|
await page.waitForLoadState('networkidle');
|
|
});
|
|
|
|
async function openSettings(page: import('@playwright/test').Page) {
|
|
await page.locator('#basic-nav-dropdown').click();
|
|
await page.locator('text=Nastavení').click();
|
|
await expect(page.locator('.modal-title')).toContainText('Nastavení', { timeout: 5_000 });
|
|
}
|
|
|
|
test('Přepínač doručení Bolt je pod výběrem času připomínky', async ({ page }) => {
|
|
await openSettings(page);
|
|
|
|
const reminderGroup = page.locator('.modal-body .mb-3').filter({ hasText: 'Připomínka výběru oběda' });
|
|
const boltGroup = page.locator('.modal-body .mb-3').filter({ hasText: BOLT_LABEL });
|
|
await expect(reminderGroup).toBeVisible();
|
|
await expect(boltGroup).toBeVisible();
|
|
|
|
// Přepínač musí v DOM následovat až za skupinou s časem připomínky
|
|
const order = await page.evaluate((label) => {
|
|
const groups = Array.from(document.querySelectorAll('.modal-body .mb-3'));
|
|
return {
|
|
reminder: groups.findIndex(g => g.textContent?.includes('Připomínka výběru oběda')),
|
|
bolt: groups.findIndex(g => g.textContent?.includes(label)),
|
|
};
|
|
}, BOLT_LABEL);
|
|
expect(order.reminder).toBeGreaterThanOrEqual(0);
|
|
expect(order.bolt).toBe(order.reminder + 1);
|
|
|
|
// Výchozí stav je vypnuto
|
|
await expect(page.locator('#boltDeliveredCheckbox')).not.toBeChecked();
|
|
});
|
|
|
|
test('Zapnutí přepínače se uloží na server a přežije znovuotevření', async ({ page }) => {
|
|
await openSettings(page);
|
|
await page.locator('#boltDeliveredCheckbox').check();
|
|
await page.locator('.modal-footer button', { hasText: 'Uložit' }).click();
|
|
await expect(page.locator('.modal')).not.toBeVisible({ timeout: 5_000 });
|
|
|
|
// Server má nastavení uložené
|
|
const token = await page.evaluate(() => localStorage.getItem('token'));
|
|
const resp = await page.request.get('/api/notifications/settings', {
|
|
headers: { Authorization: `Bearer ${token}` },
|
|
});
|
|
expect(await resp.json()).toMatchObject({ boltDeliveredPush: true });
|
|
|
|
// Po znovunačtení stránky je přepínač stále zapnutý
|
|
await page.reload();
|
|
await page.waitForLoadState('networkidle');
|
|
await openSettings(page);
|
|
await expect(page.locator('#boltDeliveredCheckbox')).toBeChecked();
|
|
});
|
|
|
|
test('Vypnutí přepínače se uloží zpět', async ({ page }) => {
|
|
await openSettings(page);
|
|
await page.locator('#boltDeliveredCheckbox').check();
|
|
await page.locator('.modal-footer button', { hasText: 'Uložit' }).click();
|
|
await expect(page.locator('.modal')).not.toBeVisible({ timeout: 5_000 });
|
|
|
|
await openSettings(page);
|
|
await page.locator('#boltDeliveredCheckbox').uncheck();
|
|
await page.locator('.modal-footer button', { hasText: 'Uložit' }).click();
|
|
await expect(page.locator('.modal')).not.toBeVisible({ timeout: 5_000 });
|
|
|
|
const token = await page.evaluate(() => localStorage.getItem('token'));
|
|
const resp = await page.request.get('/api/notifications/settings', {
|
|
headers: { Authorization: `Bearer ${token}` },
|
|
});
|
|
expect(await resp.json()).toMatchObject({ boltDeliveredPush: false });
|
|
});
|