Skip to content
Source
Sign inSign up

utils.test.ts

153 lines4.6 KB

1import { describe, expect, it } from "vite-plus/test";
2​
3import { deriveAuthClientMetadata, resolveSessionCookieName } from "./utils.ts";
4​
5describe("deriveAuthClientMetadata", () => {
6 it("labels Electron user agents as Electron instead of Chrome", () => {
7 const metadata = deriveAuthClientMetadata({
8 request: {
9 headers: {
10 "user-agent":
11 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) t3code/0.0.15 Chrome/136.0.7103.93 Electron/36.3.2 Safari/537.36",
12 },
13 source: {
14 remoteAddress: "::ffff:127.0.0.1",
15 },
16 } as never,
17 });
18​
19 expect(metadata).toMatchObject({
20 browser: "Electron",
21 deviceType: "desktop",
22 ipAddress: "127.0.0.1",
23 os: "macOS",
24 });
25 });
26​
27 it.each([
28 [
29 "Edge on Android",
30 "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36 EdgA/129.0.0.0",
31 "Edge",
32 ],
33 [
34 "Edge on iOS",
35 "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 EdgiOS/129.0.2792.84 Mobile/15E148 Safari/605.1.15",
36 "Edge",
37 ],
38 [
39 "Firefox on iOS",
40 "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/131.0 Mobile/15E148 Safari/605.1.15",
41 "Firefox",
42 ],
43 [
44 "Opera on iOS",
45 "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 OPiOS/5.0.0 Mobile/15E148 Safari/605.1.15",
46 "Opera",
47 ],
48 ])("labels %s by its own browser token", (_name, userAgent, browser) => {
49 const metadata = deriveAuthClientMetadata({
50 request: { headers: { "user-agent": userAgent }, source: {} } as never,
51 });
52​
53 expect(metadata.browser).toBe(browser);
54 });
55​
56 it("applies client-presented display identity without replacing transport metadata", () => {
57 const metadata = deriveAuthClientMetadata({
58 request: {
59 headers: {
60 "user-agent":
61 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/136.0.7103.93 Electron/36.3.2 Safari/537.36",
62 },
63 source: {
64 remoteAddress: "::ffff:192.168.213.72",
65 },
66 } as never,
67 presented: {
68 label: "T3 Code Mobile",
69 deviceType: "mobile",
70 os: "iOS",
71 },
72 });
73​
74 expect(metadata).toMatchObject({
75 label: "T3 Code Mobile",
76 browser: "Electron",
77 deviceType: "mobile",
78 ipAddress: "192.168.213.72",
79 os: "iOS",
80 });
81 expect(metadata.userAgent).toContain("Electron/36.3.2");
82 });
83});
84​
85describe("session cookie isolation", () => {
86 it("isolates loopback web servers by port and server state", () => {
87 const first = resolveSessionCookieName({
88 mode: "web",
89 port: 5775,
90 host: "127.0.0.1",
91 instanceKey: "/tmp/t3-agent-one",
92 environmentId: "environment-one",
93 development: true,
94 });
95 const second = resolveSessionCookieName({
96 mode: "web",
97 port: 5775,
98 host: "127.0.0.1",
99 instanceKey: "/tmp/t3-agent-two",
100 environmentId: "environment-two",
101 development: true,
102 });
103​
104 expect(first).toMatch(/^t3_session_5775_[a-f0-9]{12}$/);
105 expect(second).toMatch(/^t3_session_5775_[a-f0-9]{12}$/);
106 expect(first).not.toBe(second);
107 });
108​
109 // regression: #8085 isolate remote web session cookies
110 it("isolates remote web servers by server state", () => {
111 const first = resolveSessionCookieName({
112 mode: "web",
113 port: 3773,
114 host: "192.168.1.50",
115 instanceKey: "/srv/t3-one",
116 environmentId: "environment-one",
117 development: false,
118 });
119 const second = resolveSessionCookieName({
120 mode: "web",
121 port: 5775,
122 host: "192.168.1.50",
123 instanceKey: "/srv/t3-two",
124 environmentId: "environment-two",
125 development: false,
126 });
127​
128 expect(first).toMatch(/^t3_session_[a-f0-9]{12}$/);
129 expect(second).toMatch(/^t3_session_[a-f0-9]{12}$/);
130 expect(first).not.toBe(second);
131 });
132​
133 it("keeps a remote web server cookie stable across port changes", () => {
134 const first = resolveSessionCookieName({
135 mode: "web",
136 port: 8080,
137 host: "0.0.0.0",
138 instanceKey: "/srv/t3",
139 environmentId: "environment-one",
140 development: false,
141 });
142 const second = resolveSessionCookieName({
143 mode: "web",
144 port: 9090,
145 host: "app.example.com",
146 instanceKey: "/srv/t3",
147 environmentId: "environment-one",
148 development: false,
149 });
150​
151 expect(first).toBe(second);
152 });
153});