t3-code-android-nightly/scripts/resolve-nightly-release.test.ts
Julius Marminge eb8f6f42a5
ci(release): build, sign, and publish self-contained CLI archives (#11317)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-09-13 21:24:20 -07:00

135 lines
5.3 KiB
TypeScript

import * as NodeServices from "@effect/platform-node/NodeServices";
import { assert, it } from "@effect/vitest";
import * as Config from "effect/Config";
import * as ConfigProvider from "effect/ConfigProvider";
import * as Effect from "effect/Effect";
import * as FileSystem from "effect/FileSystem";
import * as Path from "effect/Path";
import * as PlatformError from "effect/PlatformError";
import {
readDesktopBaseVersion,
resolveNightlyBaseVersion,
resolveNightlyReleaseMetadata,
resolveNightlyTargetVersion,
writeNightlyReleaseOutput,
} from "./resolve-nightly-release.ts";
it("strips prerelease and build metadata when deriving the nightly base version", () => {
assert.equal(resolveNightlyBaseVersion("0.0.17"), "0.0.17");
assert.equal(resolveNightlyBaseVersion("9.9.9-smoke.0"), "9.9.9");
assert.equal(resolveNightlyBaseVersion("1.2.3-beta.4+build.9"), "1.2.3");
});
it.effect("bumps the patch version before deriving nightly prerelease versions", () =>
Effect.gen(function* () {
assert.equal(yield* resolveNightlyTargetVersion("0.0.17"), "0.0.18");
assert.equal(yield* resolveNightlyTargetVersion("9.9.9-smoke.0"), "9.9.10");
assert.equal(yield* resolveNightlyTargetVersion("1.2.3-beta.4+build.9"), "1.2.4");
}),
);
it.effect("reports the invalid desktop package version", () =>
Effect.gen(function* () {
const error = yield* resolveNightlyTargetVersion("nightly").pipe(Effect.flip);
assert.equal(error._tag, "InvalidDesktopPackageVersionError");
assert.equal(error.version, "nightly");
assert.equal(error.message, "Invalid desktop package version 'nightly'.");
}),
);
it("derives nightly metadata including the short commit sha in the release name", () => {
assert.deepStrictEqual(
resolveNightlyReleaseMetadata("9.9.10", "20260413", 321, "abcdef1234567890"),
{
baseVersion: "9.9.10",
version: "9.9.10-nightly.20260413.321",
tag: "v9.9.10-nightly.20260413.321",
name: "T3 Code Nightly 9.9.10-nightly.20260413.321 (abcdef123456)",
shortSha: "abcdef123456",
},
);
});
it("derives preview metadata under its own prerelease identifier", () => {
assert.deepStrictEqual(
resolveNightlyReleaseMetadata("9.9.10", "20260413", 321, "abcdef1234567890", "preview"),
{
baseVersion: "9.9.10",
version: "9.9.10-preview.20260413.321",
tag: "v9.9.10-preview.20260413.321",
name: "T3 Code Preview (maintainer test build, do not install) 9.9.10-preview.20260413.321 (abcdef123456)",
shortSha: "abcdef123456",
},
);
});
it.effect("preserves the GITHUB_OUTPUT configuration cause", () => {
const metadata = resolveNightlyReleaseMetadata("1.2.4", "20260620", 42, "abcdef1234567890");
const configCause = new ConfigProvider.SourceError({ message: "environment unavailable" });
return Effect.gen(function* () {
const configError = yield* writeNightlyReleaseOutput(metadata, true).pipe(
Effect.provideService(FileSystem.FileSystem, FileSystem.makeNoop({})),
Effect.provideService(
ConfigProvider.ConfigProvider,
ConfigProvider.make(() => Effect.fail(configCause)),
),
Effect.flip,
);
if (configError._tag !== "NightlyReleaseGitHubOutputConfigError") {
return assert.fail(`Unexpected error: ${configError._tag}`);
}
assert.instanceOf(configError.cause, Config.ConfigError);
assert.strictEqual(configError.cause.cause, configCause);
assert.notInclude(configError.message, configCause.message);
});
});
it.layer(NodeServices.layer)("readDesktopBaseVersion", (it) => {
it.effect("preserves desktop package read context and its platform cause", () =>
Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
const path = yield* Path.Path;
const rootDir = yield* fs.makeTempDirectoryScoped({
prefix: "resolve-nightly-release-read-",
});
const packageJsonPath = path.join(rootDir, "apps/desktop/package.json");
const error = yield* readDesktopBaseVersion(rootDir).pipe(Effect.flip);
if (error._tag !== "NightlyReleaseDesktopPackageError") {
return assert.fail(`Unexpected error: ${error._tag}`);
}
assert.equal(error.operation, "read");
assert.equal(error.packageJsonPath, packageJsonPath);
assert.instanceOf(error.cause, PlatformError.PlatformError);
assert.notInclude(error.message, String((error.cause as Error).message));
}),
);
it.effect("preserves desktop package decode context and its schema cause", () =>
Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
const path = yield* Path.Path;
const rootDir = yield* fs.makeTempDirectoryScoped({
prefix: "resolve-nightly-release-decode-",
});
const packageJsonPath = path.join(rootDir, "apps/desktop/package.json");
yield* fs.makeDirectory(path.dirname(packageJsonPath), { recursive: true });
yield* fs.writeFileString(packageJsonPath, "{");
const error = yield* readDesktopBaseVersion(rootDir).pipe(Effect.flip);
if (error._tag !== "NightlyReleaseDesktopPackageError") {
return assert.fail(`Unexpected error: ${error._tag}`);
}
assert.equal(error.operation, "decode");
assert.equal(error.packageJsonPath, packageJsonPath);
assert.ok(error.cause !== undefined);
assert.notInclude(error.message, String((error.cause as Error).message));
}),
);
});