29 lines
2.3 KiB
TypeScript
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));
|
|
});
|