mirror of
https://github.com/Heretek-AI/opencode.git
synced 2026-11-09 10:29:42 -10:00
79 lines
4.4 KiB
TypeScript
79 lines
4.4 KiB
TypeScript
import { expect, story } from "../../storybook/playwright/story"
|
|
|
|
story("keeps file disclosures keyboard-accessible as the file list changes", async ({ mount }) => {
|
|
const root = await mount("current-tool-group--patch-follow-ups")
|
|
const patch = root.locator('[data-component="apply-patch-tool"]')
|
|
const first = patch.getByRole("button", { name: /a\.ts/ })
|
|
const second = patch.getByRole("button", { name: /b\.ts/ })
|
|
await expect(first).toHaveAttribute("aria-expanded", "false")
|
|
await first.focus()
|
|
await first.press("ArrowDown")
|
|
await expect(second).toBeFocused()
|
|
await second.press("ArrowDown")
|
|
await expect(first).toBeFocused()
|
|
await first.press("End")
|
|
await expect(second).toBeFocused()
|
|
await second.press("Home")
|
|
await expect(first).toBeFocused()
|
|
await first.press("Enter")
|
|
await expect(first).toHaveAttribute("aria-expanded", "true")
|
|
await expect(patch.getByRole("region", { name: /a\.ts/ })).toBeVisible()
|
|
await first.press("Space")
|
|
await expect(first).toHaveAttribute("aria-expanded", "false")
|
|
await expect(patch.getByRole("region", { name: /a\.ts/ })).toHaveCount(0)
|
|
await root.getByRole("button", { name: "Finish follow-up patch", exact: true }).click()
|
|
const third = patch.getByRole("button", { name: /c\.ts/ })
|
|
await expect(third).toHaveAttribute("aria-expanded", "false")
|
|
await second.focus()
|
|
await second.press("ArrowDown")
|
|
await expect(third).toBeFocused()
|
|
await third.press("ArrowUp")
|
|
await expect(second).toBeFocused()
|
|
})
|
|
|
|
story("merges follow-up patches into one stack with distinct files", async ({ mount }) => {
|
|
const root = await mount("current-tool-group--patch-follow-ups")
|
|
const group = root.locator('[data-component="collapsed-tool-group"]')
|
|
const patches = group.locator('[data-component="apply-patch-tool"]')
|
|
await expect(patches).toHaveCount(1)
|
|
await expect(patches.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts"])
|
|
const first = patches.locator('[data-scope="apply-patch"] button').filter({ hasText: "a.ts" })
|
|
await first.click()
|
|
await expect(first).toHaveAttribute("aria-expanded", "true")
|
|
await root.getByRole("button", { name: "Start follow-up patch" }).click()
|
|
await expect(group.locator('[data-component="context-tool-group-trigger"]')).toHaveAttribute(
|
|
"aria-label",
|
|
"Used 3 Shell, Patch",
|
|
)
|
|
await expect(patches).toHaveCount(1)
|
|
await expect(patches.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts"])
|
|
await root.getByRole("button", { name: "Finish follow-up patch" }).click()
|
|
await expect(patches).toHaveCount(1)
|
|
await expect(patches.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts", "c.ts"])
|
|
await expect(first).toHaveAttribute("aria-expanded", "true")
|
|
await expect(patches.locator('[data-component="file"]')).toBeVisible()
|
|
})
|
|
|
|
for (const separator of ["shell", "error", "reasoning"]) {
|
|
story(`does not merge patches across an intervening ${separator}`, async ({ mount }) => {
|
|
const root = await mount("current-tool-group--patch-follow-ups", { args: { separator } })
|
|
await root.getByRole("button", { name: "Finish follow-up patch" }).click()
|
|
const group = root.locator('[data-component="collapsed-tool-group"]')
|
|
await expect(group.locator('[data-component="apply-patch-tool"]')).toHaveCount(2)
|
|
await expect(group.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts", "a.ts", "c.ts"])
|
|
if (separator === "error") await expect(group.locator('[data-kind="tool-error-card"]')).toBeVisible()
|
|
})
|
|
}
|
|
|
|
story("does not retain patch files in the wrong batch when thoughts are shown", async ({ mount }) => {
|
|
const root = await mount("current-tool-group--patch-follow-ups", { args: { separator: "reasoning" } })
|
|
await root.getByRole("button", { name: "Hide thoughts", exact: true }).click()
|
|
await root.getByRole("button", { name: "Finish follow-up patch" }).click()
|
|
const group = root.locator('[data-component="collapsed-tool-group"]')
|
|
await expect(group.locator('[data-component="apply-patch-tool"]')).toHaveCount(1)
|
|
await expect(group.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts", "c.ts"])
|
|
await root.getByRole("button", { name: "Show thoughts", exact: true }).click()
|
|
await expect(group.locator('[data-component="apply-patch-tool"]')).toHaveCount(2)
|
|
await expect(group.locator('[data-slot="apply-patch-filename"]')).toHaveText(["a.ts", "b.ts", "a.ts", "c.ts"])
|
|
})
|