mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-14 20:21:39 +03:00
137 lines
6.9 KiB
TypeScript
137 lines
6.9 KiB
TypeScript
import { expect, story } from "../../stories/playwright/story"
|
|
|
|
// Moved from packages/app/e2e/regression/review-line-comment.spec.ts
|
|
story("opens the comment editor when code is clicked", async ({ mount }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
await review.locator('[data-line-type="change-addition"] [data-diff-span]').click()
|
|
await expect(review.getByRole("textbox")).toBeVisible()
|
|
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 2")
|
|
})
|
|
|
|
// Moved from packages/app/e2e/regression/review-line-comment.spec.ts
|
|
story("opens the comment editor when a line number is clicked", async ({ mount }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
await expect(review.getByText("export const first = 1", { exact: true })).toBeVisible()
|
|
const number = review.locator('[data-column-number="1"]')
|
|
await expect(number).toHaveCount(1)
|
|
await number.click()
|
|
await expect(review.getByRole("textbox")).toBeVisible()
|
|
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 1")
|
|
})
|
|
|
|
// Moved from packages/app/e2e/regression/review-line-comment.spec.ts
|
|
story("opens the comment editor for a line number range", async ({ mount }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
const first = review.locator('[data-column-number="1"]')
|
|
const last = review.locator('[data-column-number="3"]')
|
|
await expect(first).toHaveCount(1)
|
|
await expect(last).toHaveCount(1)
|
|
await first.dragTo(last)
|
|
await expect(review.getByRole("textbox")).toBeVisible()
|
|
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on lines 1-3")
|
|
})
|
|
|
|
// Moved from packages/app/e2e/regression/review-line-comment.spec.ts
|
|
story("shows a comment button when a diff line is hovered", async ({ mount }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
const line = review.getByText("export const first = 1", { exact: true })
|
|
const comment = review.getByRole("button", { name: "Comment", exact: true, includeHidden: true })
|
|
await expect(comment).toHaveCount(1)
|
|
await line.hover()
|
|
await expect(comment).toBeVisible()
|
|
await expect(comment).toHaveCSS("pointer-events", "auto")
|
|
await comment.dispatchEvent("click")
|
|
await expect(review.getByRole("textbox")).toBeVisible()
|
|
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 1")
|
|
})
|
|
|
|
story("keeps typed comment text while other lines and comments are used", async ({ mount, page }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
const textbox = review.getByRole("textbox")
|
|
const firstLine = review.getByText("export const first = 1", { exact: true })
|
|
|
|
await review.locator('[data-line-type="change-addition"] [data-diff-span]').click()
|
|
await textbox.fill("first comment")
|
|
await textbox.press("Enter")
|
|
await expect(review.getByText("first comment", { exact: true })).toBeVisible()
|
|
|
|
// The gutter button on another line used to replace the open edit with an empty draft.
|
|
await review.getByRole("button", { name: "More options" }).click()
|
|
await page.getByRole("menuitem", { name: "Edit" }).click()
|
|
await expect(textbox).toHaveValue("first comment")
|
|
await textbox.fill("edited comment")
|
|
// A click on another line keeps the edit, and the highlight returns to the edited line.
|
|
await firstLine.click()
|
|
await expect(textbox).toHaveValue("edited comment")
|
|
await expect(review.locator('[data-column-number="1"]')).not.toHaveAttribute("data-selected-line")
|
|
await firstLine.hover()
|
|
await review.getByRole("button", { name: "Comment", exact: true, includeHidden: true }).dispatchEvent("click")
|
|
await expect(textbox).toHaveCount(1)
|
|
await expect(textbox).toHaveValue("edited comment")
|
|
await textbox.press("Enter")
|
|
await expect(review.getByText("edited comment", { exact: true })).toBeVisible()
|
|
|
|
// Deleting a comment used to discard the draft on another line.
|
|
await firstLine.click()
|
|
await expect(review.locator('[data-slot="line-comment-editor-label"]')).toHaveText("Commenting on line 1")
|
|
await textbox.fill("draft text")
|
|
await review.getByRole("button", { name: "More options" }).click()
|
|
await page.getByRole("menuitem", { name: "Delete" }).click()
|
|
await expect(review.getByText("edited comment", { exact: true })).toHaveCount(0)
|
|
await expect(textbox).toHaveValue("draft text")
|
|
})
|
|
|
|
story("mentions in a diff comment pick a path, and Escape without a list cancels", async ({ mount }) => {
|
|
const root = await mount("components-session-review--interactive-comments")
|
|
const review = root.locator('[data-component="session-review"]')
|
|
const textbox = review.getByRole("textbox")
|
|
const items = review.locator('[data-slot="line-comment-mention-item"]')
|
|
|
|
await review.locator('[data-line-type="change-addition"] [data-diff-span]').click()
|
|
await textbox.pressSequentially("see @rev")
|
|
await expect(items).toHaveCount(2)
|
|
await textbox.press("ArrowDown")
|
|
await expect(items.nth(1)).toHaveAttribute("data-active", "")
|
|
await textbox.press("Enter")
|
|
await expect(textbox).toHaveValue("see @src/review.test.ts ")
|
|
await expect(items).toHaveCount(0)
|
|
|
|
// A bare `@` shows no list, yet used to swallow the first Escape as if one were open.
|
|
await textbox.pressSequentially("@")
|
|
await textbox.press("Escape")
|
|
await expect(textbox).toHaveCount(0)
|
|
})
|
|
|
|
story("a focus request opens the comment and clears once the comment shows", async ({ mount }) => {
|
|
const root = await mount("components-session-review--focused-comment")
|
|
const comment = root.locator('[data-comment-id="comment-1"]')
|
|
const request = root.locator("output")
|
|
|
|
await expect(comment).toBeVisible()
|
|
await expect(comment).not.toHaveAttribute("data-open")
|
|
await root.getByRole("button", { name: "Focus comment", exact: true }).click()
|
|
await expect(comment).toHaveAttribute("data-open", "")
|
|
await expect(request).toHaveText("none")
|
|
})
|
|
|
|
story("a focus request for a comment that never renders clears after the reveal times out", async ({ mount, page }) => {
|
|
const root = await mount("components-session-review--focused-comment")
|
|
const request = root.locator("output")
|
|
|
|
await expect(root.locator('[data-comment-id="comment-1"]')).toBeVisible()
|
|
await page.clock.install()
|
|
await root.getByRole("button", { name: "Focus missing comment", exact: true }).click()
|
|
|
|
// The request used to clear on the next frame, before the comment could render.
|
|
await page.clock.runFor(1000)
|
|
await expect(request).toHaveText("missing")
|
|
|
|
await page.clock.runFor(1100)
|
|
await expect(request).toHaveText("none")
|
|
})
|