codetrix
Version:
A lightweight lodash-style utility library
262 lines (261 loc) • 10.7 kB
JavaScript
import { isBrowser, isNode, isMobile, isTablet, isDesktop, isServerless, isWebWorker, isElectron, getRuntimeEnv, getOS, getBrowserName, getDeviceType, } from "../../utility/env";
describe("Environment Utilities", () => {
describe("isBrowser", () => {
it("should return true when window and document are defined", () => {
global.window = {};
global.document = {};
expect(isBrowser()).toBe(true);
delete global.window;
delete global.document;
});
it("should return false when window or document are undefined", () => {
expect(isBrowser()).toBe(false);
});
});
describe("isNode", () => {
it("should return true when process.versions.node is defined", () => {
global.process = { versions: { node: "18.0.0" } };
expect(isNode()).toBe(true);
delete global.process;
});
it("should return false when process is undefined", () => {
expect(isNode()).toBe(false);
});
it("should return false when process.versions?.node is undefined", () => {
global.process = { versions: {} };
expect(isNode()).toBe(false);
delete global.process;
});
});
describe("isMobile", () => {
it("should return true for mobile user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "iPhone" };
expect(isMobile()).toBe(true);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false for desktop user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Windows NT" };
expect(isMobile()).toBe(false);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false if not in browser", () => {
expect(isMobile()).toBe(false);
});
});
describe("isTablet", () => {
it("should return true for tablet user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "iPad" };
expect(isTablet()).toBe(true);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false for non-tablet user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Windows NT" };
expect(isTablet()).toBe(false);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false if not in browser", () => {
expect(isTablet()).toBe(false);
});
});
describe("isDesktop", () => {
it("should return true for desktop user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Windows NT" };
expect(isDesktop()).toBe(true);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false for mobile user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Android" };
expect(isDesktop()).toBe(false);
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return false for tablet user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "iPad" };
expect(isDesktop()).toBe(false);
delete global.navigator;
delete global.window;
delete global.document;
});
});
describe("isServerless", () => {
it("should return true if AWS_LAMBDA_FUNCTION_NAME is set", () => {
global.process = {
versions: { node: "18.0.0" },
env: { AWS_LAMBDA_FUNCTION_NAME: "lambda" }
};
expect(isServerless()).toBe(true);
delete global.process;
});
it("should return true if VERCEL is set", () => {
global.process = {
versions: { node: "18.0.0" },
env: { VERCEL: "1" }
};
expect(isServerless()).toBe(true);
delete global.process;
});
it("should return false if not serverless", () => {
global.process = {
versions: { node: "18.0.0" },
env: {}
};
expect(isServerless()).toBe(false);
delete global.process;
});
it("should return false if not node", () => {
expect(isServerless()).toBe(false);
});
});
describe("isWebWorker", () => {
it("should return true if self.constructor.name is DedicatedWorkerGlobalScope", () => {
global.self = { constructor: { name: "DedicatedWorkerGlobalScope" } };
expect(isWebWorker()).toBe(true);
delete global.self;
});
it("should return false otherwise", () => {
expect(isWebWorker()).toBe(false);
});
});
describe("isElectron", () => {
it("should return true if process.versions.electron is defined", () => {
global.process = { versions: { node: "18.0.0", electron: "25.0.0" } };
expect(isElectron()).toBe(true);
delete global.process;
});
it("should return false if not electron", () => {
global.process = { versions: { node: "18.0.0" } };
expect(isElectron()).toBe(false);
delete global.process;
});
it("should return false if not node", () => {
expect(isElectron()).toBe(false);
});
it("should return false if process.versions.electron is undefined", () => {
global.process = { versions: { node: "18.0.0", electron: undefined } };
expect(isElectron()).toBe(false);
delete global.process;
});
});
describe("getRuntimeEnv", () => {
it("should return 'browser' if isBrowser is true", () => {
global.window = {};
global.document = {};
expect(getRuntimeEnv()).toBe("browser");
delete global.window;
delete global.document;
});
it("should return 'electron' if isNode and isElectron are true", () => {
global.process = { versions: { node: "18.0.0", electron: "25.0.0" } };
expect(getRuntimeEnv()).toBe("electron");
delete global.process;
});
it("should return 'node' if isNode is true", () => {
global.process = { versions: { node: "18.0.0" } };
expect(getRuntimeEnv()).toBe("node");
delete global.process;
});
it("should return 'webworker' if isWebWorker is true", () => {
global.self = { constructor: { name: "DedicatedWorkerGlobalScope" } };
expect(getRuntimeEnv()).toBe("webworker");
delete global.self;
});
it("should return 'unknown' otherwise", () => {
expect(getRuntimeEnv()).toBe("unknown");
});
});
describe("getOS", () => {
it("should return correct OS for various user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Windows NT" };
expect(getOS()).toBe("Windows");
global.navigator = { userAgent: "Macintosh" };
expect(getOS()).toBe("macOS");
global.navigator = { userAgent: "Linux" };
expect(getOS()).toBe("Linux");
global.navigator = { userAgent: "Android" };
expect(getOS()).toBe("Android");
global.navigator = { userAgent: "iPhone" };
expect(getOS()).toBe("iOS");
global.navigator = { userAgent: "UnknownAgent" };
expect(getOS()).toBe("Unknown");
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return 'Node.js' if not in browser", () => {
expect(getOS()).toBe("Node.js");
});
});
describe("getBrowserName", () => {
it("should return correct browser name for various user agents", () => {
global.window = {};
global.document = {};
global.navigator = { userAgent: "Edg" };
expect(getBrowserName()).toBe("Edge");
global.navigator = { userAgent: "OPR" };
expect(getBrowserName()).toBe("Opera");
global.navigator = { userAgent: "Chrome" };
expect(getBrowserName()).toBe("Chrome");
global.navigator = { userAgent: "Safari" };
expect(getBrowserName()).toBe("Safari");
global.navigator = { userAgent: "Firefox" };
expect(getBrowserName()).toBe("Firefox");
global.navigator = { userAgent: "MSIE" };
expect(getBrowserName()).toBe("Internet Explorer");
global.navigator = { userAgent: "UnknownAgent" };
expect(getBrowserName()).toBe("Unknown");
delete global.navigator;
delete global.window;
delete global.document;
});
it("should return 'Node.js' if not in browser", () => {
expect(getBrowserName()).toBe("Node.js");
});
});
describe("getDeviceType", () => {
it("should return 'mobile' for mobile user agents", () => {
global.navigator = { userAgent: "Android" };
expect(getDeviceType()).toBe("mobile");
delete global.navigator;
});
it("should return 'tablet' for tablet user agents", () => {
global.navigator = { userAgent: "iPad" };
expect(getDeviceType()).toBe("tablet");
delete global.navigator;
});
it("should return 'desktop' for desktop user agents", () => {
global.navigator = { userAgent: "Windows NT" };
expect(getDeviceType()).toBe("desktop");
delete global.navigator;
});
it("should return 'desktop' if navigator is undefined", () => {
expect(getDeviceType()).toBe("desktop");
});
});
});