57 lines
2.6 KiB
TypeScript
57 lines
2.6 KiB
TypeScript
import {test, expect} from '../../support/fixtures'
|
|
import {ProjectFactory} from '../../factories/project'
|
|
import {TaskFactory} from '../../factories/task'
|
|
import {TaskCommentFactory} from '../../factories/task_comment'
|
|
import {createDefaultViews} from '../project/prepareProjects'
|
|
|
|
test.describe('Reply to a task comment', () => {
|
|
test.beforeEach(async ({authenticatedPage: page, currentUser}) => {
|
|
await ProjectFactory.create(1, {owner_id: currentUser.id})
|
|
await createDefaultViews(1)
|
|
await TaskFactory.create(1, {id: 1, created_by_id: currentUser.id})
|
|
})
|
|
|
|
test('Reply action prefills the editor with a quoted blockquote and the saved reply renders an author header + chevron that jumps to the original', async ({authenticatedPage: page, currentUser}) => {
|
|
await TaskCommentFactory.create(1, {
|
|
id: 1,
|
|
task_id: 1,
|
|
author_id: currentUser.id,
|
|
comment: 'Original message that we will quote.',
|
|
})
|
|
|
|
await page.goto('/tasks/1')
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
const originalComment = page.locator('#comment-1')
|
|
await expect(originalComment).toBeVisible({timeout: 10000})
|
|
|
|
// The Reply action lives in the per-comment bottom-actions list.
|
|
await originalComment.getByRole('button', {name: 'Reply', exact: true}).click()
|
|
|
|
// The new-comment editor (the contenteditable one) should now contain
|
|
// the prefilled blockquote pointing back at comment 1.
|
|
const newCommentEditor = page.locator('.task-view .comments .media.comment .tiptap__editor .tiptap.ProseMirror[contenteditable="true"]').last()
|
|
await expect(newCommentEditor).toBeVisible()
|
|
await expect(newCommentEditor.locator('blockquote[data-comment-id="1"]')).toBeVisible()
|
|
await expect(newCommentEditor.locator('blockquote[data-comment-id="1"]')).toContainText('Original message that we will quote.')
|
|
|
|
// Append a reply body after the auto-inserted paragraph.
|
|
await newCommentEditor.click()
|
|
await page.keyboard.press('End')
|
|
await page.keyboard.type('Thanks for that!')
|
|
|
|
await page.getByRole('button', {name: 'Comment', exact: true}).click()
|
|
|
|
// The newly-rendered reply should carry the quote header + chevron.
|
|
const reply = page.locator('.task-view .comments .media.comment').nth(1)
|
|
await expect(reply).toBeVisible()
|
|
const quote = reply.locator('blockquote.comment-quote[data-comment-id="1"]')
|
|
await expect(quote).toBeVisible()
|
|
await expect(quote.locator('.comment-quote__jump')).toBeVisible()
|
|
|
|
// Clicking the chevron scrolls to and briefly highlights the original.
|
|
await quote.locator('.comment-quote__jump').click()
|
|
await expect(originalComment).toHaveClass(/comment-highlight/, {timeout: 2000})
|
|
})
|
|
})
|