import { describe, expect, it } from "vitest"; import { roleScopesAllow } from "./operator-scope-compat.js"; describe("roleScopesAllow", () => { it("allows empty requested scope lists regardless of granted scopes", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: [], allowedScopes: [], }), ).toBe(true); }); it("treats operator.read as satisfied by read/write/admin scopes", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.read"], allowedScopes: ["operator.read"], }), ).toBe(true); expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.read"], allowedScopes: ["operator.write"], }), ).toBe(true); expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.read"], allowedScopes: ["operator.admin"], }), ).toBe(true); }); it("treats operator.write as satisfied by write/admin scopes", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.write"], allowedScopes: ["operator.write"], }), ).toBe(true); expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.write"], allowedScopes: ["operator.admin"], }), ).toBe(true); }); it("treats operator.approvals/operator.pairing as satisfied by operator.admin", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.approvals"], allowedScopes: ["operator.admin"], }), ).toBe(true); expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.pairing"], allowedScopes: ["operator.admin"], }), ).toBe(true); }); it("does not treat operator.admin as satisfying non-operator scopes", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: ["system.run"], allowedScopes: ["operator.admin"], }), ).toBe(false); }); it("uses strict matching for non-operator roles", () => { expect( roleScopesAllow({ role: "node", requestedScopes: ["system.run"], allowedScopes: ["operator.admin", "system.run"], }), ).toBe(true); expect( roleScopesAllow({ role: "node", requestedScopes: ["system.run"], allowedScopes: ["operator.admin"], }), ).toBe(false); expect( roleScopesAllow({ role: " node ", requestedScopes: [" system.run ", "system.run", " "], allowedScopes: ["system.run", "operator.admin"], }), ).toBe(true); }); it("normalizes blank and duplicate scopes before evaluating", () => { expect( roleScopesAllow({ role: " operator ", requestedScopes: [" operator.read ", "operator.read", " "], allowedScopes: [" operator.write ", "operator.write", ""], }), ).toBe(true); }); it("rejects unsatisfied operator write scopes and empty allowed scopes", () => { expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.write"], allowedScopes: ["operator.read"], }), ).toBe(false); expect( roleScopesAllow({ role: "operator", requestedScopes: ["operator.read"], allowedScopes: [" "], }), ).toBe(false); }); });