| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { alternateFiles, archOfHint, deviceOf, featuredFile } from "./download-platform.ts"; |
| 5 | |
| 6 | const 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 | |
| 16 | test("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 | |
| 28 | test("client hints name the processor", () => { |
| 29 | assert.equal(archOfHint("arm"), "arm64"); |
| 30 | assert.equal(archOfHint("x86"), "x64"); |
| 31 | assert.equal(archOfHint(""), null); |
| 32 | }); |
| 33 | |
| 34 | const 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 | |
| 44 | test("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 | }); |