From 67aa98da4f5cefd38175701587238ebf4c079075 Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 16 Mar 2026 13:22:24 +0000 Subject: [PATCH] test: stabilize task and role editor flows --- tests/role-editor.spec.ts | 28 +++++++++++++++++++++------- tests/task.spec.ts | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/tests/role-editor.spec.ts b/tests/role-editor.spec.ts index 000c84c..3fc0b38 100644 --- a/tests/role-editor.spec.ts +++ b/tests/role-editor.spec.ts @@ -78,16 +78,30 @@ test.describe('Role Editor', () => { console.log('➕ Creating temp-tester role...'); await page.click('button:has-text("+ Create New Role")'); await page.waitForSelector('input[placeholder="e.g., developer, manager"]', { timeout: 5000 }); - + await page.fill('input[placeholder="e.g., developer, manager"]', 'temp-tester'); await page.fill('input[placeholder="Role description"]', 'Temporary tester role'); + + const createRoleResponsePromise = page.waitForResponse((response) => { + return response.request().method() === 'POST' && /\/roles$/.test(response.url()); + }); + await page.click('button:has-text("Create")'); - - await page.waitForTimeout(1000); - - // Verify role was created - const newRolesCount = await page.locator('.role-editor-page >> text=temp-tester').count(); - expect(newRolesCount).toBeGreaterThan(0); + const createRoleResponse = await createRoleResponsePromise; + const createRoleBody = await createRoleResponse.text(); + console.log('Create role response:', createRoleResponse.status(), createRoleBody); + expect([200, 201, 400]).toContain(createRoleResponse.status()); + if (createRoleResponse.status() === 400) { + expect(createRoleBody).toContain('Role already exists'); + } + + await page.goto(`${BASE_URL}/roles`); + await page.waitForLoadState('networkidle'); + await page.waitForSelector('.role-editor-page', { timeout: 10000 }); + + await expect.poll(async () => { + return await page.locator('.role-editor-page >> text=temp-tester').count(); + }, { timeout: 10000 }).toBeGreaterThan(0); console.log('✅ temp-tester role created'); } diff --git a/tests/task.spec.ts b/tests/task.spec.ts index 466a0d6..b8627d4 100644 --- a/tests/task.spec.ts +++ b/tests/task.spec.ts @@ -125,23 +125,43 @@ test.describe('Task & Comment Flow', () => { await page.waitForLoadState('networkidle'); const taskItemTitle = `Test Task for Comment ${TS}`; - await page.fill('label:has-text("Title") input', taskItemTitle); - await page.fill('label:has-text("Description") textarea', 'Task created for comment testing'); + await page.getByTestId('task-title-input').fill(taskItemTitle); + await page.getByTestId('task-description-input').fill('Task created for comment testing'); - // Select our project - await page.selectOption('label:has-text("Projects") select', { label: projectName }); - // Select type "Task" - await page.selectOption('label:has-text("Type") select', 'task'); + // Select our project and wait for milestones to load + await page.getByTestId('project-select').selectOption({ label: projectName }); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(1000); + + const milestoneSelect = page.getByTestId('milestone-select'); + await expect.poll(async () => { + const options = await milestoneSelect.locator('option').allTextContents(); + return options.includes(milestoneName); + }, { timeout: 10000 }).toBeTruthy(); + const msOptions = await milestoneSelect.locator('option').allTextContents(); + console.log('Milestone options:', msOptions); + await milestoneSelect.selectOption({ label: milestoneName }); + + await page.getByTestId('task-type-select').selectOption('task'); await page.waitForTimeout(300); - await page.click('button.btn-primary:has-text("Create")'); + const createTaskResponsePromise = page.waitForResponse((response) => { + return response.request().method() === 'POST' && /\/tasks(?:\?|$)/.test(response.url()); + }); + + await page.getByTestId('create-task-button').click(); + const createTaskResponse = await createTaskResponsePromise; + expect(createTaskResponse.ok()).toBeTruthy(); + const createdTask = await createTaskResponse.json(); + console.log('Created task item response:', createdTask); + await page.waitForURL(`${BASE_URL}/tasks`, { timeout: 10000 }); await page.waitForLoadState('networkidle'); console.log('✅ Task item created'); // ── Step 6: Open Task → Add Comment ──────────────────────────────── console.log('💬 Opening task to add comment...'); - await page.click(`text=${taskItemTitle}`); + await page.goto(`${BASE_URL}/tasks/${createdTask.id}`); await page.waitForLoadState('networkidle'); await page.waitForTimeout(1000);