Files
2026-07-13 13:39:12 +08:00

73 lines
2.4 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import {
parseAndValidateAgyToken,
AgyAuthFileError,
} from "../../src/lib/oauth/utils/agyAuthImport.ts";
// Fixture token values are deliberately generic (not `ya29.`/`1//` shaped) so secret
// scanners don't flag them — the parser only cares that they are non-empty strings.
const ACCESS = "agy-access-token-fixture";
const REFRESH = "agy-refresh-token-fixture";
test("parses the nested agy token-file shape (token.* with ISO expiry, no id_token)", () => {
const parsed = parseAndValidateAgyToken({
token: {
access_token: ACCESS,
token_type: "Bearer",
refresh_token: REFRESH,
expiry: "2026-05-29T06:16:24.338-03:00",
},
auth_method: "consumer",
});
assert.equal(parsed.accessToken, ACCESS);
assert.equal(parsed.refreshToken, REFRESH);
assert.equal(parsed.tokenType, "Bearer");
assert.equal(parsed.authMethod, "consumer");
assert.equal(parsed.expiresAt, new Date("2026-05-29T06:16:24.338-03:00").toISOString());
});
test("accepts a flat fallback shape (access_token/refresh_token at top level)", () => {
const parsed = parseAndValidateAgyToken({
access_token: ACCESS,
refresh_token: REFRESH,
});
assert.equal(parsed.accessToken, ACCESS);
assert.equal(parsed.refreshToken, REFRESH);
assert.equal(parsed.tokenType, "Bearer"); // default
assert.equal(parsed.expiresAt, null);
});
test("supports unix-ms expiry_date as an alternative to ISO expiry", () => {
const ms = 1780038984000;
const parsed = parseAndValidateAgyToken({
token: { access_token: ACCESS, refresh_token: REFRESH, expiry_date: ms },
});
assert.equal(parsed.expiresAt, new Date(ms).toISOString());
});
test("rejects a token file missing access_token", () => {
assert.throws(
() => parseAndValidateAgyToken({ token: { refresh_token: REFRESH } }),
(err) =>
err instanceof AgyAuthFileError &&
err.code === "missing_access_token" &&
err.status === 400
);
});
test("rejects a token file missing refresh_token", () => {
assert.throws(
() => parseAndValidateAgyToken({ token: { access_token: ACCESS } }),
(err) => err instanceof AgyAuthFileError && err.code === "missing_refresh_token"
);
});
test("invalid/garbage expiry becomes null rather than throwing", () => {
const parsed = parseAndValidateAgyToken({
token: { access_token: ACCESS, refresh_token: REFRESH, expiry: "not-a-date" },
});
assert.equal(parsed.expiresAt, null);
});