cordis-core-api.spec.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /** Tests for the generated Cordis core API reference. */
  2. import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
  3. import { tmpdir } from 'node:os'
  4. import { join } from 'node:path'
  5. import { afterEach, describe, expect, it } from 'vitest'
  6. import {
  7. CORDIS_CORE_API_PAGES,
  8. renderCordisCoreApiPage,
  9. renderCordisCoreApiPages,
  10. type CordisCoreApiPage,
  11. } from './cordis-core-api.ts'
  12. const roots: string[] = []
  13. afterEach(() => {
  14. for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true })
  15. })
  16. describe('Cordis core API generation', () => {
  17. it('renders the five detailed pages from pinned vendor declarations', () => {
  18. const pages = renderCordisCoreApiPages()
  19. expect([...pages.keys()]).toEqual(CORDIS_CORE_API_PAGES.map(page => page.out))
  20. expect(pages.get('docs/cordis-api/context.md')).toContain('### ctx.extend(meta?)')
  21. expect(pages.get('docs/cordis-api/events.md')).toContain('## DispatchMode')
  22. expect(pages.get('docs/cordis-api/fiber.md')).toContain('## EffectMeta')
  23. expect(pages.get('docs/cordis-api/registry.md')).toContain('## Plugin')
  24. expect(pages.get('docs/cordis-api/service.md')).toContain('### Service.resolveConfig')
  25. const fiber = pages.get('docs/cordis-api/fiber.md') ?? ''
  26. expect(fiber).toContain('```\n\nRegister a cleanup-aware effect on this fiber.')
  27. expect(fiber).toContain('- `execute` — the effect body; see `Effect` for accepted shapes.')
  28. expect(fiber).toContain('**Returns** a disposer that tears the effect down and settles once done.')
  29. })
  30. it('rejects a public core class without source JSDoc', () => {
  31. const root = mkdtempSync(join(tmpdir(), 'dsh-cordis-core-api-'))
  32. roots.push(root)
  33. mkdirSync(join(root, 'vendor/cordis/src'), { recursive: true })
  34. writeFileSync(join(root, 'vendor/cordis/src/service.ts'), 'export class Service {\n run(): string { return "ok" }\n}\n')
  35. const page: CordisCoreApiPage = {
  36. out: 'docs/cordis-api/service.md',
  37. title: 'Service',
  38. intro: 'Service API.',
  39. sections: [{ kind: 'class', file: 'vendor/cordis/src/service.ts', symbol: 'Service' }],
  40. }
  41. expect(() => renderCordisCoreApiPage(page, root)).toThrow('class Service')
  42. })
  43. })