build-exe-for-python-sdk-native-pty.spec.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
  2. import { tmpdir } from 'node:os'
  3. import { dirname, join } from 'node:path'
  4. import { afterEach, describe, expect, it } from 'vitest'
  5. import { resolveLinuxNodePtyAddon, resolveWindowsNodePtyAddons } from './build-exe-for-python-sdk-native-pty.ts'
  6. const roots: string[] = []
  7. afterEach(() => {
  8. for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true })
  9. })
  10. describe('resolveLinuxNodePtyAddon', () => {
  11. it('prefers the manylinux build produced by the release workflow', () => {
  12. const root = temporaryPackage()
  13. const built = createAddon(root, 'build', 'Release', 'pty.node')
  14. createAddon(root, 'prebuilds', 'linux-x64', 'pty.node')
  15. expect(resolveLinuxNodePtyAddon(root, 'x64')).toBe(built)
  16. })
  17. it('uses the target prebuild after an ordinary beta install', () => {
  18. const root = temporaryPackage()
  19. const prebuilt = createAddon(root, 'prebuilds', 'linux-arm64', 'pty.node')
  20. expect(resolveLinuxNodePtyAddon(root, 'arm64')).toBe(prebuilt)
  21. })
  22. it('reports both expected locations when no addon is installed', () => {
  23. const root = temporaryPackage()
  24. expect(() => resolveLinuxNodePtyAddon(root, 'x64')).toThrow(
  25. `node-pty addon is absent from both ${join(root, 'build', 'Release', 'pty.node')} and ${join(root, 'prebuilds', 'linux-x64', 'pty.node')}`,
  26. )
  27. })
  28. })
  29. describe('resolveWindowsNodePtyAddons', () => {
  30. it('requires both ConPTY addons from the x64 prebuild', () => {
  31. const root = temporaryPackage()
  32. const conpty = createAddon(root, 'prebuilds', 'win32-x64', 'conpty.node')
  33. const consoleList = createAddon(root, 'prebuilds', 'win32-x64', 'conpty_console_list.node')
  34. expect(resolveWindowsNodePtyAddons(root, 'x64')).toEqual([conpty, consoleList])
  35. })
  36. it('names every missing Windows addon', () => {
  37. const root = temporaryPackage()
  38. expect(() => resolveWindowsNodePtyAddons(root, 'x64')).toThrow(
  39. `Windows node-pty addons are missing: ${join(root, 'prebuilds', 'win32-x64', 'conpty.node')}, ${join(root, 'prebuilds', 'win32-x64', 'conpty_console_list.node')}`,
  40. )
  41. })
  42. })
  43. function temporaryPackage(): string {
  44. const root = mkdtempSync(join(tmpdir(), 'dsh-node-pty-addon-'))
  45. roots.push(root)
  46. return root
  47. }
  48. function createAddon(root: string, ...segments: string[]): string {
  49. const path = join(root, ...segments)
  50. mkdirSync(dirname(path), { recursive: true })
  51. writeFileSync(path, '')
  52. return path
  53. }