authorgravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-08-05 22:35:52-07:00
committergravatar for me@theo.liTheo Browne <me@theo.li> 2026-08-06 08:09:51-04:00
log8f341f20c91e708de1dab949dbd723e86f2ff328
treed32b2d7b40876f659e455cd65f76104a1fe6d53a
parent808d6853555c8b57f414a06e0a79eb1b9e192ef5

test(server): use the launcher state writer in release tests

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

1 files changed, 25 insertions(+), 14 deletions(-)

apps/server/src/cloud/http.test.ts+25-14
......@@ -1,7 +1,7 @@
11import * as NodeServices from "@effect/platform-node/NodeServices";
22import { describe, expect, it } from "@effect/vitest";
33import * as Effect from "effect/Effect";
4import * as FileSystem from "effect/FileSystem";
4import * as Layer from "effect/Layer";
55import * as Option from "effect/Option";
66import * as Path from "effect/Path";
77import * as PlatformError from "effect/PlatformError";
......@@ -18,6 +18,12 @@ import { RelayClientTracer } from "@t3tools/shared/relayTracing";
1818import * as EnvironmentAuth from "../auth/EnvironmentAuth.ts";
1919import * as ServerSecretStore from "../auth/ServerSecretStore.ts";
2020import * as ServerConfigModule from "../config.ts";
21import { writeServiceState } from "../serviceLauncher.ts";
22import {
23 SERVICE_LAUNCHER_PROTOCOL,
24 SERVICE_STATE_FILE,
25 type ServiceUpdateRecord,
26} from "./serviceProtocol.ts";
2127import * as ServerEnvironment from "../environment/ServerEnvironment.ts";
2228import { CLOUD_CLI_DESIRED_LINK_SECRET } from "./CliState.ts";
2329import * as CliTokenManager from "./CliTokenManager.ts";
......@@ -259,18 +265,20 @@ describe("releaseManagedTunnelOnShutdown", () => {
259265 readonly respond?: () => Response;
260266 }
261267
262 // Writes the launcher's durable state file into this test's baseDir; the
263 // release reads it to detect an in-flight update handoff.
264 const writeServiceState = (update: Record<string, unknown>) =>
268 // Writes the launcher's durable state file into this test's baseDir with
269 // the launcher's own writer; the release reads it to detect an in-flight
270 // update handoff.
271 const writeLauncherState = (update: ServiceUpdateRecord) =>
265272 Effect.gen(function* () {
266 const fs = yield* FileSystem.FileSystem;
267273 const path = yield* Path.Path;
268274 const config = yield* ServerConfigModule.ServerConfig;
269 const statePath = path.join(config.baseDir, "runtime", "service-state.json");
270 yield* fs.makeDirectory(path.dirname(statePath), { recursive: true });
271 yield* fs.writeFileString(
272 statePath,
273 JSON.stringify({ version: 1, activeVersion: "0.0.30", update }),
275 const statePath = path.join(config.baseDir, "runtime", SERVICE_STATE_FILE);
276 yield* Effect.promise(() =>
277 writeServiceState(statePath, {
278 protocol: SERVICE_LAUNCHER_PROTOCOL,
279 activeVersion: "0.0.30",
280 update,
281 }),
274282 );
275283 });
276284
......@@ -326,8 +334,11 @@ describe("releaseManagedTunnelOnShutdown", () => {
326334 ),
327335 // The release consults the launcher state file under the configured
328336 // baseDir, so every harness run gets a scoped temp baseDir.
329 Effect.provide(ServerConfigModule.layerTest("/", { prefix: "t3-http-release-test-" })),
330 Effect.provide(NodeServices.layer),
337 Effect.provide(
338 ServerConfigModule.layerTest("/", { prefix: "t3-http-release-test-" }).pipe(
339 Layer.provideMerge(NodeServices.layer),
340 ),
341 ),
331342 Effect.scoped,
332343 );
333344
......@@ -419,7 +430,7 @@ describe("releaseManagedTunnelOnShutdown", () => {
419430 const requests: Array<HttpClientRequest.HttpClientRequest> = [];
420431
421432 return Effect.gen(function* () {
422 yield* writeServiceState({
433 yield* writeLauncherState({
423434 id: "update-1",
424435 fromVersion: "0.0.30",
425436 targetVersion: "0.0.31",
......@@ -446,7 +457,7 @@ describe("releaseManagedTunnelOnShutdown", () => {
446457 const requests: Array<HttpClientRequest.HttpClientRequest> = [];
447458
448459 return Effect.gen(function* () {
449 yield* writeServiceState({
460 yield* writeLauncherState({
450461 id: "update-1",
451462 fromVersion: "0.0.30",
452463 targetVersion: "0.0.31",