refactor js test logging

This commit is contained in:
Caelan
2024-10-07 11:46:52 -06:00
parent 8c7138d250
commit e55a11ab3a
3 changed files with 229 additions and 212 deletions

View File

@@ -7,88 +7,81 @@ import {
setVelopackLogger,
} from "../src";
import path from "path";
import {tempd3, fixture, updateExe, shortDelay} from "./helper";
import {tempd3, fixture, updateExe, captureLogs} from "./helper";
function testInit() {
VelopackApp.build().run();
setVelopackLogger((level, msg) => {
console.log(level, msg);
});
}
test("UpdateManager detects local update", async () => {
await captureLogs(async () => {
await tempd3(async (tmpDir, packagesDir, rootDir) => {
const locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
CurrentBinaryDir: path.join(rootDir, "current"),
IsPortable: true,
};
test("UpdateManager detects local update", () => {
return tempd3(async (tmpDir, packagesDir, rootDir) => {
testInit();
const locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
CurrentBinaryDir: path.join(rootDir, "current"),
IsPortable: true,
};
const options: UpdateOptions = {
ExplicitChannel: "beta",
AllowVersionDowngrade: false,
};
const options: UpdateOptions = {
ExplicitChannel: "beta",
AllowVersionDowngrade: false,
};
const um = new UpdateManager(tmpDir, options, locator);
copyFileSync(
fixture("testfeed.json"),
path.join(tmpDir, "releases.beta.json"),
);
const update = await um.checkForUpdatesAsync();
const um = new UpdateManager(tmpDir, options, locator);
copyFileSync(
fixture("testfeed.json"),
path.join(tmpDir, "releases.beta.json"),
);
const update = await um.checkForUpdatesAsync();
expect(update).not.toBeNull();
expect(update?.TargetFullRelease).not.toBeNull();
expect(update?.TargetFullRelease?.Version).toBe("1.0.11");
expect(update?.TargetFullRelease?.FileName).toBe(
"AvaloniaCrossPlat-1.0.11-full.nupkg",
);
await shortDelay();
});
});
test("UpdateManager downloads full update", () => {
return tempd3(async (feedDir, packagesDir, rootDir) => {
testInit();
const locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
CurrentBinaryDir: path.join(rootDir, "current"),
IsPortable: true,
};
const options: UpdateOptions = {
ExplicitChannel: "beta",
AllowVersionDowngrade: false,
};
const um = new UpdateManager(feedDir, options, locator);
copyFileSync(
fixture("testfeed.json"),
path.join(feedDir, "releases.beta.json"),
);
copyFileSync(
fixture("AvaloniaCrossPlat-1.0.11-win-full.nupkg"),
path.join(feedDir, "AvaloniaCrossPlat-1.0.11-full.nupkg"),
);
const update = await um.checkForUpdatesAsync();
console.log(
`about to download update from ${feedDir} to ${packagesDir} ...`,
);
await um.downloadUpdateAsync(update!, () => {
expect(update).not.toBeNull();
expect(update?.TargetFullRelease).not.toBeNull();
expect(update?.TargetFullRelease?.Version).toBe("1.0.11");
expect(update?.TargetFullRelease?.FileName).toBe(
"AvaloniaCrossPlat-1.0.11-full.nupkg",
);
});
});
});
test("UpdateManager downloads full update", async () => {
await captureLogs(async () => {
await tempd3(async (feedDir, packagesDir, rootDir) => {
const locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
CurrentBinaryDir: path.join(rootDir, "current"),
IsPortable: true,
};
const options: UpdateOptions = {
ExplicitChannel: "beta",
AllowVersionDowngrade: false,
};
const um = new UpdateManager(feedDir, options, locator);
copyFileSync(
fixture("testfeed.json"),
path.join(feedDir, "releases.beta.json"),
);
copyFileSync(
fixture("AvaloniaCrossPlat-1.0.11-win-full.nupkg"),
path.join(feedDir, "AvaloniaCrossPlat-1.0.11-full.nupkg"),
);
const update = await um.checkForUpdatesAsync();
console.log(
`about to download update from ${feedDir} to ${packagesDir} ...`,
);
await um.downloadUpdateAsync(update!, () => {
});
expect(
existsSync(path.join(packagesDir, "AvaloniaCrossPlat-1.0.11-full.nupkg")),
).toBe(true);
});
expect(
existsSync(path.join(packagesDir, "AvaloniaCrossPlat-1.0.11-full.nupkg")),
).toBe(true);
await shortDelay();
});
});

View File

@@ -1,131 +1,129 @@
import { VelopackApp, VelopackLocatorConfig, setVelopackLogger } from "../src";
import { shortDelay, isWindows } from "./helper";
import {VelopackApp, VelopackLocatorConfig, setVelopackLogger} from "../src";
import {isWindows, captureLogs} from "./helper";
class HookTester {
public afterInstall = false;
public beforeUninstall = false;
public beforeUpdate = false;
public afterUpdate = false;
public restarted = false;
public firstRun = false;
public version = "";
public afterInstall = false;
public beforeUninstall = false;
public beforeUpdate = false;
public afterUpdate = false;
public restarted = false;
public firstRun = false;
public version = "";
static build(): [VelopackApp, HookTester] {
let tester = new HookTester();
let builder = VelopackApp.build();
builder.onAfterInstallFastCallback((ver) => {
tester.afterInstall = true;
tester.version = ver;
});
builder.onBeforeUninstallFastCallback((ver) => {
tester.beforeUninstall = true;
tester.version = ver;
});
builder.onBeforeUpdateFastCallback((ver) => {
tester.beforeUpdate = true;
tester.version = ver;
});
builder.onAfterUpdateFastCallback((ver) => {
tester.afterUpdate = true;
tester.version = ver;
});
builder.onRestarted((ver) => {
tester.restarted = true;
tester.version = ver;
});
builder.onFirstRun((ver) => {
tester.firstRun = true;
tester.version = ver;
});
setVelopackLogger((level, msg) => {
console.log(level, msg);
});
return [builder, tester];
}
static build(): [VelopackApp, HookTester] {
let tester = new HookTester();
let builder = VelopackApp.build();
builder.onAfterInstallFastCallback((ver) => {
tester.afterInstall = true;
tester.version = ver;
});
builder.onBeforeUninstallFastCallback((ver) => {
tester.beforeUninstall = true;
tester.version = ver;
});
builder.onBeforeUpdateFastCallback((ver) => {
tester.beforeUpdate = true;
tester.version = ver;
});
builder.onAfterUpdateFastCallback((ver) => {
tester.afterUpdate = true;
tester.version = ver;
});
builder.onRestarted((ver) => {
tester.restarted = true;
tester.version = ver;
});
builder.onFirstRun((ver) => {
tester.firstRun = true;
tester.version = ver;
});
return [builder, tester];
}
}
test("VelopackApp should handle restarted event", async () => {
let [builder, tester] = HookTester.build();
let locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: "",
RootAppDir: "",
UpdateExePath: "",
CurrentBinaryDir: "",
IsPortable: true,
};
builder.setLocator(locator).run();
await captureLogs(async () => {
let [builder, tester] = HookTester.build();
let locator: VelopackLocatorConfig = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: "",
RootAppDir: "",
UpdateExePath: "",
CurrentBinaryDir: "",
IsPortable: true,
};
builder.setLocator(locator).run();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(true);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.0.0");
await shortDelay();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(true);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.0.0");
});
});
test("VelopackApp should handle after-install hook", async () => {
if (!isWindows()) return;
if (!isWindows()) return;
await captureLogs(async () => {
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-install", "1.2.3-test.4"]).run();
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-install", "1.2.3-test.4"]).run();
expect(tester.afterInstall).toBe(true);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test.4");
await shortDelay();
expect(tester.afterInstall).toBe(true);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test.4");
});
});
test("VelopackApp should handle before-uninstall hook", async () => {
if (!isWindows()) return;
if (!isWindows()) return;
await captureLogs(async () => {
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-uninstall", "1.2.3-test"]).run();
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-uninstall", "1.2.3-test"]).run();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(true);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test");
await shortDelay();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(true);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test");
});
});
test("VelopackApp should handle after-update hook", async () => {
if (!isWindows()) return;
if (!isWindows()) return;
await captureLogs(async () => {
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-updated", "1.2.3"]).run();
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-updated", "1.2.3"]).run();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(true);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3");
await shortDelay();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(false);
expect(tester.afterUpdate).toBe(true);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3");
});
});
test("VelopackApp should handle before-update hook", async () => {
if (!isWindows()) return;
if (!isWindows()) return;
await captureLogs(async () => {
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-obsolete", "1.2.3-test.4"]).run();
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-obsolete", "1.2.3-test.4"]).run();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(true);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test.4");
await shortDelay();
expect(tester.afterInstall).toBe(false);
expect(tester.beforeUninstall).toBe(false);
expect(tester.beforeUpdate).toBe(true);
expect(tester.afterUpdate).toBe(false);
expect(tester.restarted).toBe(false);
expect(tester.firstRun).toBe(false);
expect(tester.version).toBe("1.2.3-test.4");
});
});

View File

@@ -1,6 +1,7 @@
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import {setVelopackLogger} from "../lib";
export function isWindows(): boolean {
return os.platform() == "win32";
@@ -35,6 +36,21 @@ export function makeId(length: number): string {
return result;
}
export async function captureLogs<T>(cb: () => Promise<T>): Promise<T> {
setVelopackLogger((level, msg) => {
console.log(level, msg);
});
try {
return await cb();
} finally {
await shortDelay();
setVelopackLogger(() => {
// unhook logger from jest
});
}
}
// export function tempd1<T>(cb: (dir: string) => T): T {
// const id = makeId(10);
// const dir = path.join(os.tmpdir(), id);
@@ -60,7 +76,7 @@ export function makeId(length: number): string {
// }
export async function tempd3<T>(
cb: (dir1: string, dir2: string, dir3: string) => T,
cb: (dir1: string, dir2: string, dir3: string) => Promise<T>,
): Promise<T> {
const dir1 = path.join(os.tmpdir(), makeId(16));
const dir2 = path.join(os.tmpdir(), makeId(16));
@@ -77,30 +93,30 @@ export async function tempd3<T>(
}
}
export async function tempd4<T>(
cb: (dir1: string, dir2: string, dir3: string, dir4: string) => T,
): Promise<T> {
const dir1 = path.join(os.tmpdir(), makeId(16));
const dir2 = path.join(os.tmpdir(), makeId(16));
const dir3 = path.join(os.tmpdir(), makeId(16));
const dir4 = path.join(os.tmpdir(), makeId(16));
fs.mkdirSync(dir1);
fs.mkdirSync(dir2);
fs.mkdirSync(dir3);
fs.mkdirSync(dir4);
try {
return await cb(dir1, dir2, dir3, dir4);
} finally {
fs.rmSync(dir1, {recursive: true});
fs.rmSync(dir2, {recursive: true});
fs.rmSync(dir3, {recursive: true});
fs.rmSync(dir4, {recursive: true});
}
}
// export async function tempd4<T>(
// cb: (dir1: string, dir2: string, dir3: string, dir4: string) => T,
// ): Promise<T> {
// const dir1 = path.join(os.tmpdir(), makeId(16));
// const dir2 = path.join(os.tmpdir(), makeId(16));
// const dir3 = path.join(os.tmpdir(), makeId(16));
// const dir4 = path.join(os.tmpdir(), makeId(16));
// fs.mkdirSync(dir1);
// fs.mkdirSync(dir2);
// fs.mkdirSync(dir3);
// fs.mkdirSync(dir4);
// try {
// return await cb(dir1, dir2, dir3, dir4);
// } finally {
// fs.rmSync(dir1, {recursive: true});
// fs.rmSync(dir2, {recursive: true});
// fs.rmSync(dir3, {recursive: true});
// fs.rmSync(dir4, {recursive: true});
// }
// }
export function updateExe(): string {
const paths = [];
if (isMacos()) {
paths.push(path.join("..", "..", "target", "release", "UpdateMac"));
}
@@ -117,7 +133,7 @@ export function updateExe(): string {
paths.push(path.join("..", "..", "target", "debug", "update"));
paths.push(path.join("..", "..", "target", "release", "update"));
}
if (isWindows()) {
paths.push(path.join("..", "..", "target", "debug", "Update.exe"));
paths.push(path.join("..", "..", "target", "release", "Update.exe"));
@@ -128,12 +144,22 @@ export function updateExe(): string {
return p;
}
}
throw new Error("Update.exe not found");
// could not find update.exe
let message = "Could not find update binary. Searched these paths: "
+ paths.join(", ") + ". And found these binaries: ";
for (const p of paths) {
for (const file of fs.readdirSync(p)) {
message += file + ", ";
}
}
throw new Error(message);
}
export function shortDelay(): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, 300));
function shortDelay(): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, 150));
}
// export function copyUpdateExeTo(dir: string, filename?: string): string {