mirror of
https://gh-proxy.org/https://github.com/klinsmaya/workdsh.git
synced 2026-11-09 01:47:06 +08:00
5 lines
4.7 KiB
JavaScript
5 lines
4.7 KiB
JavaScript
import test from 'node:test'; import assert from 'node:assert/strict'; import { mkdtemp,rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { Context } from '@deepseek-ai/cordis'; import Storage from '@deepseek-ai/dsh-storage'; import * as JsonStorage from '@deepseek-ai/dsh-storage-json'; import * as StorageDomain from '@deepseek-ai/dsh-storage-domain'; import { ProjectManager } from '../dist/services/project-manager.js';
|
|
const actor={principalId:'alice',organizationId:'org',requestId:'test',resolvedBy:'test'};
|
|
async function boot(root){const ctx=new Context();await ctx.plugin(Storage);await ctx.plugin(JsonStorage,{root});await ctx.plugin(StorageDomain,{backend:'json'});await ctx.plugin(ProjectManager);return ctx;}
|
|
test('projects persist, search, isolate revisions and keep library references',async()=>{const root=await mkdtemp(join(tmpdir(),'workdsh-projects-'));let ctx;try{ctx=await boot(root);const first=await ctx.workdshProjects.create(actor,{name:'钣金厂智能运营平台',templateId:'delivery'});const second=await ctx.workdshProjects.create(actor,{name:'独立项目'});assert.equal((await ctx.workdshProjects.list(actor,'钣金')).length,1);await assert.rejects(ctx.workdshProjects.updateConfig(actor,first.project.id,{instruction:'长'.repeat(8001),capabilities:[]},first.config.id),/projects\/instruction-budget-exceeded/);assert.equal((await ctx.workdshProjects.get(actor,first.project.id)).config.id,first.config.id);const revised=await ctx.workdshProjects.updateConfig(actor,first.project.id,{instruction:'只引用已授权资料。',capabilities:[{kind:'skill',id:'organizer',revision:'skill-revision-1',label:'资料整理'}]},first.config.id);const secondRevised=await ctx.workdshProjects.updateConfig(actor,second.project.id,{instruction:'独立配置。',capabilities:[{kind:'skill',id:'organizer',revision:'skill-revision-1',label:'资料整理'}]},second.config.id);await assert.rejects(ctx.workdshProjects.updateConfig(actor,first.project.id,{instruction:'覆盖',capabilities:[]},first.config.id),/projects\/revision-conflict/);const item=await ctx.workdshProjects.addWorkItem(actor,first.project.id,'完成需求核对');await assert.rejects(ctx.workdshProjects.updateWorkItem(actor,first.project.id,{...item,title:'并发覆盖'},'bad'),/projects\/revision-conflict/);const ref=await ctx.workdshProjects.addAsset(actor,first.project.id,{nodeId:'node-1',assetId:'asset-1',revisionId:'revision-1',name:'规范.md',kind:'markdown'});assert.equal((await ctx.workdshProjects.addAsset(actor,first.project.id,{nodeId:'node-1',assetId:'asset-1',revisionId:'revision-1',name:'规范.md',kind:'markdown'})).id,ref.id);const references=[{kind:'work-item',id:item.id,revision:item.revision,label:item.title},{kind:'asset',id:ref.id,revision:ref.revisionId,label:ref.name},{kind:'skill',id:'organizer',revision:'skill-revision-1',label:'资料整理'}];assert.equal((await ctx.workdshProjects.validateInputRefs(actor,first.project.id,references)).length,3);await assert.rejects(ctx.workdshProjects.validateInputRefs(actor,first.project.id,[{...references[0],revision:'stale'}]),/projects\/reference-stale/);const task=await ctx.workdshProjects.linkTask(actor,first.project.id,'session-1','核对资料',item.id,references);assert.equal(task.configRevisionId,revised.id);assert.equal(task.references.length,3);assert.equal((await ctx.workdshProjects.get(actor,second.project.id)).assets.length,0);const firstWithoutSkill=await ctx.workdshProjects.updateConfig(actor,first.project.id,{instruction:'只引用已授权资料。',capabilities:[]},revised.id);assert.equal(firstWithoutSkill.capabilities.length,0);assert.equal((await ctx.workdshProjects.get(actor,first.project.id)).tasks[0].configRevisionId,revised.id);const secondAfterRemoval=await ctx.workdshProjects.get(actor,second.project.id);assert.equal(secondAfterRemoval.config.capabilities.length,1);assert.equal(secondAfterRemoval.config.capabilities[0].revision,'skill-revision-1');await ctx.fiber.dispose();ctx=await boot(root);const restored=await ctx.workdshProjects.get(actor,first.project.id);assert.equal(restored.assets.length,1);assert.equal(restored.assets[0].assetId,'asset-1');assert.equal(restored.assets[0].revisionId,'revision-1');assert.equal(restored.tasks[0].references.length,3);assert.equal(restored.config.id,firstWithoutSkill.id);await ctx.workdshProjects.removeAsset(actor,first.project.id,restored.assets[0].id);assert.equal((await ctx.workdshProjects.get(actor,first.project.id)).assets.length,0);await assert.rejects(ctx.workdshProjects.validateInputRefs(actor,first.project.id,[references[1]]),/projects\/reference-stale/);}finally{if(ctx)await ctx.fiber.dispose();await rm(root,{recursive:true,force:true});}});
|