Skip to content
Source
Sign inSign up

ServerEnvironmentLabel.test.ts

52 lines1.9 KB

1import { assert, it } from "@effect/vitest";
2import * as HostProcess from "@t3tools/shared/HostProcess";
3import * as Effect from "effect/Effect";
4import * as Fiber from "effect/Fiber";
5import * as FileSystem from "effect/FileSystem";
6import * as Layer from "effect/Layer";
7import * as Sink from "effect/Sink";
8import * as Stream from "effect/Stream";
9import * as TestClock from "effect/testing/TestClock";
10import { ChildProcessSpawner } from "effect/process";
11​
12import * as ProcessRunner from "../processRunner.ts";
13import { resolveServerEnvironmentLabel } from "./ServerEnvironmentLabel.ts";
14​
15const neverExits = ChildProcessSpawner.make(() =>
16 Effect.succeed(
17 ChildProcessSpawner.makeHandle({
18 pid: ChildProcessSpawner.ProcessId(1),
19 exitCode: Effect.never,
20 isRunning: Effect.succeed(true),
21 kill: () => Effect.void,
22 unref: Effect.succeed(Effect.void),
23 stdin: Sink.drain,
24 stdout: Stream.never,
25 stderr: Stream.never,
26 all: Stream.empty,
27 getInputFd: () => Sink.drain,
28 getOutputFd: () => Stream.empty,
29 }),
30 ),
31);
32​
33it.effect("falls back to the hostname when hostnamectl never answers", () =>
34 Effect.gen(function* () {
35 // Without /etc/machine-info the label comes from hostnamectl, which waits on D-Bus.
36 const label = yield* resolveServerEnvironmentLabel({ cwdBaseName: "project" }).pipe(
37 Effect.provideService(HostProcess.Platform, "linux"),
38 Effect.provideService(HostProcess.Hostname, "devbox"),
39 Effect.provide(
40 Layer.mergeAll(
41 FileSystem.layerNoop({ exists: () => Effect.succeed(false) }),
42 ProcessRunner.layer.pipe(
43 Layer.provide(Layer.succeed(ChildProcessSpawner.ChildProcessSpawner, neverExits)),
44 ),
45 ),
46 ),
47 Effect.forkChild,
48 );
49 yield* TestClock.adjust("5 seconds");
50 assert.equal(yield* Fiber.join(label), "devbox");
51 }),
52);