| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- import { test as base, expect } from "@playwright/test"
- import { createSdk, dirSlug, getWorktree, promptSelector, serverUrl, sessionPath } from "./utils"
- type TestFixtures = {
- sdk: ReturnType<typeof createSdk>
- gotoSession: (sessionID?: string) => Promise<void>
- }
- type WorkerFixtures = {
- directory: string
- slug: string
- }
- export const test = base.extend<TestFixtures, WorkerFixtures>({
- directory: [
- async ({}, use) => {
- const directory = await getWorktree()
- await use(directory)
- },
- { scope: "worker" },
- ],
- slug: [
- async ({ directory }, use) => {
- await use(dirSlug(directory))
- },
- { scope: "worker" },
- ],
- sdk: async ({ directory }, use) => {
- await use(createSdk(directory))
- },
- gotoSession: async ({ page, directory }, use) => {
- await page.addInitScript(
- (input: { directory: string; serverUrl: string }) => {
- const key = "opencode.global.dat:server"
- const raw = localStorage.getItem(key)
- const parsed = (() => {
- if (!raw) return undefined
- try {
- return JSON.parse(raw) as unknown
- } catch {
- return undefined
- }
- })()
- const store = parsed && typeof parsed === "object" ? (parsed as Record<string, unknown>) : {}
- const list = Array.isArray(store.list) ? store.list : []
- const lastProject = store.lastProject && typeof store.lastProject === "object" ? store.lastProject : {}
- const projects = store.projects && typeof store.projects === "object" ? store.projects : {}
- const nextProjects = { ...(projects as Record<string, unknown>) }
- const add = (origin: string) => {
- const current = nextProjects[origin]
- const items = Array.isArray(current) ? current : []
- const existing = items.filter(
- (p): p is { worktree: string; expanded?: boolean } =>
- !!p &&
- typeof p === "object" &&
- "worktree" in p &&
- typeof (p as { worktree?: unknown }).worktree === "string",
- )
- if (existing.some((p) => p.worktree === input.directory)) return
- nextProjects[origin] = [{ worktree: input.directory, expanded: true }, ...existing]
- }
- add("local")
- add(input.serverUrl)
- localStorage.setItem(
- key,
- JSON.stringify({
- list,
- projects: nextProjects,
- lastProject,
- }),
- )
- },
- { directory, serverUrl },
- )
- const gotoSession = async (sessionID?: string) => {
- await page.goto(sessionPath(directory, sessionID))
- await expect(page.locator(promptSelector)).toBeVisible()
- }
- await use(gotoSession)
- },
- })
- export { expect }
|