vikunja/frontend/tests/e2e/project/parent-project-clear.spec.ts

107 lines
4.4 KiB
TypeScript

import {test, expect} from '../../support/fixtures'
import {ProjectFactory} from '../../factories/project'
import {createDefaultViews} from './prepareProjects'
test.describe('Parent Project Clear', () => {
test('Should clear the parent project field and persist the change', async ({authenticatedPage: page}) => {
// Create a parent project
const parentProjects = await ProjectFactory.create(1, {
id: 100,
title: 'Parent Project',
})
await createDefaultViews(parentProjects[0].id, 100)
// Create a child project with the parent
const childProjects = await ProjectFactory.create(1, {
id: 101,
title: 'Child Project',
parent_project_id: parentProjects[0].id,
}, false)
const childViews = await createDefaultViews(childProjects[0].id, 104)
// Navigate to the child project first
await page.goto(`/projects/${childProjects[0].id}/${childViews[0].id}`)
await page.waitForLoadState('networkidle')
await expect(page.locator('.project-title')).toContainText('Child Project')
// Open project settings dropdown and click Edit
await page.locator('.project-title-dropdown .project-title-button').click()
await page.getByRole('link', {name: /^edit$/i}).click()
await page.waitForLoadState('networkidle')
// Verify the parent project is shown in the modal
const parentProjectInput = page.locator('.multiselect input')
await expect(parentProjectInput).toHaveValue('Parent Project')
// Click the clear button (X) on the parent project field
await page.locator('.multiselect .removal-button').click()
// Verify the field is cleared (should show empty/placeholder)
await expect(parentProjectInput).toHaveValue('')
// Save the project
await page.locator('footer.card-footer .button').filter({hasText: /^Save$/}).click()
await expect(page.locator('.global-notification')).toContainText('Success')
// Verify the project is no longer nested in the sidebar
// Child Project should now be a top-level item, not inside Parent Project's subtree
const sidebar = page.locator('.menu-container .menu-list')
// The Child Project link should be a direct child of the sidebar, not nested under Parent Project
await expect(sidebar.getByRole('link', {name: 'Child Project'})).toBeVisible()
// Verify Child Project is NOT inside the Parent Project's nested list
const parentProjectItem = sidebar.getByRole('listitem').filter({has: page.getByRole('link', {name: 'Parent Project'})})
await expect(parentProjectItem.getByRole('link', {name: 'Child Project'})).not.toBeVisible()
// Open edit again to verify parent is still cleared
await page.locator('.project-title-dropdown .project-title-button').click()
await page.getByRole('link', {name: /^edit$/i}).click()
await page.waitForLoadState('networkidle')
// Verify the parent project field is still empty
await expect(parentProjectInput).toHaveValue('')
})
test('Should not jump back after selecting and deleting the parent project text', async ({authenticatedPage: page}) => {
// Create a parent project
const parentProjects = await ProjectFactory.create(1, {
id: 200,
title: 'Test Parent',
})
await createDefaultViews(parentProjects[0].id, 200)
// Create a child project with the parent
const childProjects = await ProjectFactory.create(1, {
id: 201,
title: 'Test Child',
parent_project_id: parentProjects[0].id,
}, false)
const childViews = await createDefaultViews(childProjects[0].id, 204)
// Navigate to the child project first
await page.goto(`/projects/${childProjects[0].id}/${childViews[0].id}`)
await page.waitForLoadState('networkidle')
await expect(page.locator('.project-title')).toContainText('Test Child')
// Open project settings dropdown and click Edit
await page.locator('.project-title-dropdown .project-title-button').click()
await page.getByRole('link', {name: /^edit$/i}).click()
await page.waitForLoadState('networkidle')
const parentProjectInput = page.locator('.multiselect input')
// Verify the parent project is shown
await expect(parentProjectInput).toHaveValue('Test Parent')
// Select all text and delete it (simulating user manually clearing the field)
await parentProjectInput.click()
await parentProjectInput.selectText()
await page.keyboard.press('Backspace')
// Wait a moment to ensure the value doesn't jump back
await page.waitForTimeout(500)
// Verify the field stays empty (this was the bug - it would jump back)
await expect(parentProjectInput).toHaveValue('')
})
})