test: cover the two locations the composition test was carrying
Moving `web-agent-presets` to the built lane took its coverage with it, and the per-file gate named what it had been the only reach for: the session header's `agentPreset` type check, and the preset subtree's `write()` override. Neither belonged to a real-composition boot — a header validation case and a subtree behaviour are package-level facts. The `write()` test states why the override exists: the inherited method persists the tree whenever the Loader thinks the config moved, and disposing an agent disposes its subtree, so inheriting it truncates the shipped preset to `[]` the first time a session ends.
This commit is contained in:
@@ -1319,6 +1319,7 @@ describe('SessionStore', () => {
|
|||||||
{ meta: { delegationDepth: '1' }, error: /delegationDepth must be a non-negative safe integer/ },
|
{ meta: { delegationDepth: '1' }, error: /delegationDepth must be a non-negative safe integer/ },
|
||||||
{ meta: { delegationDepth: 0.5 }, error: /delegationDepth must be a non-negative safe integer/ },
|
{ meta: { delegationDepth: 0.5 }, error: /delegationDepth must be a non-negative safe integer/ },
|
||||||
{ meta: { delegationDepth: -1 }, error: /delegationDepth must be a non-negative safe integer/ },
|
{ meta: { delegationDepth: -1 }, error: /delegationDepth must be a non-negative safe integer/ },
|
||||||
|
{ meta: { agentPreset: 1 }, error: /agentPreset must be a string/ },
|
||||||
]
|
]
|
||||||
|
|
||||||
for (const [index, { meta, error }] of cases.entries()) {
|
for (const [index, { meta, error }] of cases.entries()) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { readFile } from 'node:fs/promises'
|
||||||
import { dirname, join } from 'node:path'
|
import { dirname, join } from 'node:path'
|
||||||
import { fileURLToPath, pathToFileURL } from 'node:url'
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
||||||
import { Context } from 'cordis'
|
import { Context } from 'cordis'
|
||||||
@@ -217,6 +218,25 @@ describe('a roster with nothing in it', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('attributing a service to a subtree', () => {
|
describe('attributing a service to a subtree', () => {
|
||||||
|
it('never writes the preset file back, however the subtree changes', async () => {
|
||||||
|
const handle = await ctx.agents.create({
|
||||||
|
sessionId: SessionId('sess-write'),
|
||||||
|
setup: async (agentCtx: Context) => void await ctx.agentPresets.mount(agentCtx, 'standard'),
|
||||||
|
})
|
||||||
|
const [mount] = livePresetMounts().filter(entry => entry.presetId === 'standard')
|
||||||
|
expect(mount).toBeDefined()
|
||||||
|
const file = join(FIXTURES, 'system', 'standard', 'agent.cordis.yml')
|
||||||
|
const before = await readFile(file, 'utf8')
|
||||||
|
|
||||||
|
// The inherited `write()` persists the tree whenever the Loader thinks the
|
||||||
|
// config moved, and disposing an agent disposes its whole subtree — which
|
||||||
|
// is enough to trigger it. Inheriting that truncates the shipped preset to
|
||||||
|
// `[]` the first time a session ends.
|
||||||
|
await handle.dispose()
|
||||||
|
|
||||||
|
expect(await readFile(file, 'utf8')).toBe(before)
|
||||||
|
})
|
||||||
|
|
||||||
it('attributes nothing to a subtree that is already torn down', async () => {
|
it('attributes nothing to a subtree that is already torn down', async () => {
|
||||||
const handle = await ctx.agents.create({
|
const handle = await ctx.agents.create({
|
||||||
sessionId: SessionId('sess-torn'),
|
sessionId: SessionId('sess-torn'),
|
||||||
|
|||||||
Reference in New Issue
Block a user