mirror of
https://github.com/linkwarden/linkwarden.git
synced 2026-06-30 07:46:13 +00:00
56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import {
|
|
afterEach,
|
|
beforeEach,
|
|
describe,
|
|
expect,
|
|
it,
|
|
vi,
|
|
} from "vitest";
|
|
import { ArchivedFormat } from "@linkwarden/types/global";
|
|
import createPreservedFormatUrl, {
|
|
decodePreservedFormatToken,
|
|
} from "./createPreservedFormatUrl";
|
|
|
|
describe("createPreservedFormatUrl", () => {
|
|
beforeEach(() => {
|
|
vi.stubEnv(
|
|
"NEXT_PUBLIC_USER_CONTENT_DOMAIN",
|
|
"https://content.example.com"
|
|
);
|
|
vi.stubEnv("NEXTAUTH_SECRET", "test-secret");
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllEnvs();
|
|
});
|
|
|
|
it("creates a signed preserved-format URL", async () => {
|
|
const url = await createPreservedFormatUrl({
|
|
linkId: 42,
|
|
filePath: "archives/7/42.html",
|
|
format: ArchivedFormat.monolith,
|
|
});
|
|
|
|
const parsed = new URL(url);
|
|
expect(parsed.origin).toBe("https://content.example.com");
|
|
expect(parsed.pathname).toBe("/api/v1/preserved/view");
|
|
|
|
const token = parsed.searchParams.get("token");
|
|
expect(token).toBeTruthy();
|
|
|
|
const decoded = await decodePreservedFormatToken(token as string);
|
|
expect(decoded).toMatchObject({
|
|
scope: "preserved-format",
|
|
linkId: 42,
|
|
filePath: "archives/7/42.html",
|
|
format: ArchivedFormat.monolith,
|
|
});
|
|
expect((decoded?.exp ?? 0) - (decoded?.iat ?? 0)).toBe(300);
|
|
});
|
|
|
|
it("rejects invalid tokens", async () => {
|
|
const decoded = await decodePreservedFormatToken("not-a-token");
|
|
expect(decoded).toBeNull();
|
|
});
|
|
});
|