From c5bce07a25e8e4ba18c13aeb0b708ba4b3732b91 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 3 Apr 2026 19:55:16 +0200 Subject: [PATCH] test(e2e): add test for read-only checkbox on overview page Verifies that tasks from read-only shared projects have disabled checkboxes on the overview page, while tasks from owned projects remain interactive. Refs #2399 --- .../task/read-only-checkbox-overview.spec.ts | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 frontend/tests/e2e/task/read-only-checkbox-overview.spec.ts diff --git a/frontend/tests/e2e/task/read-only-checkbox-overview.spec.ts b/frontend/tests/e2e/task/read-only-checkbox-overview.spec.ts new file mode 100644 index 000000000..afff3cd16 --- /dev/null +++ b/frontend/tests/e2e/task/read-only-checkbox-overview.spec.ts @@ -0,0 +1,86 @@ +import {test, expect} from '../../support/fixtures' +import {ProjectFactory} from '../../factories/project' +import {TaskFactory} from '../../factories/task' +import {UserProjectFactory} from '../../factories/users_project' +import {UserFactory} from '../../factories/user' +import {BucketFactory} from '../../factories/bucket' +import {createDefaultViews} from '../project/prepareProjects' + +test.describe('Read-only checkbox on Overview', () => { + test('Should disable checkboxes for tasks from read-only shared projects', async ({authenticatedPage: page, apiContext, currentUser}) => { + // Create a second user who will own the shared project + const [otherUser] = await UserFactory.create(1, { + id: 2, + }, false) + + // Create the own project (owned by test user, id=1) + const [ownProject] = await ProjectFactory.create(1, { + id: 1, + title: 'Own Project', + owner_id: currentUser.id, + }) + const ownViews = await createDefaultViews(ownProject.id, 1) + await BucketFactory.create(1, { + project_view_id: ownViews[3].id, + }) + + // Create the shared project (owned by user 2) + const [sharedProject] = await ProjectFactory.create(1, { + id: 2, + title: 'Shared Read-Only Project', + owner_id: otherUser.id, + }, false) + const sharedViews = await createDefaultViews(sharedProject.id, 5, false) + await BucketFactory.create(1, { + id: 2, + project_view_id: sharedViews[3].id, + }, false) + + // Share the project read-only (permission=0) with the test user + await UserProjectFactory.create(1, { + id: 1, + project_id: sharedProject.id, + user_id: currentUser.id, + permission: 0, + }) + + const now = new Date() + const soon = new Date(now.getTime() + 24 * 60 * 60 * 1000) // tomorrow + + // Create a task in the own project + await TaskFactory.create(1, { + id: 1, + title: 'Own Task', + project_id: ownProject.id, + created_by_id: currentUser.id, + due_date: soon.toISOString(), + }) + + // Create a task in the shared read-only project + await TaskFactory.create(1, { + id: 2, + title: 'Read Only Task', + project_id: sharedProject.id, + created_by_id: otherUser.id, + due_date: soon.toISOString(), + }, false) + + await page.goto('/') + await page.waitForLoadState('networkidle') + + // Wait for both tasks to appear on the overview + const ownTaskRow = page.locator('.single-task', {hasText: 'Own Task'}) + const readOnlyTaskRow = page.locator('.single-task', {hasText: 'Read Only Task'}) + + await expect(ownTaskRow).toBeVisible({timeout: 10000}) + await expect(readOnlyTaskRow).toBeVisible({timeout: 10000}) + + // The checkbox for the own task should be enabled + const ownCheckbox = ownTaskRow.locator('input[type="checkbox"]') + await expect(ownCheckbox).toBeEnabled() + + // The checkbox for the read-only task should be disabled + const readOnlyCheckbox = readOnlyTaskRow.locator('input[type="checkbox"]') + await expect(readOnlyCheckbox).toBeDisabled() + }) +})