Skip to content
Source
Sign inSign up

EnvironmentAuthPolicy.test.ts

86 lines3.0 KB

1import * as NodeCrypto from "@effect/platform-node/NodeCrypto";
2import * as NodeServices from "@effect/platform-node/NodeServices";
3import { expect, it } from "@effect/vitest";
4import * as Effect from "effect/Effect";
5import * as Layer from "effect/Layer";
6​
7import * as ServerConfig from "../config.ts";
8import * as ServerEnvironment from "../environment/ServerEnvironment.ts";
9import * as EnvironmentAuthPolicy from "./EnvironmentAuthPolicy.ts";
10​
11const layerEnvironmentAuthPolicy = (overrides?: Partial<ServerConfig.ServerConfig["Service"]>) =>
12 EnvironmentAuthPolicy.layer.pipe(
13 Layer.provide(ServerEnvironment.layerIdentity),
14 Layer.provide(
15 Layer.effect(
16 ServerConfig.ServerConfig,
17 Effect.gen(function* () {
18 const config = yield* ServerConfig.ServerConfig;
19 return {
20 ...config,
21 ...overrides,
22 } satisfies ServerConfig.ServerConfig["Service"];
23 }),
24 ).pipe(
25 Layer.provide(ServerConfig.layerTest(process.cwd(), { prefix: "t3-auth-policy-test-" })),
26 ),
27 ),
28 );
29​
30it.layer(Layer.mergeAll(NodeServices.layer, NodeCrypto.layer))(
31 "EnvironmentAuthPolicy.layer",
32 (it) => {
33 it.effect("keeps desktop cookies port-scoped on the port a second instance lands on", () =>
34 Effect.gen(function* () {
35 const policy = yield* EnvironmentAuthPolicy.EnvironmentAuthPolicy;
36 const descriptor = yield* policy.getDescriptor();
37​
38 expect(descriptor.sessionCookieName).toBe("t3_session_3774");
39 }).pipe(
40 Effect.provide(
41 layerEnvironmentAuthPolicy({
42 mode: "desktop",
43 port: 3774,
44 }),
45 ),
46 ),
47 );
48​
49 it.effect("uses remote-reachable policy for desktop mode when bound beyond loopback", () =>
50 Effect.gen(function* () {
51 const policy = yield* EnvironmentAuthPolicy.EnvironmentAuthPolicy;
52 const descriptor = yield* policy.getDescriptor();
53​
54 expect(descriptor.policy).toBe("remote-reachable");
55 expect(descriptor.bootstrapMethods).toEqual(["desktop-bootstrap", "one-time-token"]);
56 }).pipe(
57 Effect.provide(
58 layerEnvironmentAuthPolicy({
59 mode: "desktop",
60 host: "0.0.0.0",
61 }),
62 ),
63 ),
64 );
65​
66 it.effect("uses loopback-browser policy for loopback web hosts", () =>
67 Effect.gen(function* () {
68 const policy = yield* EnvironmentAuthPolicy.EnvironmentAuthPolicy;
69 const descriptor = yield* policy.getDescriptor();
70​
71 expect(descriptor.policy).toBe("loopback-browser");
72 expect(descriptor.bootstrapMethods).toEqual(["one-time-token"]);
73 expect(descriptor.serverUpdateScope).toBe("environment:maintain");
74 expect(descriptor.sessionCookieName).toMatch(/^t3_session_3773_[a-f0-9]{12}$/);
75 }).pipe(
76 Effect.provide(
77 layerEnvironmentAuthPolicy({
78 mode: "web",
79 host: "127.0.0.1",
80 port: 3773,
81 }),
82 ),
83 ),
84 );
85 },
86);