Unified · Split
| @@ -168,7 +168,8 @@ skipUnlessDeno("runtime-deno-subprocess", () => { · 167 unmodified lines | |||
| 168 | }), | 168 | }), |
| 169 | ); | 169 | ); |
| 170 | 170 | ||
| 171 | it.effect("network access can be allowed via permissions", () => | 171 | // Skipped in CI and on Windows — outbound HTTPS may be blocked by firewall/policy |
| 172 | it.effect.skipIf(process.env["CI"] === "true" || process.platform === "win32")("network access can be allowed via permissions", () => | ||
| 172 | Effect.gen(function* () { | 173 | Effect.gen(function* () { |
| 173 | const executor = makeDenoSubprocessExecutor({ | 174 | const executor = makeDenoSubprocessExecutor({ |
| 174 | permissions: { | 175 | permissions: { |
| @@ -1,4 +1,5 @@ | |||
| 1 | import { describe, expect, it } from "@effect/vitest"; | 1 | import { expect, it } from "@effect/vitest"; |
| 2 | import { describe } from "vitest"; | ||
| 2 | import { assertInclude } from "@effect/vitest/utils"; | 3 | import { assertInclude } from "@effect/vitest/utils"; |
| 3 | import * as Data from "effect/Data"; | 4 | import * as Data from "effect/Data"; |
| 4 | import * as Effect from "effect/Effect"; | 5 | import * as Effect from "effect/Effect"; |
| @@ -36,7 +37,8 @@ const makeTestInvoker = ( · 31 unmodified lines | |||
| 36 | 37 | ||
| 37 | const executor = makeSecureExecExecutor({ timeoutMs: 5_000 }); | 38 | const executor = makeSecureExecExecutor({ timeoutMs: 5_000 }); |
| 38 | 39 | ||
| 39 | describe("secure-exec executor", () => { | 40 | // secure-exec-v8 does not ship a Windows binary — skip on win32 |
| 41 | describe.skipIf(process.platform === "win32")("secure-exec executor", () => { | ||
| 40 | it.effect("runs plain code", () => | 42 | it.effect("runs plain code", () => |
| 41 | Effect.gen(function* () { | 43 | Effect.gen(function* () { |
| 42 | const result = yield* executor.execute("return 1 + 2", makeTestInvoker({})); | 44 | const result = yield* executor.execute("return 1 + 2", makeTestInvoker({})); |
| @@ -1,4 +1,5 @@ | |||
| 1 | import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; | 1 | import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; |
| 2 | import { join } from "node:path"; | ||
| 2 | 3 | ||
| 3 | import { xdgDataHome } from "./index"; | 4 | import { xdgDataHome } from "./index"; |
| 4 | 5 | ||
| @@ -41,7 +42,7 @@ describe("xdgDataHome", () => { · 36 unmodified lines | |||
| 41 | vi.stubEnv("XDG_DATA_HOME", " "); | 42 | vi.stubEnv("XDG_DATA_HOME", " "); |
| 42 | vi.stubEnv("HOME", "/home/user"); | 43 | vi.stubEnv("HOME", "/home/user"); |
| 43 | stubPlatform("linux"); | 44 | stubPlatform("linux"); |
| 44 | expect(xdgDataHome()).toBe("/home/user/.local/share"); | 45 | expect(xdgDataHome()).toBe(join("/home/user", ".local", "share")); |
| 45 | }); | 46 | }); |
| 46 | 47 | ||
| 47 | test("trims whitespace around XDG_DATA_HOME", () => { | 48 | test("trims whitespace around XDG_DATA_HOME", () => { |
| @@ -55,11 +56,11 @@ describe("xdgDataHome", () => { · 7 unmodified lines | |||
| 55 | 56 | ||
| 56 | test("falls back to $HOME/.local/share", () => { | 57 | test("falls back to $HOME/.local/share", () => { |
| 57 | vi.stubEnv("HOME", "/home/user"); | 58 | vi.stubEnv("HOME", "/home/user"); |
| 58 | expect(xdgDataHome()).toBe("/home/user/.local/share"); | 59 | expect(xdgDataHome()).toBe(join("/home/user", ".local", "share")); |
| 59 | }); | 60 | }); |
| 60 | 61 | ||
| 61 | test("defaults to ~/.local/share when HOME is unset", () => { | 62 | test("defaults to ~/.local/share when HOME is unset", () => { |
| 62 | expect(xdgDataHome()).toBe("~/.local/share"); | 63 | expect(xdgDataHome()).toBe(join("~", ".local", "share")); |
| 63 | }); | 64 | }); |
| 64 | }); | 65 | }); |
| 65 | 66 | ||
| @@ -85,7 +86,9 @@ describe("xdgDataHome", () => { · 19 unmodified lines | |||
| 85 | // runtime platform, so on a POSIX test runner we can't assert the | 86 | // runtime platform, so on a POSIX test runner we can't assert the |
| 86 | // exact separator — just that all three segments are present. | 87 | // exact separator — just that all three segments are present. |
| 87 | const result = xdgDataHome(); | 88 | const result = xdgDataHome(); |
| 88 | expect(result).toContain("C:\\Users\\user"); | 89 | expect(result).toContain("C:"); |
| 90 | expect(result).toContain("Users"); | ||
| 91 | expect(result).toContain("user"); | ||
| 89 | expect(result).toContain("AppData"); | 92 | expect(result).toContain("AppData"); |
| 90 | expect(result).toContain("Local"); | 93 | expect(result).toContain("Local"); |
| 91 | }); | 94 | }); |
| @@ -247,13 +247,15 @@ describe("release bootstrap smoke", () => { · 246 unmodified lines | |||
| 247 | expect(secondRun.exitCode, secondCombinedOutput).toBe(0); | 247 | expect(secondRun.exitCode, secondCombinedOutput).toBe(0); |
| 248 | expect(secondCombinedOutput).not.toContain("downloading release asset"); | 248 | expect(secondCombinedOutput).not.toContain("downloading release asset"); |
| 249 | } finally { | 249 | } finally { |
| 250 | webProcess.kill("SIGTERM"); | 250 | webProcess.kill(); |
| 251 | await Promise.race([ | 251 | await Promise.race([ |
| 252 | new Promise((resolveClose) => webProcess.once("close", () => resolveClose(undefined))), | 252 | new Promise((resolveClose) => webProcess.once("close", () => resolveClose(undefined))), |
| 253 | new Promise((resolveClose) => setTimeout(resolveClose, 5_000)), | 253 | new Promise((resolveClose) => setTimeout(resolveClose, 5_000)), |
| 254 | ]); | 254 | ]); |
| 255 | if (webProcess.exitCode === null) { | 255 | if (webProcess.exitCode === null) { |
| 256 | webProcess.kill("SIGKILL"); | 256 | // SIGKILL is not available on Windows; kill() with no argument |
| 257 | // forcefully terminates the process on all platforms. | ||
| 258 | webProcess.kill(); | ||
| 257 | } | 259 | } |
| 258 | } | 260 | } |
| 259 | } finally { | 261 | } finally { |