Skip to content
56 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { alternateFiles, archOfHint, deviceOf, featuredFile } from "./download-platform.ts";
5
6const UA = {
7 mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
8 windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
9 windowsArm: "Mozilla/5.0 (Windows NT 10.0; ARM64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
10 linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
11 android: "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36",
12 iphone: "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
13 chromebook: "Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
14};
15
16test("a User-Agent names the visitor's platform, phones first", () => {
17 assert.deepEqual(deviceOf(UA.mac), { platform: "macos", arch: null });
18 assert.deepEqual(deviceOf(UA.windows), { platform: "windows", arch: "x64" });
19 assert.deepEqual(deviceOf(UA.windowsArm), { platform: "windows", arch: "arm64" });
20 assert.deepEqual(deviceOf(UA.linux), { platform: "linux", arch: "x64" });
21 assert.deepEqual(deviceOf(UA.android), { platform: "android", arch: null });
22 assert.deepEqual(deviceOf(UA.iphone), { platform: "ios", arch: "arm64" });
23 assert.deepEqual(deviceOf(UA.chromebook), { platform: "linux", arch: "x64" });
24 assert.deepEqual(deviceOf("curl/8.0"), { platform: null, arch: null });
25 assert.deepEqual(deviceOf(null), { platform: null, arch: null });
26});
27
28test("client hints name the processor", () => {
29 assert.equal(archOfHint("arm"), "arm64");
30 assert.equal(archOfHint("x86"), "x64");
31 assert.equal(archOfHint(""), null);
32});
33
34const files = [
35 { platform: "linux", arch: "x64", kind: "appimage" },
36 { platform: "linux", arch: "x64", kind: "deb" },
37 { platform: "linux", arch: "x64", kind: "rpm" },
38 { platform: "linux", arch: "arm64", kind: "appimage" },
39 { platform: "macos", arch: "arm64", kind: "dmg" },
40 { platform: "macos", arch: "x64", kind: "dmg" },
41 { platform: "windows", arch: "x64", kind: "installer" },
42];
43
44test("the file offered first is the platform's preferred kind, on the visitor's processor", () => {
45 assert.equal(featuredFile(files, "linux", null), files[0]);
46 assert.equal(featuredFile(files, "linux", "arm64"), files[3]);
47 // A Mac whose processor is not known gets Apple silicon's, and Intel's beside it.
48 assert.equal(featuredFile(files, "macos", null), files[4]);
49 assert.equal(featuredFile(files, "macos", "x64"), files[5]);
50 assert.deepEqual(alternateFiles(files, files[4]), [files[5]]);
51 // Windows on Arm has no installer of its own yet: the x64 one runs there.
52 assert.equal(featuredFile(files, "windows", "arm64"), files[6]);
53 assert.deepEqual(alternateFiles(files, files[0]), [files[1], files[2]]);
54 // A platform the release lacks.
55 assert.equal(featuredFile(files.filter((f) => f.platform !== "windows"), "windows", "x64"), null);
56});