Files
probably-rendering-one-more…/apps/waterfall-wiki/tests/skill-docs.test.ts
T
codex-bot ad398db781
waterfall-wiki CI and deployment / verify-and-deploy (push) Has been cancelled
studio CI and deployment / verify-and-deploy (push) Successful in 9m15s
Restore PROMPT branding, rename waterfall-wiki, and add system tag workflows
2026-10-27 00:35:59 +08:00

60 lines
4.8 KiB
TypeScript

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {skillDocuments,skillResources,documentMarkdown,getSkill,skillDocumentMarkdown,skillCatalog} from '../src/content/skills/catalog';
test('human and agent documents share a complete linked resource registry',()=>{
for(const doc of skillDocuments){const md=documentMarkdown(doc.id)!;assert.ok(md.startsWith('# '+doc.title));for(const block of doc.blocks){if(block.text)assert.ok(md.includes(block.text));for(const id of block.refs||[])assert.ok(skillResources.some(r=>r.id===id))}assert.ok(!md.includes('/p/street-people-'));}
assert.equal(documentMarkdown('missing'),null);assert.equal(new Set(skillResources.map(r=>r.id)).size,skillResources.length);
for(const doc of skillDocuments)assert.ok(skillResources.some(r=>r.id===doc.id&&r.human&&r.href.endsWith('.md')));
});
test('original collections retain their authored documents and API resources',()=>{
for(const card of skillCatalog){
const skill=getSkill(card.id)!;assert.ok(skill);assert.equal(skill.id,card.id);
assert.equal(new Set(skill.resources.map(r=>r.id)).size,skill.resources.length);
for(const doc of skill.documents){
const md=skillDocumentMarkdown(card.id,doc.id)!;assert.ok(md.startsWith('# '+doc.title));
assert.ok(skill.resources.some(r=>r.id===doc.id&&r.kind==='document'&&r.human));
for(const block of doc.blocks){if(block.text)assert.ok(md.includes(block.text));for(const id of block.refs||[])assert.ok(skill.resources.some(r=>r.id===id),card.id+': '+id);}
}
}
assert.equal(getSkill('__proto__'),undefined);assert.equal(skillDocumentMarkdown('missing','index'),null);assert.equal(skillDocumentMarkdown('shadow-puppet','missing'),null);
const shadow=getSkill('shadow-puppet')!;
assert.equal(shadow.resources.filter(r=>r.kind==='document').length,5);
assert.equal(shadow.resources.filter(r=>r.kind==='image').length,2);
assert.equal(shadow.resources.find(r=>r.id==='upload-api')?.href,'/api/upload');
assert.equal(shadow.resources.find(r=>r.id==='media-api')?.template,true);
});
test('every guidance page has a matching Markdown URL and all document links resolve globally',async()=>{
const {guidanceDocuments,getGuidance,guidanceMarkdown,guidanceIndexMarkdown,humanDocumentUrl,markdownDocumentUrl,guidanceBacklinks}=await import('../src/content/skills/guidance');
assert.equal(new Set(guidanceDocuments.map(d=>d.path)).size,guidanceDocuments.length);
for(const doc of guidanceDocuments){
for(const r of doc.resources)if(r.documentPath)assert.ok(getGuidance(r.documentPath),r.documentPath);
const text=guidanceMarkdown(doc.path)!;
assert.ok(text.startsWith('# '+doc.title));
assert.equal(markdownDocumentUrl(doc.path),humanDocumentUrl(doc.path)+'?agent_mode=True');
assert.ok(text.includes(humanDocumentUrl(doc.path)));
for(const block of doc.blocks){
if(block.text)assert.ok(text.includes(block.text));
for(const id of block.refs||[]){const r=doc.resources.find(r=>r.id===id);assert.ok(r,doc.path+': '+id);if(r.documentPath){assert.ok(getGuidance(r.documentPath));assert.ok(text.includes(markdownDocumentUrl(r.documentPath)));}}
}
assert.ok(guidanceIndexMarkdown().includes(markdownDocumentUrl(doc.path)));
}
assert.ok(guidanceIndexMarkdown(true).includes('/skills/index.md'));
assert.equal(getGuidance('__proto__'),undefined);assert.equal(guidanceMarkdown('missing'),null);
const shared=guidanceBacklinks('image-delivery').map(d=>d.path);
assert.ok(shared.includes('street-people/checks'));assert.ok(shared.includes('shadow-puppet/delivery'));
assert.ok(guidanceMarkdown('image-delivery')!.includes(markdownDocumentUrl('street-people/checks')));
assert.ok(guidanceMarkdown('image-delivery')!.includes(markdownDocumentUrl('shadow-puppet/delivery')));
});
test('Markdown counterpart responses support GET and HEAD and reject writes or missing documents',async()=>{
const {sendMarkdown}=await import('../src/lib/markdown-response');
const {guidanceMarkdown}=await import('../src/content/skills/guidance');
for(const [method,text,expected] of [['GET',guidanceMarkdown('shadow-puppet/prompt'),200],['HEAD',guidanceMarkdown('shadow-puppet/prompt'),200],['POST',guidanceMarkdown('shadow-puppet/prompt'),405],['GET',guidanceMarkdown('missing'),404]] as const){
const result={code:0,body:null as string|null,headers:{} as Record<string,string>,setHeader(k:string,v:string){this.headers[k]=v;return this},status(code:number){this.code=code;return this},send(body:string){this.body=body;return this},end(){return this}};
sendMarkdown({method} as import('next').NextApiRequest,result as unknown as import('next').NextApiResponse,text);
assert.equal(result.code,expected);if(method==='GET'&&expected===200){assert.match(result.headers['Content-Type'],/text\/markdown/);assert.ok(result.body?.startsWith('# '));}else assert.equal(result.body,null);
}
});