fix(cli): respect platform shell for --on-complete
This commit is contained in:
@@ -4,6 +4,9 @@ import * as loggerModule from "../../shared/logger"
|
||||
import { executeOnCompleteHook } from "./on-complete-hook"
|
||||
|
||||
describe("executeOnCompleteHook", () => {
|
||||
let originalPlatform: NodeJS.Platform
|
||||
let originalEnv: Record<string, string | undefined>
|
||||
|
||||
function createStream(text: string): ReadableStream<Uint8Array> | undefined {
|
||||
if (text.length === 0) {
|
||||
return undefined
|
||||
@@ -31,15 +34,32 @@ describe("executeOnCompleteHook", () => {
|
||||
let logSpy: ReturnType<typeof spyOn<typeof loggerModule, "log">>
|
||||
|
||||
beforeEach(() => {
|
||||
originalPlatform = process.platform
|
||||
originalEnv = {
|
||||
SHELL: process.env.SHELL,
|
||||
PSModulePath: process.env.PSModulePath,
|
||||
ComSpec: process.env.ComSpec,
|
||||
}
|
||||
logSpy = spyOn(loggerModule, "log").mockImplementation(() => {})
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
Object.defineProperty(process, "platform", { value: originalPlatform })
|
||||
for (const [key, value] of Object.entries(originalEnv)) {
|
||||
if (value !== undefined) {
|
||||
process.env[key] = value
|
||||
} else {
|
||||
delete process.env[key]
|
||||
}
|
||||
}
|
||||
logSpy.mockRestore()
|
||||
})
|
||||
|
||||
it("executes command with correct env vars", async () => {
|
||||
it("uses sh on unix shells and passes correct env vars", async () => {
|
||||
// given
|
||||
Object.defineProperty(process, "platform", { value: "linux" })
|
||||
process.env.SHELL = "/bin/bash"
|
||||
delete process.env.PSModulePath
|
||||
const spawnSpy = spyOn(spawnWithWindowsHideModule, "spawnWithWindowsHide").mockReturnValue(createProc(0))
|
||||
|
||||
try {
|
||||
@@ -68,6 +88,82 @@ describe("executeOnCompleteHook", () => {
|
||||
}
|
||||
})
|
||||
|
||||
it("uses powershell when PowerShell is detected on Windows", async () => {
|
||||
// given
|
||||
Object.defineProperty(process, "platform", { value: "win32" })
|
||||
process.env.PSModulePath = "C:\\Program Files\\PowerShell\\Modules"
|
||||
delete process.env.SHELL
|
||||
const spawnSpy = spyOn(spawnWithWindowsHideModule, "spawnWithWindowsHide").mockReturnValue(createProc(0))
|
||||
|
||||
try {
|
||||
// when
|
||||
await executeOnCompleteHook({
|
||||
command: "Write-Host done",
|
||||
sessionId: "session-123",
|
||||
exitCode: 0,
|
||||
durationMs: 5000,
|
||||
messageCount: 10,
|
||||
})
|
||||
|
||||
// then
|
||||
const [args] = spawnSpy.mock.calls[0] as Parameters<typeof spawnWithWindowsHideModule.spawnWithWindowsHide>
|
||||
expect(args).toEqual(["powershell.exe", "-NoProfile", "-Command", "Write-Host done"])
|
||||
} finally {
|
||||
spawnSpy.mockRestore()
|
||||
}
|
||||
})
|
||||
|
||||
it("uses pwsh when PowerShell is detected on non-Windows platforms", async () => {
|
||||
// given
|
||||
Object.defineProperty(process, "platform", { value: "linux" })
|
||||
process.env.PSModulePath = "/usr/local/share/powershell/Modules"
|
||||
delete process.env.SHELL
|
||||
const spawnSpy = spyOn(spawnWithWindowsHideModule, "spawnWithWindowsHide").mockReturnValue(createProc(0))
|
||||
|
||||
try {
|
||||
// when
|
||||
await executeOnCompleteHook({
|
||||
command: "Write-Host done",
|
||||
sessionId: "session-123",
|
||||
exitCode: 0,
|
||||
durationMs: 5000,
|
||||
messageCount: 10,
|
||||
})
|
||||
|
||||
// then
|
||||
const [args] = spawnSpy.mock.calls[0] as Parameters<typeof spawnWithWindowsHideModule.spawnWithWindowsHide>
|
||||
expect(args).toEqual(["pwsh", "-NoProfile", "-Command", "Write-Host done"])
|
||||
} finally {
|
||||
spawnSpy.mockRestore()
|
||||
}
|
||||
})
|
||||
|
||||
it("falls back to cmd.exe on Windows when PowerShell is not detected", async () => {
|
||||
// given
|
||||
Object.defineProperty(process, "platform", { value: "win32" })
|
||||
delete process.env.PSModulePath
|
||||
delete process.env.SHELL
|
||||
process.env.ComSpec = "C:\\Windows\\System32\\cmd.exe"
|
||||
const spawnSpy = spyOn(spawnWithWindowsHideModule, "spawnWithWindowsHide").mockReturnValue(createProc(0))
|
||||
|
||||
try {
|
||||
// when
|
||||
await executeOnCompleteHook({
|
||||
command: "echo done",
|
||||
sessionId: "session-123",
|
||||
exitCode: 0,
|
||||
durationMs: 5000,
|
||||
messageCount: 10,
|
||||
})
|
||||
|
||||
// then
|
||||
const [args] = spawnSpy.mock.calls[0] as Parameters<typeof spawnWithWindowsHideModule.spawnWithWindowsHide>
|
||||
expect(args).toEqual(["C:\\Windows\\System32\\cmd.exe", "/d", "/s", "/c", "echo done"])
|
||||
} finally {
|
||||
spawnSpy.mockRestore()
|
||||
}
|
||||
})
|
||||
|
||||
it("env var values are strings", async () => {
|
||||
// given
|
||||
const spawnSpy = spyOn(spawnWithWindowsHideModule, "spawnWithWindowsHide").mockReturnValue(createProc(0))
|
||||
|
||||
Reference in New Issue
Block a user