82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
import { API_KEY_HEADER } from './helpers'
|
|
|
|
test.describe('API Index / Discovery', () => {
|
|
test('GET /api/index returns structured catalog', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
expect(res.status()).toBe(200)
|
|
|
|
const body = await res.json()
|
|
expect(body).toHaveProperty('version')
|
|
expect(body).toHaveProperty('endpoints')
|
|
expect(body).toHaveProperty('total_endpoints')
|
|
expect(Array.isArray(body.endpoints)).toBe(true)
|
|
expect(body.total_endpoints).toBe(body.endpoints.length)
|
|
expect(body.total_endpoints).toBeGreaterThan(50)
|
|
})
|
|
|
|
test('each endpoint has required fields', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
const body = await res.json()
|
|
|
|
for (const ep of body.endpoints) {
|
|
expect(ep).toHaveProperty('path')
|
|
expect(ep).toHaveProperty('methods')
|
|
expect(ep).toHaveProperty('tag')
|
|
expect(ep).toHaveProperty('description')
|
|
expect(ep).toHaveProperty('auth')
|
|
expect(ep.path).toMatch(/^\/api\//)
|
|
expect(Array.isArray(ep.methods)).toBe(true)
|
|
expect(ep.methods.length).toBeGreaterThan(0)
|
|
}
|
|
})
|
|
|
|
test('known routes are present', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
const body = await res.json()
|
|
const paths = body.endpoints.map((ep: any) => ep.path)
|
|
|
|
expect(paths).toContain('/api/tasks')
|
|
expect(paths).toContain('/api/agents')
|
|
expect(paths).toContain('/api/projects')
|
|
expect(paths).toContain('/api/status')
|
|
expect(paths).toContain('/api/chat/messages')
|
|
expect(paths).toContain('/api/webhooks')
|
|
expect(paths).toContain('/api/index')
|
|
})
|
|
|
|
test('event_stream metadata is present', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
const body = await res.json()
|
|
|
|
expect(body).toHaveProperty('event_stream')
|
|
expect(body.event_stream.path).toBe('/api/events')
|
|
expect(body.event_stream.protocol).toBe('SSE')
|
|
expect(typeof body.event_stream.description).toBe('string')
|
|
})
|
|
|
|
test('docs metadata is present', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
const body = await res.json()
|
|
|
|
expect(body).toHaveProperty('docs')
|
|
expect(body.docs.openapi).toBe('/api/docs')
|
|
})
|
|
|
|
test('tags are consistent strings', async ({ request }) => {
|
|
const res = await request.get('/api/index', { headers: API_KEY_HEADER })
|
|
const body = await res.json()
|
|
const tags = new Set(body.endpoints.map((ep: any) => ep.tag))
|
|
|
|
// Should have multiple distinct tags
|
|
expect(tags.size).toBeGreaterThan(10)
|
|
|
|
// Key tags exist
|
|
expect(tags.has('Tasks')).toBe(true)
|
|
expect(tags.has('Agents')).toBe(true)
|
|
expect(tags.has('Projects')).toBe(true)
|
|
expect(tags.has('Auth')).toBe(true)
|
|
expect(tags.has('System')).toBe(true)
|
|
})
|
|
})
|