import { test, expect } from '@playwright/test' import { API_KEY_HEADER } from './helpers' test.describe('Docs Knowledge API', () => { test('tree/search/content flows for markdown knowledge docs', async ({ request }) => { const stamp = Date.now() const path = `knowledge-base/e2e-kb-${stamp}.md` const content = `# E2E Knowledge ${stamp}\n\nDeployment runbook token: kb-search-${stamp}` const create = await request.post('/api/memory', { headers: API_KEY_HEADER, data: { action: 'create', path, content, }, }) expect(create.status()).toBe(200) const tree = await request.get('/api/docs/tree', { headers: API_KEY_HEADER }) expect(tree.status()).toBe(200) const treeBody = await tree.json() expect(Array.isArray(treeBody.tree)).toBe(true) const search = await request.get(`/api/docs/search?q=${encodeURIComponent(`kb-search-${stamp}`)}`, { headers: API_KEY_HEADER, }) expect(search.status()).toBe(200) const searchBody = await search.json() const found = searchBody.results.find((r: any) => r.path === path) expect(found).toBeTruthy() const doc = await request.get(`/api/docs/content?path=${encodeURIComponent(path)}`, { headers: API_KEY_HEADER, }) expect(doc.status()).toBe(200) const docBody = await doc.json() expect(docBody.path).toBe(path) expect(docBody.content).toContain(`kb-search-${stamp}`) const cleanup = await request.delete('/api/memory', { headers: API_KEY_HEADER, data: { action: 'delete', path, }, }) expect(cleanup.status()).toBe(200) }) test('docs APIs require auth', async ({ request }) => { const tree = await request.get('/api/docs/tree') expect(tree.status()).toBe(401) const search = await request.get('/api/docs/search?q=deployment') expect(search.status()).toBe(401) const content = await request.get('/api/docs/content?path=knowledge-base/example.md') expect(content.status()).toBe(401) }) })