refactor: unify channel config matching and gating
Co-authored-by: thewilloftheshadow <thewilloftheshadow@users.noreply.github.com>
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { buildChannelKeyCandidates, resolveChannelEntryMatch } from "./channel-config.js";
|
||||
import {
|
||||
buildChannelKeyCandidates,
|
||||
resolveChannelEntryMatch,
|
||||
resolveChannelEntryMatchWithFallback,
|
||||
} from "./channel-config.js";
|
||||
|
||||
describe("buildChannelKeyCandidates", () => {
|
||||
it("dedupes and trims keys", () => {
|
||||
@@ -22,3 +26,44 @@ describe("resolveChannelEntryMatch", () => {
|
||||
expect(match.wildcardKey).toBe("*");
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveChannelEntryMatchWithFallback", () => {
|
||||
it("prefers direct matches over parent and wildcard", () => {
|
||||
const entries = { a: { allow: true }, parent: { allow: false }, "*": { allow: false } };
|
||||
const match = resolveChannelEntryMatchWithFallback({
|
||||
entries,
|
||||
keys: ["a"],
|
||||
parentKeys: ["parent"],
|
||||
wildcardKey: "*",
|
||||
});
|
||||
expect(match.entry).toBe(entries.a);
|
||||
expect(match.matchSource).toBe("direct");
|
||||
expect(match.matchKey).toBe("a");
|
||||
});
|
||||
|
||||
it("falls back to parent when direct misses", () => {
|
||||
const entries = { parent: { allow: false }, "*": { allow: true } };
|
||||
const match = resolveChannelEntryMatchWithFallback({
|
||||
entries,
|
||||
keys: ["missing"],
|
||||
parentKeys: ["parent"],
|
||||
wildcardKey: "*",
|
||||
});
|
||||
expect(match.entry).toBe(entries.parent);
|
||||
expect(match.matchSource).toBe("parent");
|
||||
expect(match.matchKey).toBe("parent");
|
||||
});
|
||||
|
||||
it("falls back to wildcard when no direct or parent match", () => {
|
||||
const entries = { "*": { allow: true } };
|
||||
const match = resolveChannelEntryMatchWithFallback({
|
||||
entries,
|
||||
keys: ["missing"],
|
||||
parentKeys: ["still-missing"],
|
||||
wildcardKey: "*",
|
||||
});
|
||||
expect(match.entry).toBe(entries["*"]);
|
||||
expect(match.matchSource).toBe("wildcard");
|
||||
expect(match.matchKey).toBe("*");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user