super-productivity/e2e/tests/worklog/worklog-basic.spec.ts
Johannes Millan c13e8ee25b test(e2e): fix worklog finish-day navigation race #8033
The worklog 'show worklog after completing tasks' test waited on
waitForSelector('task-list') after Save & go home, but daily-summary
renders its own task-list (planner-day), so that resolved immediately
without waiting for finishDay's deferred router.navigate(['/active/tasks']).
The test then went to /history and the pending redirect clobbered it,
so .week-row never rendered (timeout, screenshot showed Today).

Apply the proven sibling pattern (commit 5c73ec6): gate Save on
waitForURL(TODAY/tasks) before navigating to History, assert the
History URL, and expand via .day-toggle with an aria-expanded check.
2026-06-06 20:09:59 +02:00

112 lines
3.7 KiB
TypeScript

import { expect, test } from '../../fixtures/test.fixture';
/**
* Worklog E2E Tests
*
* Tests the worklog/history feature:
* - Navigate to worklog view
* - View completed tasks
* - Verify time tracking data
*/
test.describe('Worklog', () => {
test('should navigate to worklog view', async ({ page, workViewPage }) => {
await workViewPage.waitForTaskList();
// Navigate to the legacy worklog route
await page.goto('/#/tag/TODAY/worklog');
await page.waitForLoadState('networkidle');
await expect(page).toHaveURL(/worklog/);
await expect(page.locator('history .total-time')).toBeVisible();
});
test('should show worklog after completing tasks', async ({
page,
workViewPage,
taskPage,
testPrefix,
}) => {
await workViewPage.waitForTaskList();
// Create and complete a task
const taskName = `${testPrefix}-Worklog Task`;
await workViewPage.addTask(taskName);
const task = taskPage.getTaskByText(taskName);
await expect(task).toBeVisible({ timeout: 10000 });
await taskPage.markTaskAsDone(task);
// Finish the day to move tasks to worklog
const finishDayBtn = page.locator('.e2e-finish-day');
await finishDayBtn.waitFor({ state: 'visible', timeout: 5000 });
await finishDayBtn.click();
// Wait for daily summary
await page.waitForURL(/daily-summary/);
// Save and go home
const saveBtn = page.locator(
'daily-summary button[mat-flat-button][color="primary"]:last-of-type',
);
await saveBtn.waitFor({ state: 'visible' });
// The finish-day flow archives, flushes, then navigates back to Today
// asynchronously. Wait for that redirect to settle before navigating away;
// otherwise the deferred navigation clobbers the History route mid-render.
await Promise.all([
page.waitForURL(/#\/tag\/TODAY\/tasks/, { timeout: 15000 }),
saveBtn.click(),
]);
await expect(page.locator('task-list').first()).toBeVisible();
// Navigate to full history
await page.goto('/#/tag/TODAY/history');
await expect(page).toHaveURL(/#\/tag\/TODAY\/history/);
// Worklog should show today's completed task
await expect(page.locator('history')).toBeVisible();
const dayToggle = page.locator('history .week-row .day-toggle').first();
await expect(dayToggle).toBeVisible();
await dayToggle.click();
await expect(dayToggle).toHaveAttribute('aria-expanded', 'true');
await expect(
page.locator('.task-summary-table td.title button').filter({ hasText: taskName }),
).toBeVisible();
});
test('should navigate to worklog from side menu', async ({ page, workViewPage }) => {
await workViewPage.waitForTaskList();
// Right-click on Today context to open menu
const contextBtn = page
.locator('magic-side-nav .nav-list > li.nav-item:first-child nav-item')
.first();
await contextBtn.waitFor({ state: 'visible', timeout: 5000 });
await contextBtn.click({ button: 'right' });
const historyBtn = page
.locator('work-context-menu button, .mat-mdc-menu-content button')
.filter({ hasText: 'History' })
.first();
await expect(historyBtn).toBeVisible();
await historyBtn.click();
await page.waitForURL(/history/);
await expect(page).toHaveURL(/history/);
});
test('should display worklog date navigation', async ({ page, workViewPage }) => {
await workViewPage.waitForTaskList();
// Navigate to worklog
await page.goto('/#/tag/TODAY/history');
await page.waitForLoadState('networkidle');
// Verify worklog page loads
await expect(page.locator('.route-wrapper')).toBeVisible();
// Just verify the page loaded without errors
await expect(page).toHaveURL(/history/);
});
});