17 lines
1.5 KiB
TypeScript
17 lines
1.5 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {guides,findGuide,guidanceXml} from '../src/content/guides/catalog';
|
|
test('every conditional link resolves to its exact revision',()=>{for(const g of guides){assert.ok(g.body&&g.applies&&g.summary);for(const l of g.links){assert.ok(findGuide(l.target,l.revision),`${g.id} -> ${l.target}`);assert.ok(l.when);}}});
|
|
test('missing fixed revisions do not silently resolve latest',()=>{assert.equal(findGuide(guides[0].id,999),undefined);assert.equal(findGuide('missing'),undefined);});
|
|
test('XML escapes text and attribute markup without introducing entities',()=>{const g={...guides[0],title:'<script> & "quoted"',links:[{...guides[0].links[0],when:'a" b< c&'}]};const xml=guidanceXml(g);assert.ok(xml.includes('<script> & "quoted"'));assert.ok(xml.includes('when="a" b< c&"'));assert.ok(!xml.includes('<script>'));assert.ok(!xml.includes('<!DOCTYPE'));});
|
|
|
|
import {linkedGuidanceIndex} from '../src/lib/guidance-discovery';
|
|
test('agent entry discovers both corpora and fixes adoption scope',()=>{
|
|
const entry=linkedGuidanceIndex();
|
|
for(const path of ['/api/documents','/api/guides','/protocol'])assert.ok(entry.includes(path));
|
|
for(const guide of guides)assert.ok(entry.includes(`/api/guides/${guide.id}?revision=${guide.revision}&format=xml`));
|
|
assert.ok(entry.includes('(id, revision)'));
|
|
assert.ok(entry.includes('8 篇、深度 3 层'));
|
|
assert.ok(!entry.includes('/skills/index.md'));
|
|
});
|