tests / url.test.ts
tests / url.test.ts
import { describe, it, expect } from "vitest";
import { normalizeUrl, resolveHref } from "../src/utils/url";
describe("normalizeUrl", () => {
it("removes utm_* parameters", () => {
const url = "https://example.com/page?utm_source=google&utm_medium=campaign&id=42";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=42");
});
it("removes fbclid, gclid, igshid, mc_cid, mc_eid, mkt_tok", () => {
const url = "https://example.com/page?fbclid=abc&gclid=def&igshid=ghi&mc_cid=jkl&mc_eid=mno&mkt_tok=pqr&id=1";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=1");
});
it("removes hash fragment", () => {
const url = "https://example.com/page#section";
expect(normalizeUrl(url)).toBe("https://example.com/page");
});
it("preserves path case", () => {
const url = "https://example.com/Path/To/Page";
expect(normalizeUrl(url)).toBe("https://example.com/Path/To/Page");
});
it("preserves non-tracking query params", () => {
const url = "https://example.com/search?q=test&page=2&lang=en";
expect(normalizeUrl(url)).toBe("https://example.com/search?q=test&page=2&lang=en");
});
it("handles URL with no query params", () => {
const url = "https://example.com/page";
expect(normalizeUrl(url)).toBe("https://example.com/page");
});
it("handles invalid input by returning trimmed input", () => {
expect(normalizeUrl("not-a-url")).toBe("not-a-url");
expect(normalizeUrl("")).toBe("");
});
it("handles whitespace-only input", () => {
expect(normalizeUrl(" ")).toBe("");
});
it("handles relative URL with baseUrl", () => {
const result = normalizeUrl("/path/to/page", "https://example.com");
expect(result).toBe("https://example.com/path/to/page");
});
it("handles relative URL with baseUrl and tracking params", () => {
const result = normalizeUrl("/page?utm_source=test&id=1", "https://example.com");
expect(result).toBe("https://example.com/page?id=1");
});
it("normalizes multiple utm params", () => {
const url = "https://example.com/page?utm_source=a&utm_medium=b&utm_campaign=c&utm_term=d&utm_content=e&id=1";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=1");
});
});
describe("resolveHref", () => {
it("resolves relative URLs against baseUrl", () => {
const result = resolveHref("/about", "https://example.com");
expect(result).toBe("https://example.com/about");
});
it("resolves relative path with ../", () => {
const result = resolveHref("../contact", "https://example.com/about/team");
expect(result).toBe("https://example.com/contact");
});
it("returns null for invalid href", () => {
// When baseUrl is also invalid, URL constructor throws
const result = resolveHref("not-a-valid-url", "not-a-valid-base");
expect(result).toBeNull();
});
it("normalizes tracking params from resolved URL", () => {
const result = resolveHref("/page?utm_source=test", "https://example.com");
expect(result).toBe("https://example.com/page");
});
it("handles absolute URL href", () => {
const result = resolveHref("https://other.com/page", "https://example.com");
expect(result).toBe("https://other.com/page");
});
it("handles empty href", () => {
const result = resolveHref("", "https://example.com");
// Empty string resolves to the base URL
expect(result).toBe("https://example.com/");
});
});
import { describe, it, expect } from "vitest";
import { normalizeUrl, resolveHref } from "../src/utils/url";
describe("normalizeUrl", () => {
it("removes utm_* parameters", () => {
const url = "https://example.com/page?utm_source=google&utm_medium=campaign&id=42";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=42");
});
it("removes fbclid, gclid, igshid, mc_cid, mc_eid, mkt_tok", () => {
const url = "https://example.com/page?fbclid=abc&gclid=def&igshid=ghi&mc_cid=jkl&mc_eid=mno&mkt_tok=pqr&id=1";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=1");
});
it("removes hash fragment", () => {
const url = "https://example.com/page#section";
expect(normalizeUrl(url)).toBe("https://example.com/page");
});
it("preserves path case", () => {
const url = "https://example.com/Path/To/Page";
expect(normalizeUrl(url)).toBe("https://example.com/Path/To/Page");
});
it("preserves non-tracking query params", () => {
const url = "https://example.com/search?q=test&page=2&lang=en";
expect(normalizeUrl(url)).toBe("https://example.com/search?q=test&page=2&lang=en");
});
it("handles URL with no query params", () => {
const url = "https://example.com/page";
expect(normalizeUrl(url)).toBe("https://example.com/page");
});
it("handles invalid input by returning trimmed input", () => {
expect(normalizeUrl("not-a-url")).toBe("not-a-url");
expect(normalizeUrl("")).toBe("");
});
it("handles whitespace-only input", () => {
expect(normalizeUrl(" ")).toBe("");
});
it("handles relative URL with baseUrl", () => {
const result = normalizeUrl("/path/to/page", "https://example.com");
expect(result).toBe("https://example.com/path/to/page");
});
it("handles relative URL with baseUrl and tracking params", () => {
const result = normalizeUrl("/page?utm_source=test&id=1", "https://example.com");
expect(result).toBe("https://example.com/page?id=1");
});
it("normalizes multiple utm params", () => {
const url = "https://example.com/page?utm_source=a&utm_medium=b&utm_campaign=c&utm_term=d&utm_content=e&id=1";
expect(normalizeUrl(url)).toBe("https://example.com/page?id=1");
});
});
describe("resolveHref", () => {
it("resolves relative URLs against baseUrl", () => {
const result = resolveHref("/about", "https://example.com");
expect(result).toBe("https://example.com/about");
});
it("resolves relative path with ../", () => {
const result = resolveHref("../contact", "https://example.com/about/team");
expect(result).toBe("https://example.com/contact");
});
it("returns null for invalid href", () => {
// When baseUrl is also invalid, URL constructor throws
const result = resolveHref("not-a-valid-url", "not-a-valid-base");
expect(result).toBeNull();
});
it("normalizes tracking params from resolved URL", () => {
const result = resolveHref("/page?utm_source=test", "https://example.com");
expect(result).toBe("https://example.com/page");
});
it("handles absolute URL href", () => {
const result = resolveHref("https://other.com/page", "https://example.com");
expect(result).toBe("https://other.com/page");
});
it("handles empty href", () => {
const result = resolveHref("", "https://example.com");
// Empty string resolves to the base URL
expect(result).toBe("https://example.com/");
});
});