More nodejs tests

This commit is contained in:
Caelan Sayler
2024-08-26 14:37:25 +01:00
committed by Caelan
parent e210aec6cd
commit 98fa707b90
7 changed files with 202 additions and 35 deletions

View File

@@ -2624,6 +2624,18 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/execa/node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -3107,18 +3119,6 @@
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",

View File

@@ -219,7 +219,7 @@ export class UpdateManager {
*/
downloadUpdateAsync(
update: UpdateInfo,
progress: (perc: number) => void,
progress?: (perc: number) => void,
): Promise<void> {
if (!update) {
throw new Error("update is required");

View File

@@ -0,0 +1,69 @@
import { copyFileSync, existsSync } from "fs";
import { UpdateManager, UpdateOptions, VelopackLocator } from "../src";
import path from "path";
import { tempd3, fixture, updateExe } from "./helper";
test("UpdateManager detects local update", () => {
return tempd3(async (tmpDir, packagesDir, rootDir) => {
const locator: VelopackLocator = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
};
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();
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", () => {
return tempd3(async (feedDir, packagesDir, rootDir) => {
const locator: VelopackLocator = {
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: packagesDir,
RootAppDir: rootDir,
UpdateExePath: updateExe(),
};
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();
await um.downloadUpdateAsync(update!, () => { });
expect(
existsSync(path.join(packagesDir, "AvaloniaCrossPlat-1.0.11-full.nupkg")),
).toBe(true);
});
});

View File

@@ -0,0 +1,94 @@
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
export function getTempDir(): string {
return fs.realpathSync(os.tmpdir());
}
export function fixture(name: string): string {
return path.join("..", "..", "test", "fixtures", name);
}
export function makeId(length: number): string {
let result = "";
const characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
const charactersLength = characters.length;
let counter = 0;
while (counter < length) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
counter += 1;
}
return result;
}
export function tempd1<T>(cb: (dir: string) => T): T {
const id = makeId(10);
const dir = path.join(os.tmpdir(), id);
fs.mkdirSync(dir);
try {
return cb(dir);
} finally {
fs.rmSync(dir, { recursive: true });
}
}
export function tempd2<T>(cb: (dir1: string, dir2: string) => T): T {
const dir1 = path.join(os.tmpdir(), makeId(10));
const dir2 = path.join(os.tmpdir(), makeId(10));
fs.mkdirSync(dir1);
fs.mkdirSync(dir2);
try {
return cb(dir1, dir2);
} finally {
fs.rmSync(dir1, { recursive: true });
fs.rmSync(dir2, { recursive: true });
}
}
export function tempd3<T>(
cb: (dir1: string, dir2: string, dir3: string) => T,
): T {
const dir1 = path.join(os.tmpdir(), makeId(10));
const dir2 = path.join(os.tmpdir(), makeId(10));
const dir3 = path.join(os.tmpdir(), makeId(10));
fs.mkdirSync(dir1);
fs.mkdirSync(dir2);
fs.mkdirSync(dir3);
try {
return cb(dir1, dir2, dir3);
} finally {
fs.rmSync(dir1, { recursive: true });
fs.rmSync(dir2, { recursive: true });
fs.rmSync(dir3, { recursive: true });
}
}
export function updateExe(): string {
const paths = [
path.join("..", "..", "target", "debug", "Update.exe"),
path.join("..", "..", "target", "release", "Update.exe"),
path.join("..", "..", "target", "debug", "update"),
path.join("..", "..", "target", "release", "update"),
path.join("..", "..", "target", "debug", "UpdateMac"),
path.join("..", "..", "target", "release", "UpdateMac"),
path.join("..", "..", "target", "debug", "UpdateNix"),
path.join("..", "..", "target", "release", "UpdateNix"),
];
for (const p of paths) {
if (fs.existsSync(p)) {
return p;
}
}
throw new Error("Update.exe not found");
}
// export function copyUpdateExeTo(dir: string, filename?: string): string {
// const exe = updateExe();
// const dest = path.join(dir, filename ?? path.basename(exe));
// fs.copyFileSync(exe, dest);
// return dest;
// }

View File

@@ -43,7 +43,7 @@ class HookTester {
test("VelopackApp should handle restarted event", () => {
let [builder, tester] = HookTester.build();
let locator: VelopackLocator = {
ManifestPath: "../../test/fixtures/FullNuspec.nuspec",
ManifestPath: "../../test/fixtures/Test.Squirrel-App.nuspec",
PackagesDir: "",
RootAppDir: "",
UpdateExePath: "",
@@ -59,26 +59,6 @@ test("VelopackApp should handle restarted event", () => {
expect(tester.version).toBe("1.0.0");
});
// test("VelopackApp should handle firstrun event with custom locator", () => {
// let [builder, tester] = HookTester.build();
// let locator: VelopackLocator = {
// ManifestPath: "../../test/fixtures/FullNuspec.nuspec",
// PackagesDir: "",
// RootAppDir: "",
// UpdateExePath: "",
// };
// 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(false);
// expect(tester.firstRun).toBe(true);
// expect(tester.version).toBe("1.0.0");
// });
test("VelopackApp should handle after-install hook", () => {
let [builder, tester] = HookTester.build();
builder.setArgs(["--veloapp-install", "1.2.3-test.4"]).run();

View File

@@ -125,7 +125,13 @@ impl<'a> VelopackApp<'a> {
}
}
let my_version = if let Ok(ver) = self.get_current_version() { ver } else { semver::Version::new(0, 0, 0) };
let my_version = match self.get_current_version() {
Ok(ver) => ver,
Err(e) => {
warn!("VelopackApp: Error getting current version: {}", e);
semver::Version::new(0, 0, 0)
}
};
let firstrun = env::var("VELOPACK_FIRSTRUN").is_ok();
let restarted = env::var("VELOPACK_RESTART").is_ok();

18
test/fixtures/Test.Squirrel-App.nuspec vendored Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>Test.Squirrel-App</id>
<title>Test Squirrel App</title>
<description>Test Squirrel App</description>
<authors>author</authors>
<version>1.0.0</version>
<channel>asd123</channel>
<mainExe>testawareapp.exe</mainExe>
<os>win</os>
<rid>win-x64</rid>
<osMinVersion>10.0.19043</osMinVersion>
<machineArchitecture>x64</machineArchitecture>
<runtimeDependencies>net6-x64-desktop</runtimeDependencies>
</metadata>
</package>