Compare commits
6 Commits
1e13a1d02b
...
feat/tests
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ed781d0cf | |||
| 70ed59ab9d | |||
| 6b2deff215 | |||
| ace4130171 | |||
| 9383cd7d4c | |||
| db1fe473cd |
@@ -24,7 +24,7 @@ jobs:
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- run: npm install -g yarn
|
||||
- run: corepack enable
|
||||
|
||||
- run: cd types && yarn install --frozen-lockfile && yarn openapi-ts
|
||||
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- run: npm install -g yarn
|
||||
- run: corepack enable
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- run: npm install -g yarn
|
||||
- run: corepack enable
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- run: npm install -g yarn
|
||||
- run: corepack enable
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
@@ -189,7 +189,7 @@ jobs:
|
||||
with:
|
||||
node-version: "22"
|
||||
|
||||
- run: npm install -g yarn
|
||||
- run: corepack enable
|
||||
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
|
||||
@@ -11,11 +11,14 @@ export async function loginViaApi(page: Page, login: string): Promise<void> {
|
||||
await page.evaluate((t) => localStorage.setItem('token', t), token);
|
||||
}
|
||||
|
||||
/** Vyčistí stav pizza dne pro zadaný dayIndex (0=pondělí…4=pátek) přes dev API. */
|
||||
export async function clearPizzaDay(request: APIRequestContext): Promise<void> {
|
||||
const today = new Date('2025-01-10'); // MOCK_DATA pins to Friday = dayIndex 4
|
||||
/** Vyčistí stav dne pro zadaný dayIndex (0=pondělí…4=pátek) přes dev API.
|
||||
* /api/dev/* vyžaduje JWT – nejdřív získáme token přes /api/login.
|
||||
*/
|
||||
export async function clearDay(request: APIRequestContext, dayIndex = 4): Promise<void> {
|
||||
const loginResp = await request.post('/api/login', { data: {} });
|
||||
const token = await loginResp.json() as string;
|
||||
await request.post('/api/dev/clear', {
|
||||
headers: { 'Content-Type': 'application/json', 'remote-user': 'e2e-user' },
|
||||
data: { dayIndex: 4 },
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
data: { dayIndex },
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { clearPizzaDay } from './helpers';
|
||||
import { clearDay } from './helpers';
|
||||
|
||||
test.beforeEach(async ({ page, request }) => {
|
||||
// Vyčistíme volby dne, aby testy neovlivnily navzájem
|
||||
await request.post('/api/dev/clear', {
|
||||
data: { dayIndex: 4 },
|
||||
});
|
||||
await clearDay(request);
|
||||
await page.goto('/');
|
||||
await page.waitForLoadState('networkidle');
|
||||
// Počkáme, až se zobrazí volba stravování
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
import { clearDay } from './helpers';
|
||||
|
||||
// Pizza day testy musí běžet sekvenčně (sdílejí stav mock dne)
|
||||
test.describe.serial('pizza day životní cyklus', () => {
|
||||
|
||||
test.beforeEach(async ({ request }) => {
|
||||
// Vyčistíme data mock dne před každým testem
|
||||
await request.post('/api/dev/clear', { data: { dayIndex: 4 } });
|
||||
await clearDay(request);
|
||||
});
|
||||
|
||||
test('zobrazí sekci Pizza Day bez aktivního dne', async ({ page }) => {
|
||||
@@ -20,17 +21,26 @@ test.describe.serial('pizza day životní cyklus', () => {
|
||||
});
|
||||
|
||||
test('vytvoří, uzamkne a dokončí pizza day', async ({ page }) => {
|
||||
// Tento test má více kroků a server při MOCK_DATA=true záměrně zpožďuje scraping pizz o 3s
|
||||
test.setTimeout(60_000);
|
||||
await page.goto('/');
|
||||
await page.waitForLoadState('networkidle');
|
||||
// Sekce pizza-section se zobrazí jen pokud má uživatel zvolenou možnost "Pizza day"
|
||||
await page.locator('select').selectOption({ label: 'Pizza day' });
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
// Přijmeme všechny window.confirm() dialogy v celém testu (vytvoření i doručení pizza dne)
|
||||
page.on('dialog', dialog => dialog.accept());
|
||||
|
||||
// --- CREATED ---
|
||||
const createBtn = page.locator('.pizza-section button', { hasText: 'Založit Pizza day' });
|
||||
await expect(createBtn).toBeVisible({ timeout: 10_000 });
|
||||
// Čekáme na odpověď API před reloadem – jinak by reload přerušil probíhající request
|
||||
const createResponse = page.waitForResponse(resp => resp.url().includes('/api/pizza/create'));
|
||||
// Server s MOCK_DATA=true záměrně zpožďuje stahování pizz o 3s, proto velkorysý timeout
|
||||
const createResponse = page.waitForResponse(
|
||||
resp => resp.url().includes('/api/pizzaDay/create'),
|
||||
{ timeout: 15_000 },
|
||||
);
|
||||
await createBtn.click();
|
||||
await createResponse;
|
||||
await page.reload();
|
||||
@@ -39,7 +49,7 @@ test.describe.serial('pizza day životní cyklus', () => {
|
||||
|
||||
// Přidáme pizzu přes API (obejde komplex SelectSearch)
|
||||
const token = await page.evaluate(() => localStorage.getItem('token'));
|
||||
const addResp = await page.request.post('/api/pizza/add', {
|
||||
const addResp = await page.request.post('/api/pizzaDay/add', {
|
||||
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
|
||||
data: { pizzaIndex: 0, pizzaSizeIndex: 0 },
|
||||
});
|
||||
@@ -66,8 +76,6 @@ test.describe.serial('pizza day životní cyklus', () => {
|
||||
// --- DELIVERED ---
|
||||
const deliverBtn = page.locator('.pizza-section button', { hasText: 'Doručeno' });
|
||||
await expect(deliverBtn).toBeVisible({ timeout: 5_000 });
|
||||
// window.confirm dialog − Playwright automaticky potvrdí
|
||||
page.on('dialog', dialog => dialog.accept());
|
||||
await deliverBtn.click();
|
||||
await page.waitForLoadState('networkidle');
|
||||
await expect(page.locator('.pizza-section')).toContainText('doručeny', { timeout: 5_000 });
|
||||
|
||||
@@ -141,8 +141,9 @@ router.post("/clear", async (req: Request<{}, any, any>, res, next) => {
|
||||
const dateKey = formatDate(date);
|
||||
const data = await storage.getData<any>(dateKey);
|
||||
|
||||
// Vymažeme všechny volby
|
||||
// Vymažeme všechny volby i aktivní pizza day
|
||||
data.choices = {};
|
||||
delete data.pizzaDay;
|
||||
|
||||
await storage.setData(dateKey, data);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user