import { describe, expect, it } from "vite-plus/test";import type { DesktopUpdateActionResult, DesktopUpdateState } from "@t3tools/contracts"; import { canCheckForUpdate, getArm64IntelBuildWarningDescription, getDesktopUpdateActionError, getDesktopUpdateButtonTooltip, getDesktopUpdateInstallConfirmationMessage, isDesktopUpdateButtonDisabled, resolveDesktopUpdateButtonAction, shouldShowArm64IntelBuildWarning, shouldShowDesktopUpdateButton, shouldToastDesktopUpdateActionResult,} from "./desktopUpdate.logic"; const baseState: DesktopUpdateState = { enabled: true, status: "idle", channel: "latest", currentVersion: "1.0.0", hostArch: "x64", appArch: "x64", runningUnderArm64Translation: false, availableVersion: null, downloadedVersion: null, releaseNotes: [], downloadPercent: null, checkedAt: null, message: null, errorContext: null, canRetry: false,}; describe("desktop update button state", () => { it("shows a download action when an update is available", () => { const state: DesktopUpdateState = { ...baseState, status: "available", availableVersion: "1.1.0", }; expect(shouldShowDesktopUpdateButton(state)).toBe(true); expect(resolveDesktopUpdateButtonAction(state)).toBe("download"); }); it("keeps retry action available after a download error", () => { const state: DesktopUpdateState = { ...baseState, status: "error", availableVersion: "1.1.0", message: "network timeout", errorContext: "download", canRetry: true, }; expect(shouldShowDesktopUpdateButton(state)).toBe(true); expect(resolveDesktopUpdateButtonAction(state)).toBe("download"); expect(getDesktopUpdateButtonTooltip(state)).toContain("Click to retry"); }); it("keeps install action available after an install error", () => { const state: DesktopUpdateState = { ...baseState, status: "error", downloadedVersion: "1.1.0", availableVersion: "1.1.0", message: "shutdown timeout", errorContext: "install", canRetry: true, }; expect(shouldShowDesktopUpdateButton(state)).toBe(true); expect(resolveDesktopUpdateButtonAction(state)).toBe("install"); expect(getDesktopUpdateButtonTooltip(state)).toContain("Click to retry"); }); it("prefers install when a downloaded version already exists", () => { const state: DesktopUpdateState = { ...baseState, status: "available", availableVersion: "1.1.0", downloadedVersion: "1.1.0", }; expect(resolveDesktopUpdateButtonAction(state)).toBe("install"); }); it("hides the button for non-actionable check errors", () => { const state: DesktopUpdateState = { ...baseState, status: "error", message: "network unavailable", errorContext: "check", canRetry: true, }; expect(shouldShowDesktopUpdateButton(state)).toBe(false); expect(resolveDesktopUpdateButtonAction(state)).toBe("none"); }); it("disables the button while downloading", () => { const state: DesktopUpdateState = { ...baseState, status: "downloading", availableVersion: "1.1.0", downloadPercent: 42.5, }; expect(shouldShowDesktopUpdateButton(state)).toBe(true); expect(isDesktopUpdateButtonDisabled(state)).toBe(true); expect(getDesktopUpdateButtonTooltip(state)).toContain("42%"); });}); describe("getDesktopUpdateActionError", () => { it("returns user-visible message for accepted failed attempts", () => { const result: DesktopUpdateActionResult = { accepted: true, completed: false, state: { ...baseState, status: "available", availableVersion: "1.1.0", message: "checksum mismatch", errorContext: "download", canRetry: true, }, }; expect(getDesktopUpdateActionError(result)).toBe("checksum mismatch"); }); it("ignores messages for non-accepted attempts", () => { const result: DesktopUpdateActionResult = { accepted: false, completed: false, state: { ...baseState, status: "error", message: "background failure", errorContext: "check", canRetry: false, }, }; expect(getDesktopUpdateActionError(result)).toBeNull(); }); it("ignores messages for successful attempts", () => { const result: DesktopUpdateActionResult = { accepted: true, completed: true, state: { ...baseState, status: "downloaded", downloadedVersion: "1.1.0", availableVersion: "1.1.0", message: null, errorContext: null, canRetry: true, }, }; expect(getDesktopUpdateActionError(result)).toBeNull(); });}); describe("desktop update UI helpers", () => { it("toasts only for actionable updater errors", () => { expect( shouldToastDesktopUpdateActionResult({ accepted: true, completed: false, state: { ...baseState, message: "checksum mismatch" }, }), ).toBe(true); expect( shouldToastDesktopUpdateActionResult({ accepted: true, completed: false, state: { ...baseState, message: null }, }), ).toBe(false); expect( shouldToastDesktopUpdateActionResult({ accepted: true, completed: true, state: { ...baseState, message: "checksum mismatch" }, }), ).toBe(false); }); it("shows an Apple Silicon warning for Intel builds under Rosetta", () => { const state: DesktopUpdateState = { ...baseState, hostArch: "arm64", appArch: "x64", runningUnderArm64Translation: true, }; expect(shouldShowArm64IntelBuildWarning(state)).toBe(true); expect(getArm64IntelBuildWarningDescription(state)).toContain("Apple Silicon"); expect(getArm64IntelBuildWarningDescription(state)).toContain("Intel build"); }); it("changes the warning copy when a native build update is ready to download", () => { const state: DesktopUpdateState = { ...baseState, hostArch: "arm64", appArch: "x64", runningUnderArm64Translation: true, status: "available", availableVersion: "1.1.0", }; expect(getArm64IntelBuildWarningDescription(state)).toContain("Download the available update"); }); it("includes the downloaded version in the install confirmation copy", () => { expect( getDesktopUpdateInstallConfirmationMessage({ availableVersion: "1.1.0", downloadedVersion: "1.1.1", }), ).toContain("Install update 1.1.1 and restart T3 Code?"); }); it("falls back to generic install confirmation copy when no version is available", () => { expect( getDesktopUpdateInstallConfirmationMessage({ availableVersion: null, downloadedVersion: null, }), ).toContain("Install update and restart T3 Code?"); }); it("warns Windows users that a silent installation can take several minutes", () => { const message = getDesktopUpdateInstallConfirmationMessage( { availableVersion: "1.1.0", downloadedVersion: "1.1.0", }, "Win32", ); expect(message).toContain("may remain closed for several minutes"); expect(message).toContain("no installer window may appear"); expect(message).toContain("will reopen automatically"); }); it("keeps the additional silent installation warning Windows-specific", () => { const message = getDesktopUpdateInstallConfirmationMessage( { availableVersion: "1.1.0", downloadedVersion: "1.1.0", }, "MacIntel", ); expect(message).not.toContain("may remain closed for several minutes"); });}); describe("canCheckForUpdate", () => { it("returns false for null state", () => { expect(canCheckForUpdate(null)).toBe(false); }); it("returns false when updates are disabled", () => { expect(canCheckForUpdate({ ...baseState, enabled: false, status: "disabled" })).toBe(false); }); it("returns false while checking", () => { expect(canCheckForUpdate({ ...baseState, status: "checking" })).toBe(false); }); it("returns false while downloading", () => { expect(canCheckForUpdate({ ...baseState, status: "downloading", downloadPercent: 50 })).toBe( false, ); }); it("returns false once an update has been downloaded", () => { expect( canCheckForUpdate({ ...baseState, status: "downloaded", availableVersion: "1.1.0", downloadedVersion: "1.1.0", }), ).toBe(false); }); it("returns true when idle", () => { expect(canCheckForUpdate({ ...baseState, status: "idle" })).toBe(true); }); it("returns true when up-to-date", () => { expect(canCheckForUpdate({ ...baseState, status: "up-to-date" })).toBe(true); }); it("returns true when an update is available", () => { expect( canCheckForUpdate({ ...baseState, status: "available", availableVersion: "1.1.0" }), ).toBe(true); }); it("returns true on error so the user can retry", () => { expect( canCheckForUpdate({ ...baseState, status: "error", errorContext: "check", message: "network", }), ).toBe(true); });}); describe("getDesktopUpdateButtonTooltip", () => { it("returns 'Up to date' for non-actionable states", () => { expect(getDesktopUpdateButtonTooltip({ ...baseState, status: "idle" })).toBe("Up to date"); expect(getDesktopUpdateButtonTooltip({ ...baseState, status: "up-to-date" })).toBe( "Up to date", ); });});
import { describe, expect, it } from "vite-plus/test";
import type { DesktopUpdateActionResult, DesktopUpdateState } from "@t3tools/contracts";
import {
canCheckForUpdate,
getArm64IntelBuildWarningDescription,
getDesktopUpdateActionError,
getDesktopUpdateButtonTooltip,
getDesktopUpdateInstallConfirmationMessage,
isDesktopUpdateButtonDisabled,
resolveDesktopUpdateButtonAction,
shouldShowArm64IntelBuildWarning,
shouldShowDesktopUpdateButton,
shouldToastDesktopUpdateActionResult,
} from "./desktopUpdate.logic";
const baseState: DesktopUpdateState = {
enabled: true,
status: "idle",
channel: "latest",
currentVersion: "1.0.0",
hostArch: "x64",
appArch: "x64",
runningUnderArm64Translation: false,
availableVersion: null,
downloadedVersion: null,
releaseNotes: [],
downloadPercent: null,
checkedAt: null,
message: null,
errorContext: null,
canRetry: false,
};
describe("desktop update button state", () => {
it("shows a download action when an update is available", () => {
const state: DesktopUpdateState = {
...baseState,
status: "available",
availableVersion: "1.1.0",
};
expect(shouldShowDesktopUpdateButton(state)).toBe(true);
expect(resolveDesktopUpdateButtonAction(state)).toBe("download");
});
it("keeps retry action available after a download error", () => {
const state: DesktopUpdateState = {
...baseState,
status: "error",
availableVersion: "1.1.0",
message: "network timeout",
errorContext: "download",
canRetry: true,
};
expect(shouldShowDesktopUpdateButton(state)).toBe(true);
expect(resolveDesktopUpdateButtonAction(state)).toBe("download");
expect(getDesktopUpdateButtonTooltip(state)).toContain("Click to retry");
});
it("keeps install action available after an install error", () => {
const state: DesktopUpdateState = {
...baseState,
status: "error",
downloadedVersion: "1.1.0",
availableVersion: "1.1.0",
message: "shutdown timeout",
errorContext: "install",
canRetry: true,
};
expect(shouldShowDesktopUpdateButton(state)).toBe(true);
expect(resolveDesktopUpdateButtonAction(state)).toBe("install");
expect(getDesktopUpdateButtonTooltip(state)).toContain("Click to retry");
});
it("prefers install when a downloaded version already exists", () => {
const state: DesktopUpdateState = {
...baseState,
status: "available",
availableVersion: "1.1.0",
downloadedVersion: "1.1.0",
};
expect(resolveDesktopUpdateButtonAction(state)).toBe("install");
});
it("hides the button for non-actionable check errors", () => {
const state: DesktopUpdateState = {
...baseState,
status: "error",
message: "network unavailable",
errorContext: "check",
canRetry: true,
};
expect(shouldShowDesktopUpdateButton(state)).toBe(false);
expect(resolveDesktopUpdateButtonAction(state)).toBe("none");
});
it("disables the button while downloading", () => {
const state: DesktopUpdateState = {
...baseState,
status: "downloading",
availableVersion: "1.1.0",
downloadPercent: 42.5,
};
expect(shouldShowDesktopUpdateButton(state)).toBe(true);
expect(isDesktopUpdateButtonDisabled(state)).toBe(true);
expect(getDesktopUpdateButtonTooltip(state)).toContain("42%");
});
});
describe("getDesktopUpdateActionError", () => {
it("returns user-visible message for accepted failed attempts", () => {
const result: DesktopUpdateActionResult = {
accepted: true,
completed: false,
state: {
...baseState,
status: "available",
availableVersion: "1.1.0",
message: "checksum mismatch",
errorContext: "download",
canRetry: true,
},
};
expect(getDesktopUpdateActionError(result)).toBe("checksum mismatch");
});
it("ignores messages for non-accepted attempts", () => {
const result: DesktopUpdateActionResult = {
accepted: false,
completed: false,
state: {
...baseState,
status: "error",
message: "background failure",
errorContext: "check",
canRetry: false,
},
};
expect(getDesktopUpdateActionError(result)).toBeNull();
});
it("ignores messages for successful attempts", () => {
const result: DesktopUpdateActionResult = {
accepted: true,
completed: true,
state: {
...baseState,
status: "downloaded",
downloadedVersion: "1.1.0",
availableVersion: "1.1.0",
message: null,
errorContext: null,
canRetry: true,
},
};
expect(getDesktopUpdateActionError(result)).toBeNull();
});
});
describe("desktop update UI helpers", () => {
it("toasts only for actionable updater errors", () => {
expect(
shouldToastDesktopUpdateActionResult({
accepted: true,
completed: false,
state: { ...baseState, message: "checksum mismatch" },
}),
).toBe(true);
expect(
shouldToastDesktopUpdateActionResult({
accepted: true,
completed: false,
state: { ...baseState, message: null },
}),
).toBe(false);
expect(
shouldToastDesktopUpdateActionResult({
accepted: true,
completed: true,
state: { ...baseState, message: "checksum mismatch" },
}),
).toBe(false);
});
it("shows an Apple Silicon warning for Intel builds under Rosetta", () => {
const state: DesktopUpdateState = {
...baseState,
hostArch: "arm64",
appArch: "x64",
runningUnderArm64Translation: true,
};
expect(shouldShowArm64IntelBuildWarning(state)).toBe(true);
expect(getArm64IntelBuildWarningDescription(state)).toContain("Apple Silicon");
expect(getArm64IntelBuildWarningDescription(state)).toContain("Intel build");
});
it("changes the warning copy when a native build update is ready to download", () => {
const state: DesktopUpdateState = {
...baseState,
hostArch: "arm64",
appArch: "x64",
runningUnderArm64Translation: true,
status: "available",
availableVersion: "1.1.0",
};
expect(getArm64IntelBuildWarningDescription(state)).toContain("Download the available update");
});
it("includes the downloaded version in the install confirmation copy", () => {
expect(
getDesktopUpdateInstallConfirmationMessage({
availableVersion: "1.1.0",
downloadedVersion: "1.1.1",
}),
).toContain("Install update 1.1.1 and restart T3 Code?");
});
it("falls back to generic install confirmation copy when no version is available", () => {
expect(
getDesktopUpdateInstallConfirmationMessage({
availableVersion: null,
downloadedVersion: null,
}),
).toContain("Install update and restart T3 Code?");
});
it("warns Windows users that a silent installation can take several minutes", () => {
const message = getDesktopUpdateInstallConfirmationMessage(
{
availableVersion: "1.1.0",
downloadedVersion: "1.1.0",
},
"Win32",
);
expect(message).toContain("may remain closed for several minutes");
expect(message).toContain("no installer window may appear");
expect(message).toContain("will reopen automatically");
});
it("keeps the additional silent installation warning Windows-specific", () => {
const message = getDesktopUpdateInstallConfirmationMessage(
{
availableVersion: "1.1.0",
downloadedVersion: "1.1.0",
},
"MacIntel",
);
expect(message).not.toContain("may remain closed for several minutes");
});
});
describe("canCheckForUpdate", () => {
it("returns false for null state", () => {
expect(canCheckForUpdate(null)).toBe(false);
});
it("returns false when updates are disabled", () => {
expect(canCheckForUpdate({ ...baseState, enabled: false, status: "disabled" })).toBe(false);
});
it("returns false while checking", () => {
expect(canCheckForUpdate({ ...baseState, status: "checking" })).toBe(false);
});
it("returns false while downloading", () => {
expect(canCheckForUpdate({ ...baseState, status: "downloading", downloadPercent: 50 })).toBe(
false,
);
});
it("returns false once an update has been downloaded", () => {
expect(
canCheckForUpdate({
...baseState,
status: "downloaded",
availableVersion: "1.1.0",
downloadedVersion: "1.1.0",
}),
).toBe(false);
});
it("returns true when idle", () => {
expect(canCheckForUpdate({ ...baseState, status: "idle" })).toBe(true);
});
it("returns true when up-to-date", () => {
expect(canCheckForUpdate({ ...baseState, status: "up-to-date" })).toBe(true);
});
it("returns true when an update is available", () => {
expect(
canCheckForUpdate({ ...baseState, status: "available", availableVersion: "1.1.0" }),
).toBe(true);
});
it("returns true on error so the user can retry", () => {
expect(
canCheckForUpdate({
...baseState,
status: "error",
errorContext: "check",
message: "network",
}),
).toBe(true);
});
});
describe("getDesktopUpdateButtonTooltip", () => {
it("returns 'Up to date' for non-actionable states", () => {
expect(getDesktopUpdateButtonTooltip({ ...baseState, status: "idle" })).toBe("Up to date");
expect(getDesktopUpdateButtonTooltip({ ...baseState, status: "up-to-date" })).toBe(
"Up to date",
);
});
});