Files
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

29 lines
2.3 KiB
TypeScript

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {randomUUID} from 'node:crypto';
import {postInput} from '../src/lib/write';
import {noteEditInput,withRevision} from '../src/lib/note-edits';
import {publicPostId} from '../src/lib/model';
import {entryText,type ExploreEntry} from '../src/lib/explore';
test('generic API accepts stable public IDs while retaining UUID storage and rejecting invalid IDs',()=>{
const publicId='0123456789abcdef01234567',stored=randomUUID();
assert.equal(postInput.parse({kind:'article',title:'文本与图像',publicId}).publicId,publicId);
for(const id of ['bad','ABCDEF0123456789abcdef01','1'.repeat(25)])assert.equal(postInput.safeParse({kind:'article',title:'x',publicId:id}).success,false);
assert.equal(publicPostId({id:stored,public_id:publicId}),publicId);assert.equal(publicPostId({id:stored}),stored);
});
test('media/cover edits are optional and change optimistic revisions independently of the text',()=>{
const a=randomUUID(),b=randomUUID();
const entry:ExploreEntry={id:'0123456789abcdef01234567',title:'笔记',description:'说明',markdown:'# 笔记\n\n正文',namespace:'Main',categories:[],imageCount:1,media:[],color:'#fff',assets:[{id:a,kind:'image',role:'content'}],coverAssetId:a};
const before=withRevision(entry).revision;
assert.notEqual(withRevision({...entry,coverAssetId:b}).revision,before);
assert.notEqual(withRevision({...entry,assets:[{id:b,kind:'image',role:'content'}]}).revision,before);
const input={title:'笔记',description:'说明',markdown:'正文',tags:[],revision:before};
assert.equal(noteEditInput.parse(input).assets,undefined);
assert.equal(noteEditInput.parse({...input,assets:[{id:a}],coverAssetId:null}).assets?.[0].role,'content');
});
test('AI text preserves JSON, code and media links as ordinary modalities',()=>{
const id=randomUUID(),markdown='# 文本说明\n\n```json\n{"type":"text","box":[1,2,3,4]}\n```\n\n```tsx\nexport default function Example(){return <div/>}\n```';
const entry:ExploreEntry={id,title:'文本说明',description:'可访问',markdown,namespace:'Main',categories:[],imageCount:1,media:[{kind:'image',url:'/api/media/'+randomUUID(),title:'标注图'}],color:'#fff'};
const text=entryText(entry);assert.ok(text.includes(markdown));assert.ok(text.includes(entry.media[0].url));assert.ok(text.includes('/explore/'+id));
});