59 lines
2.4 KiB
TypeScript
59 lines
2.4 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
const poolConstructor = vi.hoisted(() => vi.fn());
|
|
|
|
vi.mock("pg", () => ({ Pool: poolConstructor }));
|
|
|
|
import { createAuthorizationDrizzleDatabase } from "../src/authorization/database.js";
|
|
import { AuthorizationStoreError, createAuthorizationStore } from "../src/authorization/store.js";
|
|
|
|
describe("Core authorization store — import and construction safety", () => {
|
|
it("does not construct a pool or open a connection merely because the module is imported", () => {
|
|
expect(poolConstructor).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("does not perform any query merely because the store is constructed", () => {
|
|
poolConstructor.mockImplementation(function fakePool() {
|
|
return { end: async () => undefined, on: vi.fn(), query: vi.fn() };
|
|
});
|
|
const { db } = createAuthorizationDrizzleDatabase("postgresql://example.test/ekklesia");
|
|
|
|
const store = createAuthorizationStore(db);
|
|
|
|
expect(store).toBeDefined();
|
|
expect(typeof store.createGrant).toBe("function");
|
|
expect(typeof store.revokeGrant).toBe("function");
|
|
expect(typeof store.hasActiveGrant).toBe("function");
|
|
expect(typeof store.grantPlatformOwner).toBe("function");
|
|
expect(typeof store.revokePlatformOwner).toBe("function");
|
|
expect(typeof store.isPlatformOwner).toBe("function");
|
|
expect(Object.isFrozen(store)).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("AuthorizationStoreError", () => {
|
|
it.each([
|
|
"AUTHORIZATION_GRANT_CREATE_FAILED",
|
|
"AUTHORIZATION_GRANT_LOOKUP_FAILED",
|
|
"AUTHORIZATION_GRANT_NOT_FOUND",
|
|
"AUTHORIZATION_GRANT_REVOKE_FAILED",
|
|
"AUTHORIZATION_PLATFORM_OWNER_LOOKUP_FAILED",
|
|
"AUTHORIZATION_PLATFORM_OWNER_MUTATION_FAILED",
|
|
"AUTHORIZATION_PLATFORM_OWNER_NOT_FOUND",
|
|
] as const)("exposes a stable code and a fixed, generic message for %s", (code) => {
|
|
const error = new AuthorizationStoreError(code);
|
|
expect(error.code).toBe(code);
|
|
expect(error.name).toBe("AuthorizationStoreError");
|
|
expect(Object.isFrozen(error)).toBe(true);
|
|
expect(error.message.length).toBeGreaterThan(0);
|
|
});
|
|
|
|
it("never carries a cause, raw driver error, SQL, or stack detail beyond the fixed message", () => {
|
|
const error = new AuthorizationStoreError("AUTHORIZATION_GRANT_CREATE_FAILED");
|
|
const publicText = `${String(error)}\n${error.stack ?? ""}`;
|
|
expect(publicText).toBe(
|
|
`AuthorizationStoreError: ${error.message}\nAuthorizationStoreError: ${error.message}`,
|
|
);
|
|
});
|
|
});
|