From c3c41db915738d1fbf416ee814ea7e8f56287058 Mon Sep 17 00:00:00 2001 From: Frederic Cabassut Date: Tue, 10 Mar 2026 16:12:42 +0100 Subject: [PATCH] fix: isolate preference e2e tests with API reset before each test Each preference test now resets to default preferences via API at the start, ensuring parallel tests don't pollute each other's state. Also await PUT response before reload in persist test to prevent race condition. --- tests/e2e/settings.spec.ts | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/tests/e2e/settings.spec.ts b/tests/e2e/settings.spec.ts index bc3117d..49b2937 100644 --- a/tests/e2e/settings.spec.ts +++ b/tests/e2e/settings.spec.ts @@ -1,4 +1,17 @@ import { test, expect } from './helpers/fixtures.js'; +import type { Page } from '@playwright/test'; + +/** Reset all preferences to defaults via API so each test starts clean */ +async function resetPreferences(page: Page) { + await page.request.put('/api/preferences', { + data: { + defaultNoteMode: 'richtext', + defaultNoteColor: 'default', + hideFooter: 'false', + sidebarDefaultState: 'open' + } + }); +} test.describe('Settings — Preferences', () => { test('Scenario: Preferences tab is visible in settings nav', async ({ @@ -14,6 +27,8 @@ test.describe('Settings — Preferences', () => { test('Scenario: Default note mode change applies to new notes', async ({ authenticatedPage: page }) => { + await resetPreferences(page); + // Given the user sets default note mode to Markdown await page.goto('/settings/preferences'); const putResponse = page.waitForResponse((res) => res.url().includes('/api/preferences') && res.request().method() === 'PUT'); @@ -26,18 +41,13 @@ test.describe('Settings — Preferences', () => { // Then the note editor opens in markdown mode (textarea visible) await expect(page.getByTestId('note-content-input')).toBeVisible(); - - // Cleanup: reset to richtext so parallel tests aren't affected - await page.getByTestId('close-editor-btn').click(); - await page.goto('/settings/preferences'); - const resetResponse = page.waitForResponse((res) => res.url().includes('/api/preferences') && res.request().method() === 'PUT'); - await page.getByTestId('pref-mode-richtext').click(); - await resetResponse; }); test('Scenario: Footer toggle hides and shows footer', async ({ authenticatedPage: page }) => { + await resetPreferences(page); + // Given the footer is visible await page.goto('/'); await expect(page.getByTestId('app-footer')).toBeVisible(); @@ -62,9 +72,13 @@ test.describe('Settings — Preferences', () => { test('Scenario: Preferences persist across page reload', async ({ authenticatedPage: page }) => { + await resetPreferences(page); + // Given the user changes default note mode to Markdown await page.goto('/settings/preferences'); + const putResponse = page.waitForResponse((res) => res.url().includes('/api/preferences') && res.request().method() === 'PUT'); await page.getByTestId('pref-mode-markdown').click(); + await putResponse; // When the page is reloaded await page.reload(); @@ -72,11 +86,6 @@ test.describe('Settings — Preferences', () => { // Then the Markdown button is still selected (has primary styling) const mdBtn = page.getByTestId('pref-mode-markdown'); await expect(mdBtn).toHaveClass(/font-medium/); - - // Cleanup: reset to richtext so parallel tests aren't affected - const resetResponse = page.waitForResponse((res) => res.url().includes('/api/preferences') && res.request().method() === 'PUT'); - await page.getByTestId('pref-mode-richtext').click(); - await resetResponse; }); });