Files
deepseek-harness/scripts/snapshot-shell-path.spec.ts
T
Yichen Jiang c2fb2bd4e8 Merge branch 'worktree/jobs-api-review-3052' into worktree/jobs-api-review-3127
# Conflicts:
#	.agents/notes/implemented/feature/2026-08-08-web-background-job-display.i18n.yaml
#	docs/config-catalog.i18n.yaml
#	docs/event-producer-consumer.i18n.yaml
#	docs/module-graph.i18n.yaml
#	docs/subsystems/jobs.i18n.yaml
#	docs/subsystems/shell.i18n.yaml
#	docs/subsystems/shell.md
#	docs/subsystems/shell.zh.md
#	docs/tool-catalog.i18n.yaml
#	packages/api/session-controller/README.i18n.yaml
#	packages/context/tmux-context/tests/tmux-context.spec.ts
#	packages/e2b/e2b/tests/fixtures/composition/bin.ts
#	packages/extensions/tool-cordis/src/api-catalog.ts
#	packages/shell/bash-local/README.i18n.yaml
#	packages/shell/bash-local/README.md
#	packages/shell/bash-local/README.zh.md
#	packages/shell/bash-local/src/index.ts
#	packages/shell/bash-local/tests/executor.spec.ts
#	packages/shell/bash-sandbox/README.i18n.yaml
#	packages/shell/bash-sandbox/README.md
#	packages/shell/bash-sandbox/README.zh.md
#	packages/shell/bash-sandbox/src/index.ts
#	packages/shell/bash-sandbox/tests/bwrap.e2e.ts
#	packages/shell/bash-sandbox/tests/landlock.e2e.ts
#	packages/shell/bash-sandbox/tests/partial-landlock.spec.ts
#	packages/shell/bash-sandbox/tests/sandbox.spec.ts
#	packages/shell/bash-sandbox/tests/seatbelt.e2e.ts
#	packages/shell/pwsh-local/README.i18n.yaml
#	packages/shell/pwsh-local/README.md
#	packages/shell/pwsh-local/README.zh.md
#	packages/shell/pwsh-local/src/index.ts
#	packages/shell/pwsh-local/tests/executor.spec.ts
#	packages/shell/pwsh-sandbox/README.i18n.yaml
#	packages/shell/pwsh-sandbox/README.md
#	packages/shell/pwsh-sandbox/README.zh.md
#	packages/shell/pwsh-sandbox/src/index.ts
#	packages/shell/pwsh-sandbox/tests/sandbox.spec.ts
#	packages/shell/shell/README.i18n.yaml
#	packages/shell/shell/README.md
#	packages/shell/shell/README.zh.md
#	packages/shell/shell/src/index.ts
#	packages/shell/shell/tests/service.spec.ts
#	packages/shell/tool-bash/README.i18n.yaml
#	packages/shell/tool-bash/src/index.ts
#	packages/shell/tool-bash/tests/tools.spec.ts
#	packages/shell/tool-pwsh/README.i18n.yaml
#	packages/shell/tool-pwsh/src/index.ts
#	packages/shell/tool-pwsh/tests/background.spec.ts
#	packages/shell/tool-pwsh/tests/tools.spec.ts
#	packages/workflow/tool-workflow/README.i18n.yaml
#	packages/workflow/tool-workflow/package.json
#	packages/workflow/tool-workflow/tests/tool-workflow.spec.ts
#	snapshots/session/ptc-python-turn/system-prompt.expected.md
2026-09-17 16:48:06 +08:00

43 lines
2.0 KiB
TypeScript

import { Context } from '@deepseek-ai/cordis'
import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local'
import { LocalBashExecutor } from '@deepseek-ai/dsh-bash-local'
import { mkdtemp, readFile, rm } from 'node:fs/promises'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { expect, it } from 'vitest'
import * as adapter from './snapshot-shell-path.ts'
it.skipIf(process.platform === 'win32')('translates only the exact fixture command and preserves real shell failures', async () => {
const root = await mkdtemp(join(tmpdir(), 'snapshot-shell-'))
const ctx = new Context()
const disposers: (() => Promise<void>)[] = []
try {
const subprocess = ctx.plugin(LocalSubprocessRuntime)
disposers.push(() => subprocess.dispose())
await subprocess
const bash = ctx.plugin(LocalBashExecutor)
disposers.push(() => bash.dispose())
await bash
const command = "printf 'actual bytes' > /fixture/recorded.txt"
const livePath = join(root, "space and 'quote.txt")
const fork = ctx.plugin(adapter, { command, recordedPath: '/fixture/recorded.txt', livePath })
disposers.push(() => fork.dispose())
await fork
const outcome = await (await ctx.shell.execute(ctx.shell.resolve({ command }))).result()
expect(outcome.timedOut).toBe(false)
expect(outcome.exitCode).toBe(0)
expect(await readFile(livePath, 'utf8')).toBe('actual bytes')
const untouched = await (await ctx.shell.execute(ctx.shell.resolve({ command: "printf '/fixture/recorded.txt'; exit 7" }))).result()
expect(untouched.exitCode).toBe(7)
expect(untouched.stdout.text).toBe('/fixture/recorded.txt')
await fork.dispose()
await rm(livePath)
const restored = await (await ctx.shell.execute(ctx.shell.resolve({ command }))).result()
expect(restored.exitCode).not.toBe(0)
await expect(readFile(livePath)).rejects.toMatchObject({ code: 'ENOENT' })
} finally {
for (const dispose of disposers.reverse()) await dispose()
await rm(root, { recursive: true, force: true })
}
})