168 lines
5.5 KiB
TypeScript
168 lines
5.5 KiB
TypeScript
import {test, expect} from '../../support/fixtures'
|
|
import {UserProjectFactory} from '../../factories/users_project'
|
|
import {TaskFactory} from '../../factories/task'
|
|
import {TaskRelationFactory} from '../../factories/task_relation'
|
|
import {UserFactory} from '../../factories/user'
|
|
import {ProjectFactory} from '../../factories/project'
|
|
import {createProjects} from './prepareProjects'
|
|
import {BucketFactory} from '../../factories/bucket'
|
|
|
|
test.describe('Project View List', () => {
|
|
test('Should be an empty project', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
await page.goto('/projects/1')
|
|
await expect(page).toHaveURL(/\/projects\/1\/1/)
|
|
await expect(page.locator('.project-title')).toContainText('First Project')
|
|
await expect(page.locator('.project-title-dropdown')).toBeVisible()
|
|
await expect(page.locator('.has-text-centered.has-text-grey.is-italic').filter({hasText: 'This project is currently empty.'})).toBeVisible()
|
|
})
|
|
|
|
test('Should create a new task', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
await BucketFactory.create(2, {
|
|
project_view_id: 4,
|
|
})
|
|
|
|
const newTaskTitle = 'New task'
|
|
|
|
await page.goto('/projects/1/1')
|
|
await page.locator('.task-add textarea').fill(newTaskTitle)
|
|
await page.locator('.task-add textarea').press('Enter')
|
|
await expect(page.locator('.tasks')).toContainText(newTaskTitle)
|
|
})
|
|
|
|
test('Should navigate to the task when the title is clicked', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
const tasks = await TaskFactory.create(5, {
|
|
id: '{increment}',
|
|
project_id: 1,
|
|
})
|
|
await page.goto('/projects/1/1')
|
|
|
|
await page.locator('.tasks .task .tasktext').filter({hasText: tasks[0].title}).first().click()
|
|
|
|
await expect(page).toHaveURL(new RegExp(`/tasks/${tasks[0].id}`))
|
|
})
|
|
|
|
test('Should not see any elements for a project which is shared read only', async ({authenticatedPage: page}) => {
|
|
await UserFactory.create(2)
|
|
await UserProjectFactory.create(1, {
|
|
project_id: 2,
|
|
user_id: 1,
|
|
permission: 0,
|
|
})
|
|
const projects = await ProjectFactory.create(2, {
|
|
owner_id: '{increment}',
|
|
})
|
|
await page.goto(`/projects/${projects[1].id}/`)
|
|
|
|
await expect(page.locator('.project-title-wrapper .icon')).not.toBeVisible()
|
|
await expect(page.locator('input.input[placeholder="Add a task…"]')).not.toBeVisible()
|
|
})
|
|
|
|
test('Should only show the color of a project in the navigation and not in the list view', async ({authenticatedPage: page}) => {
|
|
const projects = await ProjectFactory.create(1, {
|
|
id: 1,
|
|
hex_color: '00db60',
|
|
})
|
|
await TaskFactory.create(10, {
|
|
project_id: projects[0].id,
|
|
})
|
|
await page.goto(`/projects/${projects[0].id}/1`)
|
|
|
|
await expect(page.locator('.menu-list li .list-menu-link .color-bubble')).toHaveCSS('background-color', 'rgb(0, 219, 96)')
|
|
await expect(page.locator('.tasks .color-bubble')).not.toBeVisible()
|
|
})
|
|
|
|
test('Should paginate for > 50 tasks', async ({authenticatedPage: page}) => {
|
|
await createProjects(1)
|
|
const tasks = await TaskFactory.create(100, {
|
|
id: '{increment}',
|
|
title: i => `task${i}`,
|
|
project_id: 1,
|
|
})
|
|
await page.goto('/projects/1/1')
|
|
|
|
await expect(page.locator('.tasks')).toContainText(tasks[20].title)
|
|
await expect(page.locator('.tasks')).not.toContainText(tasks[99].title)
|
|
|
|
await page.locator('.card-content .pagination .pagination-link').filter({hasText: '2'}).click()
|
|
|
|
await expect(page).toHaveURL(/\?page=2/)
|
|
await expect(page.locator('.tasks')).toContainText(tasks[99].title)
|
|
await expect(page.locator('.tasks')).not.toContainText(tasks[20].title)
|
|
})
|
|
|
|
test('Should show cross-project subtasks in their own project List view', async ({authenticatedPage: page}) => {
|
|
const projects = await createProjects(2)
|
|
|
|
await TaskFactory.create(1, {
|
|
id: 1,
|
|
title: 'Parent Task in Project A',
|
|
project_id: projects[0].id,
|
|
}, false)
|
|
await TaskFactory.create(1, {
|
|
id: 2,
|
|
title: 'Subtask in Project B',
|
|
project_id: projects[1].id,
|
|
}, false)
|
|
|
|
// Make task 2 a subtask of task 1
|
|
await TaskRelationFactory.truncate()
|
|
await TaskRelationFactory.create(1, {
|
|
id: 1,
|
|
task_id: 2,
|
|
other_task_id: 1,
|
|
relation_kind: 'subtask',
|
|
}, false)
|
|
await TaskRelationFactory.create(1, {
|
|
id: 2,
|
|
task_id: 1,
|
|
other_task_id: 2,
|
|
relation_kind: 'parenttask',
|
|
}, false)
|
|
|
|
await page.goto(`/projects/${projects[1].id}/${projects[1].views[0].id}`)
|
|
|
|
await expect(page.locator('.tasks')).toContainText('Subtask in Project B')
|
|
})
|
|
|
|
test('Should show same-project subtasks under their parent', async ({authenticatedPage: page}) => {
|
|
const projects = await createProjects(1)
|
|
|
|
await TaskFactory.create(1, {
|
|
id: 1,
|
|
title: 'Parent Task',
|
|
project_id: projects[0].id,
|
|
}, false)
|
|
await TaskFactory.create(1, {
|
|
id: 2,
|
|
title: 'Subtask Same Project',
|
|
project_id: projects[0].id,
|
|
}, false)
|
|
|
|
// Make task 2 a subtask of task 1
|
|
await TaskRelationFactory.truncate()
|
|
await TaskRelationFactory.create(1, {
|
|
id: 1,
|
|
task_id: 2,
|
|
other_task_id: 1,
|
|
relation_kind: 'subtask',
|
|
}, false)
|
|
await TaskRelationFactory.create(1, {
|
|
id: 2,
|
|
task_id: 1,
|
|
other_task_id: 2,
|
|
relation_kind: 'parenttask',
|
|
}, false)
|
|
|
|
await page.goto(`/projects/${projects[0].id}/${projects[0].views[0].id}`)
|
|
|
|
await expect(page.locator('.tasks')).toContainText('Parent Task')
|
|
await expect(page.locator('.tasks')).toContainText('Subtask Same Project')
|
|
|
|
await expect(page.locator('ul.tasks > div > .single-task')).toBeVisible()
|
|
await expect(page.locator('ul.tasks > div > .subtask-nested')).toBeVisible()
|
|
})
|
|
})
|