Files
llmapikey/tests/admin-keys-queries.test.js
tiennm99 616f133989 feat: add gated admin console for api_keys registry (list/search/filter/revoke/mint)
- env-allowlist authz via ADMIN_GITHUB_USER_IDS on numeric provider_id (no migration)
- server-side re-gated revoke + manual-mint actions
- parameterized search/filter/paginate queries
- shared mint-key extraction (DRY) from generate-key
- notFound() for non-admins (404 never leaks route existence)
- 3 unit-test suites (authz/queries/integration)
2026-06-13 21:16:57 +07:00

50 lines
1.9 KiB
JavaScript

import assert from "node:assert/strict";
import { test } from "node:test";
import { buildFilterDescriptor, clampInt } from "../lib/keys/admin-keys-filters.js";
// Pure filter-shape tests: prove which inputs become SQL predicates, without a
// live DB. The actual queries (admin-keys-queries.js) feed these descriptors
// into parameterized `postgres` fragments — values are never spliced into SQL.
test("buildFilterDescriptor: status filters only for pending/active", () => {
assert.deepEqual(buildFilterDescriptor({ status: "pending" }), {
statusFilter: "pending",
search: null,
});
assert.deepEqual(buildFilterDescriptor({ status: "active" }), {
statusFilter: "active",
search: null,
});
});
test("buildFilterDescriptor: 'all' / unknown / empty status → no predicate", () => {
assert.equal(buildFilterDescriptor({ status: "all" }).statusFilter, null);
assert.equal(buildFilterDescriptor({ status: "garbage" }).statusFilter, null);
assert.equal(buildFilterDescriptor({}).statusFilter, null);
});
test("buildFilterDescriptor: q is trimmed; blank → no search", () => {
assert.equal(buildFilterDescriptor({ q: " octocat " }).search, "octocat");
assert.equal(buildFilterDescriptor({ q: " " }).search, null);
assert.equal(buildFilterDescriptor({ q: "" }).search, null);
assert.equal(buildFilterDescriptor({}).search, null);
});
test("buildFilterDescriptor: combines status and search", () => {
assert.deepEqual(buildFilterDescriptor({ q: "42", status: "active" }), {
statusFilter: "active",
search: "42",
});
});
test("clampInt: clamps to range and falls back on non-numeric", () => {
assert.equal(clampInt(20, 1, 100, 20), 20);
assert.equal(clampInt(0, 1, 100, 20), 1);
assert.equal(clampInt(500, 1, 100, 20), 100);
assert.equal(clampInt(-5, 0, 100, 0), 0);
assert.equal(clampInt("abc", 1, 100, 20), 20);
assert.equal(clampInt(undefined, 1, 100, 20), 20);
assert.equal(clampInt(3.9, 1, 100, 20), 3); // truncates
});