136 lines
5.5 KiB
TypeScript
136 lines
5.5 KiB
TypeScript
import {test, expect} from '../../support/fixtures'
|
|
import dayjs from 'dayjs'
|
|
import {TaskFactory} from '../../factories/task'
|
|
import {ProjectFactory} from '../../factories/project'
|
|
import {ProjectViewFactory} from '../../factories/project_view'
|
|
|
|
test.describe('Project View Gantt', () => {
|
|
test('Hides tasks with no dates', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const tasks = await TaskFactory.create(1)
|
|
await page.goto('/projects/1/2')
|
|
|
|
await expect(page.locator('.gantt-rows')).not.toContainText(tasks[0].title)
|
|
})
|
|
|
|
test('Shows tasks from the current and next month', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const now = Date.UTC(2022, 8, 25)
|
|
await page.clock.install({time: new Date(now)})
|
|
|
|
const nextMonth = new Date(now)
|
|
nextMonth.setDate(1)
|
|
nextMonth.setMonth(9)
|
|
|
|
await page.goto('/projects/1/2')
|
|
|
|
await expect(page.locator('.gantt-timeline-months')).toContainText(dayjs(now).format('MMMM YYYY'))
|
|
await expect(page.locator('.gantt-timeline-months')).toContainText(dayjs(nextMonth).format('MMMM YYYY'))
|
|
})
|
|
|
|
test('Shows tasks with dates', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const now = new Date()
|
|
const tasks = await TaskFactory.create(1, {
|
|
start_date: now.toISOString(),
|
|
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
|
})
|
|
await page.goto('/projects/1/2')
|
|
|
|
await expect(page.locator('.gantt-rows')).not.toBeEmpty()
|
|
await expect(page.locator('.gantt-rows')).toContainText(tasks[0].title)
|
|
})
|
|
|
|
test('Shows tasks with no dates after enabling them', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const tasks = await TaskFactory.create(1, {
|
|
start_date: null,
|
|
end_date: null,
|
|
})
|
|
await page.goto('/projects/1/2')
|
|
|
|
await page.locator('.gantt-options .fancy-checkbox').filter({hasText: 'Show tasks without date'}).click()
|
|
|
|
await expect(page.locator('.gantt-rows')).not.toBeEmpty()
|
|
await expect(page.locator('.gantt-rows')).toContainText(tasks[0].title)
|
|
})
|
|
|
|
test('Drags a task around', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const taskUpdatePromise = page.waitForResponse(response =>
|
|
response.url().includes('/tasks/') && response.request().method() === 'POST',
|
|
)
|
|
|
|
const now = new Date()
|
|
await TaskFactory.create(1, {
|
|
start_date: now.toISOString(),
|
|
end_date: new Date(new Date(now).setDate(now.getDate() + 4)).toISOString(),
|
|
})
|
|
await page.goto('/projects/1/2')
|
|
|
|
const bar = page.locator('.gantt-rows .gantt-row-bars .gantt-bar').first()
|
|
const barBox = await bar.boundingBox()
|
|
|
|
if (barBox) {
|
|
const startX = barBox.x + barBox.width / 2
|
|
const startY = barBox.y + barBox.height / 2
|
|
|
|
// Trigger pointer events
|
|
await bar.dispatchEvent('pointerdown', {clientX: startX, clientY: startY, pointerId: 1, which: 1})
|
|
await page.waitForTimeout(100)
|
|
await bar.dispatchEvent('pointermove', {clientX: startX + 10, clientY: startY, pointerId: 1})
|
|
await bar.dispatchEvent('pointermove', {clientX: startX + 150, clientY: startY, pointerId: 1})
|
|
await bar.dispatchEvent('pointerup', {clientX: startX + 150, clientY: startY, pointerId: 1})
|
|
}
|
|
|
|
await taskUpdatePromise
|
|
})
|
|
|
|
test('Should change the query parameters when selecting a date range', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const now = Date.UTC(2022, 10, 9)
|
|
await page.clock.install({time: new Date(now)})
|
|
|
|
await page.goto('/projects/1/2')
|
|
|
|
await page.locator('.project-gantt .gantt-options .field .control input.input.form-control').click()
|
|
await page.locator('.flatpickr-calendar .flatpickr-innerContainer .dayContainer .flatpickr-day').first().click()
|
|
await page.locator('.flatpickr-calendar .flatpickr-innerContainer .dayContainer .flatpickr-day').last().click()
|
|
|
|
await expect(page).toHaveURL(/dateFrom=2022-09-25/)
|
|
await expect(page).toHaveURL(/dateTo=2022-11-05/)
|
|
})
|
|
|
|
test('Should change the date range based on date query parameters', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
await page.goto('/projects/1/2?dateFrom=2022-09-25&dateTo=2022-11-05')
|
|
|
|
await expect(page.locator('.gantt-timeline-months')).toContainText('September 2022')
|
|
await expect(page.locator('.gantt-timeline-months')).toContainText('October 2022')
|
|
await expect(page.locator('.gantt-timeline-months')).toContainText('November 2022')
|
|
await expect(page.locator('.project-gantt .gantt-options .field .control input.input.form-control')).toHaveValue('25 Sep 2022 to 5 Nov 2022')
|
|
})
|
|
|
|
test('Should open a task when double clicked on it', async ({authenticatedPage: page}) => {
|
|
await ProjectFactory.create(1)
|
|
await ProjectViewFactory.create(1, {id: 2, project_id: 1, view_kind: 1})
|
|
const now = new Date()
|
|
const tasks = await TaskFactory.create(1, {
|
|
start_date: dayjs(now).format(),
|
|
end_date: dayjs(now.setDate(now.getDate() + 4)).format(),
|
|
})
|
|
await page.goto('/projects/1/2')
|
|
|
|
await page.locator('.gantt-container .gantt-row-bars .gantt-bar').dblclick()
|
|
|
|
await expect(page).toHaveURL(new RegExp(`/tasks/${tasks[0].id}`))
|
|
})
|
|
})
|