← Files DataARCHIVED FILE
templates/data-app/base/tests/section-filter-resolution.test.mjs
3.18 KB · Sep 30, 2026 · 23:19 UTC
import assert from "node:assert/strict";
import test from "node:test";
import { resolveSectionRows } from "../src/use-data-app.js";
test("multi-select intersects scopes and clears to the same aggregate-aware all state", () => {
const rows = [
{ region: "all", value: 30 }, { region: "EMEA", value: 10 },
{ region: "Americas", value: 12 }, { region: "APAC", value: 8 },
].map(Object.freeze);
const definitions = [{ id: "region", field: "region", multiple: true, queryIds: ["regional"] }];
const resolve = (value, localValue = "all", query = "regional", breakdown = []) => resolveSectionRows(
rows, definitions, { region: value }, definitions, { region: localValue }, query, breakdown,
);
assert.deepEqual(resolve(["EMEA", "Americas"]), rows.slice(1, 3));
assert.deepEqual(resolve(["EMEA", "Americas"], ["Americas", "APAC"]), [rows[2]]);
assert.deepEqual(resolve(["EMEA"], ["APAC"]), []);
assert.deepEqual(resolve([]), [rows[0]]);
assert.deepEqual(resolve([], [], "regional", ["region"]), rows.slice(1));
assert.deepEqual(resolve(["EMEA"], [], "unrelated"), rows);
});
test("section filters intersect page scope before aggregate collapse without sharing local IDs or mutating rows", () => {
const rows = [
{ segment: "all", value: 12 },
{ segment: "A", value: 7 },
{ segment: "B", value: 5 },
].map(Object.freeze);
Object.freeze(rows);
const page = [{ id: "segment", field: "segment", defaultValue: "all" }];
const local = [{ id: "segment", field: "segment", queryIds: ["scoped"], defaultValue: "all" }];
const resolve = (pageValue, localValue, query = "scoped", breakdown = []) => resolveSectionRows(
rows, page, { segment: pageValue }, local, { segment: localValue }, query, breakdown,
);
assert.deepEqual(resolve("all", "A"), [rows[1]], "Local scope must not filter already-collapsed page aggregate rows");
assert.deepEqual(resolve("A", "all"), [rows[1]], "All in a section must not broaden the page scope");
assert.deepEqual(resolve("A", "B"), [], "Conflicting scopes must be empty, not silently overridden");
assert.deepEqual(resolve("all", "A", "unrelated"), [rows[0]]);
assert.deepEqual(resolve("all", "all"), [rows[0]]);
assert.deepEqual(resolve("all", "all", "scoped", ["segment"]), rows.slice(1));
assert.deepEqual(resolveSectionRows(rows, page, {}, local, {}, "scoped"), [rows[0]]);
assert.equal(rows.length, 3);
});
test("section date ranges select only available scoped endpoints and preserve all-date history", () => {
const rows = [
{ week: "2026-07-06", segment: "A", value: 10 },
{ week: "2026-07-13", segment: "A", value: 15 },
{ week: "2026-07-20", segment: "B", value: 20 },
];
const page = [{ id: "segment", field: "segment", defaultValue: "A" }];
const local = [{ id: "period", field: "week", mode: "through", defaultValue: "all" }];
const resolve = (value, breakdown = []) => resolveSectionRows(rows, page, {}, local,
{ period: value }, "summary", breakdown);
assert.deepEqual(resolve("2026-07-06..2026-07-20"), [rows[1]]);
assert.deepEqual(resolve("2026-07-06..2026-07-20", ["week"]), rows.slice(0, 2));
assert.deepEqual(resolve("all"), rows.slice(0, 2));
assert.deepEqual(resolve("2026-08-01..2026-08-20"), []);
});
SHA-256: a86fdd6d7f638a10247b1dc50c6beba7e76ee2fc735bb6fcb4d003f2cf285333