← Files DataARCHIVED FILE

templates/data-app/base/tests/inline-edited-source.test.mjs

8.65 KB · Sep 30, 2026 · 23:19 UTC

↓ Download file

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import test from "node:test";
import { runInNewContext } from "node:vm";

import { chartDataShape } from "../src/charting/chart-data-shape.js";
import { chartAnnotationFields } from "../src/charting/chart-annotations.js";
import { resolveChartSpec } from "../src/charting/chart-overrides.js";
import { reviewedSource, scopedMetricDefinitions } from "../src/source-provenance.js";

const inspector = await readFile(new URL("../src/components/SourceInspector.jsx", import.meta.url), "utf8");
const start = inspector.indexOf("function componentEvidence(");
const end = inspector.indexOf("  const dateRange =", start);
assert.ok(start >= 0 && end > start, "The canonical inspector's provenance scope must be present");
const scope = `${inspector.slice(start, end)}\nreturn { chart, displayedFields, visibleDefinitions, source };\n}\nresult = componentEvidence({ component, query, rows, chartOverride, chartEdited });`;

// Exercise the canonical component's dependency-free scope calculation without a JSX loader.
function resolve({ component, query, rows = query.rows, chartEdited = false, chartOverrides }) {
  const sandbox = {
    chartDataShape,
    chartAnnotationFields,
    resolveChartSpec,
    reviewedSource,
    scopedMetricDefinitions,
    chartOverride: chartOverrides?.[component.id],
    component,
    query,
    rows,
    chartEdited,
  };
  runInNewContext(scope, sandbox);
  return sandbox.result;
}

const definition = (field, componentIds) => ({
  label: field,
  definition: `Reviewed ${field}.`,
  field,
  ...(componentIds ? { componentIds } : {}),
});
const visibleFields = (result) => result.visibleDefinitions.map(({ field }) => field);
const freeze = (value) => {
  if (value && typeof value === "object") {
    Object.values(value).forEach(freeze);
    Object.freeze(value);
  }
  return value;
};

test("inline source scoping is an explicit opt-in forwarded through the shared sidebar", () => {
  assert.match(inspector, /export function SourceInspector\(\{[^}]*chartEdited = false/u);
  assert.match(inspector, /export function SourceSidebar\(\{[^}]*chartEdited = false/u);
  assert.match(inspector, /<SourceInspector\b[^>]*chartEdited=\{chartEdited\}/u);

  const component = { id: "trend", chart: { type: "line", x: "week", y: "active" } };
  const query = {
    rows: [{ week: "2026-08-10", active: 10, replacement: 2 }],
    source: {
      metricDefinitions: [
        definition("week"),
        definition("authored-methodology", ["trend"]),
        definition("replacement", ["other-component"]),
      ],
    },
  };
  assert.deepEqual(visibleFields(resolve({ component, query })), ["authored-methodology"]);
  assert.deepEqual(
    visibleFields(resolve({ component: { ...component, title: "A revised title" }, query })),
    ["authored-methodology"],
    "Copy-only changes preserve the original component-owned definitions",
  );

  const override = { type: "bar", x: "week", y: "replacement" };
  const chartOverrides = { trend: override };
  const durable = resolve({ component, query, chartOverrides });
  assert.deepEqual(durable.chart, override);
  assert.deepEqual([...durable.displayedFields], ["replacement"]);
  assert.deepEqual(visibleFields(durable), ["replacement"], "Durable override behavior remains unchanged by default");

  const explicit = resolve({ component, query, chartOverrides, chartEdited: true });
  assert.deepEqual(explicit.chart, override, "The durable shell's applied override remains authoritative");
  assert.deepEqual(visibleFields(explicit), ["week", "replacement"]);
});

test("edited long-form inline charts keep actual dimensions and reviewed metric dependencies", () => {
  const component = freeze({
    id: "usage-trend",
    queryId: "reviewed-usage",
    chart: { type: "line", x: "week", y: "wau", series: "country" },
  });
  const query = freeze({
    rows: [
      { week: "2026-08-03", country: "US", wau: 20, unrelated: 3 },
      { week: "2026-08-10", country: "CA", wau: null, unrelated: 4 },
    ],
    source: {
      label: "Approved usage snapshot",
      executedAt: "2026-08-18T12:00:00Z",
      filters: ["Product: ChatGPT"],
      evidenceFlow: [{ title: "Recorded snapshot", detail: "Reviewed weekly usage." }],
      metricDefinitions: [
        definition("week"),
        definition("country"),
        { ...definition("wau", ["usage-trend"]), dependencies: ["eligible-users"] },
        definition("eligible-users"),
        definition("unrelated", ["other-chart"]),
        definition("US"),
      ],
    },
  });
  const before = JSON.stringify({ component, query });
  const result = resolve({ component, query, chartEdited: true });

  assert.deepEqual([...result.displayedFields], ["wau", "week", "country"]);
  assert.deepEqual(visibleFields(result), ["week", "country", "wau", "eligible-users"]);
  assert.ok(!visibleFields(result).includes("US"), "Pivoted series labels are not raw field dependencies");
  assert.equal(result.source.sql, undefined);
  assert.deepEqual(result.source.links, []);
  assert.equal(result.source.executedAt, query.source.executedAt);
  assert.deepEqual(result.source.filters, query.source.filters);
  assert.deepEqual(result.source.evidenceFlow, query.source.evidenceFlow);
  assert.equal(
    JSON.stringify({ component, query }),
    before,
    "Source, rows, gaps, filters, and timestamps stay unchanged",
  );
});

test("cosmetic edits preserve a summary box plot's conceptual measure definition", () => {
  const originalChart = freeze({ type: "boxPlot", x: "segment", y: "latency" });
  const component = freeze({
    id: "latency-distribution",
    queryId: "reviewed-latency",
    chart: { ...originalChart, showLegend: false },
  });
  const summaryFields = ["minimum", "lowerQuartile", "median", "upperQuartile", "maximum"];
  const query = freeze({
    rows: [{ segment: "A", minimum: 1, lowerQuartile: 2, median: 3, upperQuartile: 4, maximum: 5 }],
    source: {
      label: "Reviewed latency summary",
      metricDefinitions: [
        definition("latency", [component.id]),
        definition("segment"),
        ...summaryFields.map((field) => definition(field)),
        definition("unrelated", ["other-chart"]),
      ],
    },
  });
  const before = JSON.stringify({ component, query });
  assert.ok(query.rows.every((row) => !Object.hasOwn(row, "latency")));
  assert.deepEqual(visibleFields(resolve({ component: { ...component, chart: originalChart }, query })), ["latency"]);

  const result = resolve({ component, query, chartEdited: true });
  assert.deepEqual([...result.displayedFields], ["latency", "segment", ...summaryFields]);
  assert.deepEqual(visibleFields(result), ["latency", "segment", ...summaryFields]);
  assert.ok(!visibleFields(result).includes("unrelated"));
  assert.equal(result.source.sql, undefined);
  assert.deepEqual(result.source.links, []);
  assert.equal(
    JSON.stringify({ component, query }),
    before,
    "A cosmetic edit cannot change reviewed summaries or source",
  );
});

test("edited inline provenance follows canonical special-chart dependencies", () => {
  const cases = [
    {
      chart: { type: "heatmap", x: "day", y: "count" },
      rows: [{ day: "Mon", hour: "09:00", count: 4, unrelated: 7 }],
      expected: ["day", "hour", "count"],
    },
    {
      chart: { type: "sankey", y: "count", stages: ["entry", "activation", "outcome"] },
      rows: [{ entry: "A", activation: "B", outcome: "C", count: 4, unrelated: 7 }],
      expected: ["entry", "activation", "outcome", "count"],
    },
    {
      chart: { type: "boxPlot", x: "segment", y: "median" },
      rows: [{ segment: "A", minimum: 1, lowerQuartile: 2, median: 3, upperQuartile: 4, maximum: 5, unrelated: 7 }],
      expected: ["segment", "minimum", "lowerQuartile", "median", "upperQuartile", "maximum"],
    },
    {
      chart: { type: "scatter", x: "growth", y: "active" },
      rows: [{ growth: 0.2, active: 10, country: "US", unrelated: 7 }],
      expected: ["growth", "active", "country"],
    },
    {
      chart: { type: "waterfall", x: "period", y: "amount" },
      rows: [{ period: "Start", amount: 10, isTotal: true, unrelated: 7 }],
      expected: ["period", "amount", "isTotal"],
    },
  ];

  for (const { chart, rows, expected } of cases) {
    const component = { id: "inline-chart", chart };
    const query = { rows, source: { metricDefinitions: Object.keys(rows[0]).map((field) => definition(field)) } };
    const result = resolve({ component, query, chartEdited: true });
    assert.deepEqual(
      [...result.displayedFields],
      [...new Set([chart.y, ...chartDataShape(chart, rows).rowFields].filter(Boolean))],
      chart.type,
    );
    assert.deepEqual(visibleFields(result), expected, `${chart.type} retains only its actual reviewed fields`);
  }
});

SHA-256: 45e4f1319530e9c11f328598760dca70135637f25359e790b6fa0850cf87acd6