DSH-Arch-Setup/plugins/dsh-touched-git/test/plugin.test.js
Шурупов Илья Викторович cf9443753e Add one-command Arch DSH setup
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.
2026-09-12 19:13:36 +03:00

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)
})