Package the portable DSH profiles, local plugins, desktop integration, Firefox wrapper, and ownership-aware installer lifecycle. Bundle checksum-pinned OpenVSCode, editor extensions, translation assets, and cloudflared so unreliable upstream artifact downloads cannot break a clean installation.
73 lines
3 KiB
JavaScript
73 lines
3 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { mkdtemp, readdir, rm } from 'node:fs/promises'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import test from 'node:test'
|
|
|
|
const testHome = await mkdtemp(join(tmpdir(), 'dsh-git-plugin-test-'))
|
|
const previousHome = process.env.DSH_HOME
|
|
process.env.DSH_HOME = testHome
|
|
const { apply } = await import('../lib/index.js')
|
|
|
|
test('plugin registration, agent tracking, and directory polling do not initialize editor state', async testContext => {
|
|
testContext.after(async () => {
|
|
if (previousHome === undefined) delete process.env.DSH_HOME
|
|
else process.env.DSH_HOME = previousHome
|
|
await rm(testHome, { recursive: true, force: true })
|
|
})
|
|
const routes = new Map()
|
|
const toolDefinitions = []
|
|
const hooks = new Map()
|
|
const guards = new Set()
|
|
let dispose
|
|
const context = {
|
|
webServer: { register: ({ path, handler }) => { routes.set(path, handler); return () => routes.delete(path) } },
|
|
tools: {
|
|
register: definition => { toolDefinitions.push(definition); return () => {} },
|
|
guard: guard => { guards.add(guard); return () => guards.delete(guard) },
|
|
},
|
|
fs: {},
|
|
on: (name, listener) => { hooks.set(name, listener); return () => hooks.delete(name) },
|
|
systemPrompt: { section: () => () => {} },
|
|
effect: setup => { dispose = setup() },
|
|
}
|
|
apply(context)
|
|
assert.equal(toolDefinitions.length, 3)
|
|
assert.equal(routes.has('/touched-git/editor/open'), true)
|
|
assert.equal(routes.has('/touched-git/editor/open-file'), true)
|
|
assert.equal(routes.has('/touched-git/mutation'), true)
|
|
assert.equal(guards.size, 1)
|
|
assert.equal(hooks.has('fs/write-intent'), true)
|
|
assert.equal(hooks.has('fs/edit-intent'), true)
|
|
const request = {
|
|
method: 'GET',
|
|
url: '/touched-git/list?sessionId=empty-test-session',
|
|
headers: { host: '127.0.0.1:3080', 'sec-fetch-site': 'same-origin' },
|
|
socket: { remoteAddress: '127.0.0.1' },
|
|
}
|
|
let status
|
|
let body
|
|
const response = {
|
|
writeHead: code => { status = code },
|
|
end: data => { body = JSON.parse(data) },
|
|
}
|
|
await routes.get('/touched-git/list')(request, response)
|
|
assert.equal(status, 200)
|
|
assert.deepEqual(body.value.entries, [])
|
|
assert.deepEqual(await readdir(testHome), [])
|
|
const execution = {
|
|
signal: new AbortController().signal,
|
|
agent: { session: { header: { id: 'empty-test-session', cwd: process.cwd() } } },
|
|
}
|
|
const add = toolDefinitions.find(tool => tool.name === 'add_touched_git_directory')
|
|
const get = toolDefinitions.find(tool => tool.name === 'get_touched_git_directories')
|
|
assert.equal((await add.execute({ path: process.cwd() }, execution)).ok, true)
|
|
assert.equal((await get.execute({}, execution)).count, 1)
|
|
await routes.get('/touched-git/list')(request, response)
|
|
assert.equal(body.value.entries.length, 1)
|
|
assert.deepEqual(await readdir(join(testHome, 'touched-git')), ['store.json'])
|
|
await dispose()
|
|
assert.equal(routes.size, 0)
|
|
assert.equal(guards.size, 0)
|
|
assert.equal(hooks.size, 0)
|
|
})
|