import { describe, expect, mock, test } from "bun:test"; mock.module("cloudflare:workers", () => ({ env: {}, waitUntil: () => undefined, })); const { redirectMatches } = await import("./oauth-clients"); describe("redirectMatches", () => { test("exact matches always pass", () => { expect(redirectMatches(["https://app.example/cb"], "https://app.example/cb")).toBe(true); }); test("an http loopback redirect may use any port", () => { expect(redirectMatches(["http://127.0.0.1/cb"], "http://127.0.0.1:53121/cb")).toBe(true); }); test("a registered https or custom-scheme redirect never matches a downgraded http loopback one", () => { expect(redirectMatches(["https://localhost/cb"], "http://localhost:8080/cb")).toBe(false); expect(redirectMatches(["myapp://localhost/cb"], "http://localhost:8080/cb")).toBe(false); }); test("path, query, host and credentials must match", () => { expect(redirectMatches(["http://127.0.0.1/cb"], "http://127.0.0.1:1/other")).toBe(false); expect(redirectMatches(["http://127.0.0.1/cb"], "http://localhost:1/cb")).toBe(false); expect(redirectMatches(["http://127.0.0.1/cb"], "http://user@127.0.0.1:1/cb")).toBe(false); }); });