feat: push upozornění na doručení objednávky Bolt Food
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
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.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
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 });
|
||||
});
|
||||
Reference in New Issue
Block a user