-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.test.ts
More file actions
77 lines (66 loc) · 3.03 KB
/
parser.test.ts
File metadata and controls
77 lines (66 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { describe, test, expect } from "bun:test";
import { parseGA4Url } from "./parser";
const BASE = "https://www.google-analytics.com/g/collect";
describe("parseGA4Url", () => {
test("parses core params", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-ABC123&cid=111.222&en=page_view`);
expect(result.v).toBe("2");
expect(result.tid).toBe("G-ABC123");
expect(result.cid).toBe("111.222");
expect(result.en).toBe("page_view");
});
test("parses optional core params", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&sid=123&sct=2&seg=1&_s=1&dl=https://example.com&dr=https://ref.com&dt=Title&ul=en-us&sr=1920x1080`);
expect(result.sid).toBe("123");
expect(result.sct).toBe("2");
expect(result.seg).toBe("1");
expect(result._s).toBe("1");
expect(result.dl).toBe("https://example.com");
expect(result.dr).toBe("https://ref.com");
expect(result.dt).toBe("Title");
expect(result.ul).toBe("en-us");
expect(result.sr).toBe("1920x1080");
});
test("groups ep.* into ep object", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&ep.page_type=home&ep.section=hero`);
expect(result.ep).toEqual({ page_type: "home", section: "hero" });
});
test("groups epn.* into epn object", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&epn.value=100&epn.score=42`);
expect(result.epn).toEqual({ value: "100", score: "42" });
});
test("groups up.* into up object", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&up.membership=premium`);
expect(result.up).toEqual({ membership: "premium" });
});
test("groups upn.* into upn object", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&upn.lifetime_value=500`);
expect(result.upn).toEqual({ lifetime_value: "500" });
});
test("initializes empty group objects when no prefixed params", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e`);
expect(result.ep).toEqual({});
expect(result.epn).toEqual({});
expect(result.up).toEqual({});
expect(result.upn).toEqual({});
});
test("handles mixed core and prefixed params", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=purchase&ep.currency=USD&epn.value=99&dt=Checkout&up.tier=gold`);
expect(result.v).toBe("2");
expect(result.en).toBe("purchase");
expect(result.dt).toBe("Checkout");
expect(result.ep).toEqual({ currency: "USD" });
expect(result.epn).toEqual({ value: "99" });
expect(result.up).toEqual({ tier: "gold" });
expect(result.upn).toEqual({});
});
test("handles URL-encoded values", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&dl=${encodeURIComponent("https://example.com/path?q=1")}`);
expect(result.dl).toBe("https://example.com/path?q=1");
});
test("preserves unknown params as top-level keys", () => {
const result = parseGA4Url(`${BASE}?v=2&tid=G-X&cid=1&en=e&_p=12345&_z=abc`);
expect(result._p).toBe("12345");
expect(result._z).toBe("abc");
});
});