Files
deepseek-harness/packages/fs/fs/tests/invariant.spec.ts
2026-08-09 17:43:53 +08:00

56 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { Context } from 'cordis'
import { FsTargetKey, FsVersion } from '@deepseek-ai/dsh-fs'
import type { FsTarget } from '@deepseek-ai/dsh-fs'
import * as FsInvariant from '@deepseek-ai/dsh-fs/invariant'
import InvariantService from '@deepseek-ai/dsh-invariants'
async function setup(): Promise<Context> {
const ctx = new Context()
await ctx.plugin(InvariantService)
await ctx.plugin(FsInvariant)
return ctx
}
const target = (key = 'file:1', displayPath = 'file.txt'): FsTarget => ({
targetKey: FsTargetKey(key),
displayPath,
})
describe('filesystem invariants', () => {
it('accepts decision and observation events with usable identities', async () => {
const ctx = await setup()
await expect(ctx.waterfall(
ctx as never, 'fs/write-intent', target(), undefined,
() => Promise.resolve(undefined),
)).resolves.toBeUndefined()
await expect(ctx.waterfall(
ctx as never, 'fs/edit-intent', target(), undefined,
() => Promise.resolve(undefined),
)).resolves.toBeUndefined()
expect(() => {
ctx.emit('fs/observed', target(), { kind: 'present', version: FsVersion('v1') }, undefined)
}).not.toThrow()
expect(() => { ctx.emit('fs/observed', target(), { kind: 'absent' }, undefined) }).not.toThrow()
expect(() => { ctx.emit('tools/change') }).not.toThrow()
})
it('rejects empty target and version identities', async () => {
const ctx = await setup()
expect(() => {
ctx.emit('fs/observed', target(''), { kind: 'present', version: FsVersion('v1') }, undefined)
})
.toThrow(/targetKey must be non-empty/)
expect(() => {
ctx.emit('fs/observed', target('file:1', ''), { kind: 'present', version: FsVersion('v1') }, undefined)
})
.toThrow(/displayPath must be non-empty/)
expect(() => {
ctx.emit('fs/observed', target(), { kind: 'present', version: FsVersion('') }, undefined)
}).toThrow(/present version must be non-empty/)
expect(() => {
ctx.emit('fs/observed', target(), { kind: 'unknown' } as never, undefined)
}).toThrow(/kind must be present or absent/)
})
})