import { describe, expect, it } from "@effect/vitest";import { planCompletedUpdateCheck, planDownloadedUpdate, planFatalAutoInstallOnQuit, planUpdateCheck, statusAfterUpdateError,} from "./updater-state"; describe("updater state decisions", () => { it("auto-prompts when a newer version arrives after the staged version was declined", () => { const decision = planDownloadedUpdate({ stagedVersion: "1.5.27", declinedVersion: "1.5.27", incomingVersion: "1.5.28", trigger: "interval", }); expect(decision).toEqual({ stagedVersion: "1.5.28", declinedVersion: "1.5.27", status: { state: "downloaded", version: "1.5.28" }, promptVersion: "1.5.28", }); }); it("keeps interval checks running without re-prompting the same declined version", () => { const check = planUpdateCheck({ stagedVersion: "1.5.27", trigger: "interval", }); const downloaded = planDownloadedUpdate({ stagedVersion: "1.5.27", declinedVersion: "1.5.27", incomingVersion: "1.5.27", trigger: "interval", }); expect(check).toEqual({ check: true, promptVersionAfterCheck: null }); expect(downloaded.promptVersion).toBeNull(); }); it("manual checks re-check first and then re-prompt the staged version if no newer version wins", () => { const check = planUpdateCheck({ stagedVersion: "1.5.27", trigger: "manual", }); const completedWithoutNewer = planCompletedUpdateCheck({ stagedVersion: check.promptVersionAfterCheck, trigger: "manual", updateAvailable: false, availableVersion: null, }); const completedWithNewer = planCompletedUpdateCheck({ stagedVersion: check.promptVersionAfterCheck, trigger: "manual", updateAvailable: true, availableVersion: "1.5.28", }); expect(check.check).toBe(true); expect(completedWithoutNewer.promptVersion).toBe("1.5.27"); expect(completedWithNewer.promptVersion).toBeNull(); }); it("moves active update failures to error while idle failures stay idle", () => { expect( statusAfterUpdateError( { state: "downloading", version: "1.5.27", percent: 42 }, "Download failed", ), ).toEqual({ state: "error", version: "1.5.27", message: "Download failed", }); expect(statusAfterUpdateError({ state: "idle" }, "Download failed")).toEqual({ state: "idle", }); }); it("restores autoInstallOnAppQuit only when the fatal path recovers", () => { expect( planFatalAutoInstallOnQuit({ packaged: true, retryAfterReset: true, }), ).toEqual({ enableDuringFailure: true, restoreAfterRecovery: true, }); expect( planFatalAutoInstallOnQuit({ packaged: true, retryAfterReset: false, }), ).toEqual({ enableDuringFailure: true, restoreAfterRecovery: false, }); });});
import { describe, expect, it } from "@effect/vitest";
import {
planCompletedUpdateCheck,
planDownloadedUpdate,
planFatalAutoInstallOnQuit,
planUpdateCheck,
statusAfterUpdateError,
} from "./updater-state";
describe("updater state decisions", () => {
it("auto-prompts when a newer version arrives after the staged version was declined", () => {
const decision = planDownloadedUpdate({
stagedVersion: "1.5.27",
declinedVersion: "1.5.27",
incomingVersion: "1.5.28",
trigger: "interval",
});
expect(decision).toEqual({
stagedVersion: "1.5.28",
declinedVersion: "1.5.27",
status: { state: "downloaded", version: "1.5.28" },
promptVersion: "1.5.28",
});
});
it("keeps interval checks running without re-prompting the same declined version", () => {
const check = planUpdateCheck({
stagedVersion: "1.5.27",
trigger: "interval",
});
const downloaded = planDownloadedUpdate({
stagedVersion: "1.5.27",
declinedVersion: "1.5.27",
incomingVersion: "1.5.27",
trigger: "interval",
});
expect(check).toEqual({ check: true, promptVersionAfterCheck: null });
expect(downloaded.promptVersion).toBeNull();
});
it("manual checks re-check first and then re-prompt the staged version if no newer version wins", () => {
const check = planUpdateCheck({
stagedVersion: "1.5.27",
trigger: "manual",
});
const completedWithoutNewer = planCompletedUpdateCheck({
stagedVersion: check.promptVersionAfterCheck,
trigger: "manual",
updateAvailable: false,
availableVersion: null,
});
const completedWithNewer = planCompletedUpdateCheck({
stagedVersion: check.promptVersionAfterCheck,
trigger: "manual",
updateAvailable: true,
availableVersion: "1.5.28",
});
expect(check.check).toBe(true);
expect(completedWithoutNewer.promptVersion).toBe("1.5.27");
expect(completedWithNewer.promptVersion).toBeNull();
});
it("moves active update failures to error while idle failures stay idle", () => {
expect(
statusAfterUpdateError(
{ state: "downloading", version: "1.5.27", percent: 42 },
"Download failed",
),
).toEqual({
state: "error",
version: "1.5.27",
message: "Download failed",
});
expect(statusAfterUpdateError({ state: "idle" }, "Download failed")).toEqual({
state: "idle",
});
});
it("restores autoInstallOnAppQuit only when the fatal path recovers", () => {
expect(
planFatalAutoInstallOnQuit({
packaged: true,
retryAfterReset: true,
}),
).toEqual({
enableDuringFailure: true,
restoreAfterRecovery: true,
});
expect(
planFatalAutoInstallOnQuit({
packaged: true,
retryAfterReset: false,
}),
).toEqual({
enableDuringFailure: true,
restoreAfterRecovery: false,
});
});
});