Files
openclaw/src/plugin-sdk/provider-oauth-runtime.test.ts
2026-05-30 10:31:36 -04:00

47 lines
1.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
parseOAuthAuthorizationInput,
resolveOAuthTokenExpiresAt,
resolveOAuthTokenLifetimeMs,
} from "./provider-oauth-runtime.js";
describe("provider OAuth runtime", () => {
it("parses authorization code input from redirect URLs, query strings, and raw codes", () => {
expect(
parseOAuthAuthorizationInput("http://localhost/callback?code=oauth-code&state=oauth-state"),
).toEqual({ code: "oauth-code", state: "oauth-state" });
expect(parseOAuthAuthorizationInput("code=oauth-code&state=oauth-state")).toEqual({
code: "oauth-code",
state: "oauth-state",
});
expect(parseOAuthAuthorizationInput("oauth-code#oauth-state")).toEqual({
code: "oauth-code",
state: "oauth-state",
});
expect(parseOAuthAuthorizationInput(" oauth-code ")).toEqual({ code: "oauth-code" });
expect(parseOAuthAuthorizationInput(" ")).toEqual({});
});
it("resolves safe OAuth token lifetimes and expiry timestamps", () => {
expect(resolveOAuthTokenLifetimeMs("30")).toBe(30_000);
expect(resolveOAuthTokenExpiresAt(30, { nowMs: 1_000, refreshSkewMs: 5_000 })).toBe(26_000);
});
it("rejects invalid OAuth token lifetimes and Date-invalid expiries", () => {
expect(resolveOAuthTokenLifetimeMs(0)).toBeUndefined();
expect(resolveOAuthTokenLifetimeMs(1.5)).toBeUndefined();
expect(resolveOAuthTokenLifetimeMs(Number.MAX_SAFE_INTEGER)).toBeUndefined();
expect(resolveOAuthTokenExpiresAt(Number.MAX_SAFE_INTEGER, { nowMs: 1_000 })).toBeUndefined();
expect(
resolveOAuthTokenExpiresAt(30, {
nowMs: 8_640_000_000_000_000,
}),
).toBeUndefined();
expect(
resolveOAuthTokenExpiresAt(30, {
nowMs: 8_640_000_000_000_001,
}),
).toBeUndefined();
});
});