sdk.test.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { describe, test, expect, beforeEach, afterEach } from 'bun:test'
  2. import { AbilitiesSDK, createAbilitiesSDK } from '../src/sdk.js'
  3. import * as fs from 'fs'
  4. import * as path from 'path'
  5. import * as os from 'os'
  6. describe('AbilitiesSDK', () => {
  7. let sdk: AbilitiesSDK
  8. let tempDir: string
  9. beforeEach(async () => {
  10. tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'abilities-sdk-test-'))
  11. fs.writeFileSync(
  12. path.join(tempDir, 'test-ability.yaml'),
  13. `
  14. name: test-sdk
  15. description: Test SDK ability
  16. triggers:
  17. keywords:
  18. - test
  19. inputs:
  20. message:
  21. type: string
  22. default: "Hello"
  23. steps:
  24. - id: echo
  25. type: script
  26. run: echo "{{inputs.message}}"
  27. `
  28. )
  29. sdk = createAbilitiesSDK({ projectDir: tempDir, includeGlobal: false })
  30. })
  31. afterEach(() => {
  32. sdk.cleanup()
  33. fs.rmSync(tempDir, { recursive: true, force: true })
  34. })
  35. test('should list loaded abilities', async () => {
  36. const abilities = await sdk.list()
  37. expect(abilities.length).toBe(1)
  38. expect(abilities[0].name).toBe('test-sdk')
  39. expect(abilities[0].description).toBe('Test SDK ability')
  40. expect(abilities[0].stepCount).toBe(1)
  41. })
  42. test('should get ability by name', async () => {
  43. const ability = await sdk.get('test-sdk')
  44. expect(ability).toBeDefined()
  45. expect(ability?.name).toBe('test-sdk')
  46. expect(ability?.steps.length).toBe(1)
  47. })
  48. test('should return undefined for unknown ability', async () => {
  49. const ability = await sdk.get('nonexistent')
  50. expect(ability).toBeUndefined()
  51. })
  52. test('should validate ability', async () => {
  53. const result = await sdk.validate('test-sdk')
  54. expect(result.valid).toBe(true)
  55. expect(result.errors.length).toBe(0)
  56. })
  57. test('should return error for unknown ability validation', async () => {
  58. const result = await sdk.validate('nonexistent')
  59. expect(result.valid).toBe(false)
  60. expect(result.errors[0]).toContain('not found')
  61. })
  62. test('should execute ability', async () => {
  63. const result = await sdk.execute('test-sdk', { message: 'World' })
  64. expect(result.status).toBe('completed')
  65. expect(result.ability).toBe('test-sdk')
  66. expect(result.steps.length).toBe(1)
  67. expect(result.steps[0].status).toBe('completed')
  68. expect(result.error).toBeUndefined()
  69. })
  70. test('should execute ability with defaults', async () => {
  71. const result = await sdk.execute('test-sdk')
  72. expect(result.status).toBe('completed')
  73. })
  74. test('should return error for unknown ability execution', async () => {
  75. const result = await sdk.execute('nonexistent')
  76. expect(result.status).toBe('failed')
  77. expect(result.error).toContain('not found')
  78. })
  79. test('should get status of active execution', async () => {
  80. const status = await sdk.status()
  81. expect(status.active).toBe(false)
  82. })
  83. test('should cancel execution', async () => {
  84. const cancelled = await sdk.cancel()
  85. expect(cancelled).toBe(false)
  86. })
  87. })
  88. describe('createAbilitiesSDK', () => {
  89. test('should create SDK instance', () => {
  90. const sdk = createAbilitiesSDK()
  91. expect(sdk).toBeInstanceOf(AbilitiesSDK)
  92. sdk.cleanup()
  93. })
  94. test('should accept options', () => {
  95. const sdk = createAbilitiesSDK({
  96. projectDir: '/tmp/test',
  97. includeGlobal: false,
  98. })
  99. expect(sdk).toBeInstanceOf(AbilitiesSDK)
  100. sdk.cleanup()
  101. })
  102. })