std/http/user_agent_test.ts

203 lines
6.4 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { assertEquals } from "@std/assert/assert-equals";
import { UserAgent } from "./user_agent.ts";
Deno.test({
name: "UserAgent.prototype.browser",
async fn(t) {
const specs = (await import("./testdata/user_agent/browser-all.json", {
with: { type: "json" },
})).default;
for (const { desc, ua, expect: { major, name, version } } of specs) {
await t.step({
name: desc,
fn() {
const actual = new UserAgent(ua);
assertEquals(actual.browser, {
major: major === "undefined" ? undefined : major,
name: name === "undefined" ? undefined : name,
version: version === "undefined" ? undefined : version,
});
},
});
}
},
});
Deno.test({
name: "UserAgent.prototype.cpu",
async fn(t) {
const specs = (await import("./testdata/user_agent/cpu-all.json", {
with: { type: "json" },
})).default;
for (const { desc: name, ua, expect } of specs) {
await t.step({
name,
fn() {
const actual = new UserAgent(ua);
assertEquals(actual.cpu, expect);
},
});
}
},
});
Deno.test({
name: "UserAgent.prototype.device",
async fn(t) {
const specs = (await import("./testdata/user_agent/device-all.json", {
with: { type: "json" },
})).default;
for (const { desc: name, ua, expect: { vendor, model, type } } of specs) {
await t.step({
name,
fn() {
const actual = new UserAgent(ua);
assertEquals(actual.device, {
vendor: vendor === "undefined" ? undefined : vendor,
model: model === "undefined" ? undefined : model,
type: type === "undefined" ? undefined : type,
});
},
});
}
},
});
Deno.test({
name: "UserAgent.prototype.engine",
async fn(t) {
const specs = (await import("./testdata/user_agent/engine-all.json", {
with: { type: "json" },
})).default;
for (const { desc, ua, expect: { name, version } } of specs) {
await t.step({
name: desc,
fn() {
const actual = new UserAgent(ua);
assertEquals(actual.engine, {
name: name === "undefined" ? undefined : name,
version: version === "undefined" ? undefined : version,
});
},
});
}
},
});
Deno.test({
name: "UserAgent.prototype.os",
async fn(t) {
const specs = (await import("./testdata/user_agent/os-all.json", {
with: { type: "json" },
})).default;
for (const { desc, ua, expect: { name, version } } of specs) {
await t.step({
name: desc,
fn() {
const actual = new UserAgent(ua);
assertEquals(actual.os, {
name: name === "undefined" ? undefined : name,
version: version === "undefined" ? undefined : version,
});
},
});
}
},
});
Deno.test("UserAgent.constructor() accepts null", () => {
const ua = new UserAgent(null);
assertEquals(ua.ua, "");
assertEquals(ua.browser, {
name: undefined,
version: undefined,
major: undefined,
});
assertEquals(ua.cpu, { architecture: undefined });
assertEquals(ua.device, {
model: undefined,
type: undefined,
vendor: undefined,
});
assertEquals(ua.engine, { name: undefined, version: undefined });
assertEquals(ua.os, { name: undefined, version: undefined });
});
Deno.test("UserAgent.toString() returns ua itself", () => {
const ua = new UserAgent(
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
);
assertEquals(ua.toString(), ua.ua);
});
Deno.test("UserAgent.toJSON() returns the object { browser, cpu, device, engine, os, ua }", () => {
const ua = new UserAgent(
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
);
assertEquals(ua.toJSON(), {
browser: { name: "Chrome", version: "64.0.3282.140", major: "64" },
cpu: { architecture: "amd64" },
device: { model: undefined, type: undefined, vendor: undefined },
engine: { name: "Blink", version: "64.0.3282.140" },
os: { name: "Linux", version: "x86_64" },
ua:
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
});
});
Deno.test("UserAgent supports custom inspect in Deno", () => {
const ua = new UserAgent(
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
);
assertEquals(
Deno.inspect(ua),
`UserAgent {
browser: { name: "Chrome", version: "64.0.3282.140", major: "64" },
cpu: { architecture: "amd64" },
device: { model: undefined, type: undefined, vendor: undefined },
engine: { name: "Blink", version: "64.0.3282.140" },
os: { name: "Linux", version: "x86_64" },
ua: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"
}`,
);
});
Deno.test("UserAgent supports custom inspect in Node.js", async () => {
const { inspect } = await import("node:util");
const ua = new UserAgent(
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36",
);
// Needs to delete Deno.customInspect to enable Node's inspect
// deno-lint-ignore no-explicit-any
(ua as any)[Symbol.for("Deno.customInspect")] = undefined;
assertEquals(
inspect(ua),
`UserAgent {
browser: { name: 'Chrome', version: '64.0.3282.140', major: '64' },
cpu: { architecture: 'amd64' },
device: { model: undefined, type: undefined, vendor: undefined },
engine: { name: 'Blink', version: '64.0.3282.140' },
os: { name: 'Linux', version: 'x86_64' },
ua: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
}`,
);
assertEquals(
inspect(ua, { depth: null }),
`UserAgent {
browser: { name: 'Chrome', version: '64.0.3282.140', major: '64' },
cpu: { architecture: 'amd64' },
device: { model: undefined, type: undefined, vendor: undefined },
engine: { name: 'Blink', version: '64.0.3282.140' },
os: { name: 'Linux', version: 'x86_64' },
ua: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
}`,
);
assertEquals(
inspect([[ua]], { depth: 1 }),
`[ [ [UserAgent] ] ]`,
);
});