fixtures.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { test as base, expect, type Page } from "@playwright/test"
  2. import { cleanupTestProject, createTestProject, seedProjects } from "./actions"
  3. import { promptSelector } from "./selectors"
  4. import { createSdk, dirSlug, getWorktree, sessionPath } from "./utils"
  5. export const settingsKey = "settings.v3"
  6. type TestFixtures = {
  7. sdk: ReturnType<typeof createSdk>
  8. gotoSession: (sessionID?: string) => Promise<void>
  9. withProject: <T>(
  10. callback: (project: {
  11. directory: string
  12. slug: string
  13. gotoSession: (sessionID?: string) => Promise<void>
  14. }) => Promise<T>,
  15. options?: { extra?: string[] },
  16. ) => Promise<T>
  17. }
  18. type WorkerFixtures = {
  19. directory: string
  20. slug: string
  21. }
  22. export const test = base.extend<TestFixtures, WorkerFixtures>({
  23. directory: [
  24. async ({}, use) => {
  25. const directory = await getWorktree()
  26. await use(directory)
  27. },
  28. { scope: "worker" },
  29. ],
  30. slug: [
  31. async ({ directory }, use) => {
  32. await use(dirSlug(directory))
  33. },
  34. { scope: "worker" },
  35. ],
  36. sdk: async ({ directory }, use) => {
  37. await use(createSdk(directory))
  38. },
  39. gotoSession: async ({ page, directory }, use) => {
  40. await seedStorage(page, { directory })
  41. const gotoSession = async (sessionID?: string) => {
  42. await page.goto(sessionPath(directory, sessionID))
  43. await expect(page.locator(promptSelector)).toBeVisible()
  44. }
  45. await use(gotoSession)
  46. },
  47. withProject: async ({ page }, use) => {
  48. await use(async (callback, options) => {
  49. const directory = await createTestProject()
  50. const slug = dirSlug(directory)
  51. await seedStorage(page, { directory, extra: options?.extra })
  52. const gotoSession = async (sessionID?: string) => {
  53. await page.goto(sessionPath(directory, sessionID))
  54. await expect(page.locator(promptSelector)).toBeVisible()
  55. }
  56. try {
  57. await gotoSession()
  58. return await callback({ directory, slug, gotoSession })
  59. } finally {
  60. await cleanupTestProject(directory)
  61. }
  62. })
  63. },
  64. })
  65. async function seedStorage(page: Page, input: { directory: string; extra?: string[] }) {
  66. await seedProjects(page, input)
  67. await page.addInitScript(() => {
  68. localStorage.setItem(
  69. "opencode.global.dat:model",
  70. JSON.stringify({
  71. recent: [{ providerID: "opencode", modelID: "big-pickle" }],
  72. user: [],
  73. variant: {},
  74. }),
  75. )
  76. })
  77. }
  78. export { expect }