cc1c23032f
- Check response.error and !response.data after session.get() to fail closed - Prevents unlimited spawning when SDK returns non-throwing error responses - Added regression tests for SDK error and missing data scenarios
45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import type { OpencodeClient } from "./constants"
|
|
import { resolveSubagentSpawnContext } from "./subagent-spawn-limits"
|
|
|
|
function createMockClient(sessionGet: OpencodeClient["session"]["get"]): OpencodeClient {
|
|
return {
|
|
session: {
|
|
get: sessionGet,
|
|
},
|
|
} as OpencodeClient
|
|
}
|
|
|
|
describe("resolveSubagentSpawnContext", () => {
|
|
describe("#given session.get returns an SDK error response", () => {
|
|
test("throws a fail-closed spawn blocked error", async () => {
|
|
// given
|
|
const client = createMockClient(async () => ({
|
|
error: "lookup failed",
|
|
data: undefined,
|
|
}))
|
|
|
|
// when
|
|
const result = resolveSubagentSpawnContext(client, "parent-session")
|
|
|
|
// then
|
|
await expect(result).rejects.toThrow(/background_task\.maxDescendants cannot be enforced safely.*lookup failed/)
|
|
})
|
|
})
|
|
|
|
describe("#given session.get returns no session data", () => {
|
|
test("throws a fail-closed spawn blocked error", async () => {
|
|
// given
|
|
const client = createMockClient(async () => ({
|
|
data: undefined,
|
|
}))
|
|
|
|
// when
|
|
const result = resolveSubagentSpawnContext(client, "parent-session")
|
|
|
|
// then
|
|
await expect(result).rejects.toThrow(/background_task\.maxDescendants cannot be enforced safely.*No session data returned/)
|
|
})
|
|
})
|
|
})
|