gen-workflow-guest.spec.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
  2. import { tmpdir } from 'node:os'
  3. import { join } from 'node:path'
  4. import { expect, it, onTestFinished } from 'vitest'
  5. import { bundleWorkflowGuest, generateWorkflowGuest } from './gen-workflow-guest.ts'
  6. async function fixture(source: string): Promise<{ root: string; entry: string; output: string }> {
  7. const root = await mkdtemp(join(tmpdir(), 'dsh-workflow-guest-'))
  8. onTestFinished(() => rm(root, { recursive: true, force: true }))
  9. const directory = join(root, 'packages/workflow/workflow-ptc/src')
  10. await mkdir(directory, { recursive: true })
  11. await writeFile(join(root, 'tsconfig.base.json'), '{"compilerOptions":{"target":"es2024"}}\n')
  12. const entry = join(directory, 'guest.ts')
  13. await writeFile(entry, source)
  14. return { root, entry, output: join(directory, 'guest-source.ts') }
  15. }
  16. it('bundles source imports into a module that loads without their files', async () => {
  17. const { root, entry } = await fixture('import { answer } from "./answer.ts"; import { isBuiltin } from "node:module"; export const result = [answer, isBuiltin("node:vm")];')
  18. await writeFile(join(entry, '..', 'answer.ts'), 'export const answer: number = 42;')
  19. const source = await bundleWorkflowGuest(root)
  20. await rm(join(root, 'packages'), { recursive: true })
  21. const module = await import(`data:text/javascript,${encodeURIComponent(source)}`) as { result: unknown }
  22. expect(module.result).toEqual([42, true])
  23. expect(source).not.toContain(root)
  24. })
  25. it('rejects unresolved imports instead of shipping an unavailable guest dependency', async () => {
  26. const { root } = await fixture('import "dsh-nonexistent-workflow-dependency";')
  27. await expect(bundleWorkflowGuest(root)).rejects.toThrow('workflow guest has an unresolved import')
  28. })
  29. it('checks the generated artifact against the current source and does not rewrite stale output', async () => {
  30. const { root, entry, output } = await fixture('export const answer: number = 42;')
  31. await generateWorkflowGuest(root, false)
  32. const original = await readFile(output, 'utf8')
  33. await generateWorkflowGuest(root, true)
  34. await generateWorkflowGuest(root, false)
  35. expect(await readFile(output, 'utf8')).toBe(original)
  36. await writeFile(entry, 'export const answer: number = 43;')
  37. await expect(generateWorkflowGuest(root, true)).rejects.toThrow('workflow guest source is stale')
  38. expect(await readFile(output, 'utf8')).toBe(original)
  39. })