99 lines
4.2 KiB
TypeScript
99 lines
4.2 KiB
TypeScript
import {test, expect} from '../../support/fixtures'
|
|
import {TaskFactory} from '../../factories/task'
|
|
import {createProjects} from './prepareProjects'
|
|
import {createTasksWithPriorities, createTasksWithSearch} from '../../support/filterTestHelpers'
|
|
|
|
test.describe('Project View Table', () => {
|
|
test('Should show a table with tasks', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
const tasks = await TaskFactory.create(1, {
|
|
project_id: 1,
|
|
})
|
|
await page.goto('/projects/1/3')
|
|
|
|
await expect(page.locator('.project-table table.table')).toBeVisible()
|
|
await expect(page.locator('.project-table table.table')).toContainText(tasks[0].title)
|
|
})
|
|
|
|
test('Should have working column switches', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
await TaskFactory.create(1, {
|
|
project_id: 1,
|
|
})
|
|
const loadTasksPromise = page.waitForResponse(response =>
|
|
response.url().includes('/projects/1/views/') && response.url().includes('/tasks'),
|
|
)
|
|
await page.goto('/projects/1/3')
|
|
await loadTasksPromise
|
|
|
|
// Click the Columns button to open the column selector
|
|
await page.locator('.project-table .filter-container .button').filter({hasText: 'Columns'}).click()
|
|
|
|
// Click Priority checkbox to enable Priority column (click on the text like Cypress does)
|
|
await page.locator('.project-table .filter-container .card.columns-filter .card-content').getByText('Priority').click()
|
|
|
|
// Wait for Priority checkbox to be checked
|
|
await expect(page.getByRole('checkbox', {name: 'Checkbox Priority'})).toBeChecked()
|
|
|
|
// Click Done checkbox to disable Done column (click on the text like Cypress does)
|
|
await page.locator('.project-table .filter-container .card.columns-filter .card-content').getByText('Done', {exact: true}).click()
|
|
|
|
// Wait for Done checkbox to be unchecked
|
|
await expect(page.getByRole('checkbox', {name: 'Checkbox Done', exact: true})).not.toBeChecked()
|
|
|
|
// Verify Priority column is now visible
|
|
await expect(page.locator('.project-table table.table th').filter({hasText: 'Priority'})).toBeVisible()
|
|
// Verify Done column is now hidden
|
|
await expect(page.locator('.project-table table.table th').filter({hasText: /^Done$/})).not.toBeVisible()
|
|
})
|
|
|
|
test('Should navigate to the task when the title is clicked', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
await TaskFactory.create(5, {
|
|
id: '{increment}',
|
|
project_id: 1,
|
|
})
|
|
const loadTasksPromise = page.waitForResponse(response =>
|
|
response.url().includes('/projects/1/views/') && response.url().includes('/tasks'),
|
|
)
|
|
await page.goto('/projects/1/3')
|
|
await loadTasksPromise
|
|
|
|
await page.locator('.project-table table.table tbody tr').first().locator('a').first().click()
|
|
|
|
await expect(page).toHaveURL(/\/tasks\/\d+/)
|
|
})
|
|
|
|
test('Should respect filter query parameter from URL', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
const {highPriorityTasks, lowPriorityTasks} = await createTasksWithPriorities()
|
|
|
|
await page.goto('/projects/1/3?filter=priority%20>=%204')
|
|
|
|
await expect(page).toHaveURL(/filter=priority/)
|
|
|
|
// Wait for tasks to load and verify high priority tasks are visible
|
|
await expect(page.locator('.project-table table.table')).toContainText(highPriorityTasks[0].title, {timeout: 10000})
|
|
await expect(page.locator('.project-table table.table')).toContainText(highPriorityTasks[1].title)
|
|
|
|
// Verify low priority tasks are not visible
|
|
await expect(page.locator('.project-table table.table')).not.toContainText(lowPriorityTasks[0].title)
|
|
await expect(page.locator('.project-table table.table')).not.toContainText(lowPriorityTasks[1].title)
|
|
})
|
|
|
|
test('Should respect search query parameter from URL', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
const {searchableTask} = await createTasksWithSearch()
|
|
|
|
await page.goto('/projects/1/3?s=meeting')
|
|
|
|
await expect(page).toHaveURL(/s=meeting/)
|
|
|
|
// Wait for search results to load and verify searchable task is visible
|
|
await expect(page.locator('.project-table table.table')).toContainText(searchableTask.title, {timeout: 10000})
|
|
|
|
// Verify only one task row is shown (the search result)
|
|
await expect(page.locator('.project-table table.table tbody tr')).toHaveCount(1)
|
|
})
|
|
})
|