Docs/Skills and code/tests/

tests/queue-table-store.test.js

Code67 lines4.6 KBtests/

import test from "node:test";
import assert from "node:assert/strict";
import Database from "better-sqlite3";
import { ensureQueueTables, migrateLegacyQueueScores, persistQueueRatings, QUEUE_TABLES } from "../src/analysis/queue-table-store.js";

function fixture() {
  const db = new Database(":memory:");
  db.exec(`CREATE TABLE channels(channel_url TEXT PRIMARY KEY, name TEXT); INSERT INTO channels VALUES ('https://youtube.com/@a','A');
    CREATE TABLE channel_metadata(channel_url TEXT PRIMARY KEY, name TEXT);
    CREATE TABLE channel_queue_runs(run_id TEXT PRIMARY KEY, scoring_version TEXT NOT NULL, generated_at TEXT NOT NULL, source_priority_run_id TEXT, config_json TEXT NOT NULL, channel_count INTEGER NOT NULL, queue_count INTEGER NOT NULL, created_at TEXT NOT NULL);
    CREATE TABLE channel_queue_scores(run_id TEXT NOT NULL, channel_url TEXT NOT NULL, queue_key TEXT NOT NULL, score REAL, confidence REAL NOT NULL, coverage REAL NOT NULL, sample_size INTEGER NOT NULL, status TEXT NOT NULL, rank INTEGER, reason_codes_json TEXT NOT NULL, evidence_refs_json TEXT NOT NULL, components_json TEXT NOT NULL, rationale TEXT NOT NULL, generated_at TEXT NOT NULL, PRIMARY KEY(run_id, channel_url, queue_key));`);
  return db;
}

test("creates five dedicated queue tables with final score and evidence columns", () => {
  const db = fixture(); ensureQueueTables(db);
  assert.equal(Object.keys(QUEUE_TABLES).length, 5);
  assert.equal(new Set(Object.values(QUEUE_TABLES)).size, 5);
  for (const table of Object.values(QUEUE_TABLES)) {
    const columns = db.prepare(`PRAGMA table_info(${table})`).all().map(row => row.name);
    assert.ok(columns.includes("final_channel_score"));
    assert.ok(columns.includes("evidence_json"));
    assert.ok(columns.includes("components_json"));
    assert.ok(columns.includes("rationale"));
  }
  db.close();
});

test("persists a separate row and complete evidence payload for every queue rating", () => {
  const db = fixture();
  const channels = [{ channel_url: "https://youtube.com/@a", name: "A", subscriber_count: 1000,
    priority: { specialist_score: 70 }, profile: { channel_summary: "must not persist as a queue input" }, videos: [] }];
  const ratings = Object.keys(QUEUE_TABLES).map((queue_key, i) => ({ channel_url: channels[0].channel_url, queue: {
    queue_key, score: 60 + i, confidence: 80, coverage: 90, sample_size: 12, status: "provisional", rank: 1,
    reason_codes: ["test_reason"], evidence_refs: ["https://example.test/evidence"], components: [{ name: "test", score: 65, weight: 1, evidence: "known input" }], rationale: "test rationale", evidence: { method: "test" }
  } }));
  const count = persistQueueRatings(db, { runId: "run-1", generatedAt: "2026-10-12T00:00:00Z", channels, ratings, config: {} });
  assert.equal(count, 5);
  for (const [key, table] of Object.entries(QUEUE_TABLES)) {
    const row = db.prepare(`SELECT * FROM ${table}`).get();
    assert.equal(row.final_channel_score, 60 + Object.keys(QUEUE_TABLES).indexOf(key));
    const evidence = JSON.parse(row.evidence_json);
    assert.equal(evidence.queue_key, key);
    assert.equal(evidence.rationale, "test rationale");
    assert.equal(evidence.components[0].evidence, "known input");
    assert.equal(evidence.evidence_schema_version, "queue-evidence-v3-raw-metadata-only");
    assert.equal(JSON.stringify(evidence).includes("must not persist as a queue input"), false);
    assert.equal(JSON.stringify(evidence).includes("specialist_score"), false);
  }
  assert.equal(db.prepare("SELECT COUNT(*) n FROM channel_queue_scores").get().n, 5, "legacy compatibility table remains populated");
  db.close();
});

test("migrates historical generic queue rows into dedicated tables without duplicating", () => {
  const db = fixture(); ensureQueueTables(db);
  db.prepare("INSERT INTO channel_queue_runs VALUES (?, ?, ?, ?, ?, ?, ?, ?)").run("old-run", "v1", "2026-10-11T00:00:00Z", null, "{}", 1, 5, "2026-10-11T00:00:00Z");
  db.prepare("INSERT INTO channel_queue_scores VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").run("old-run", "https://youtube.com/@a", "breaking_out", 73, 50, 80, 8, "provisional", 1, '["old_reason"]', '["vid-ref"]', '[{"name":"old","score":73}]', "old rationale", "2026-10-11T00:00:00Z");
  const first = migrateLegacyQueueScores(db);
  const second = migrateLegacyQueueScores(db);
  assert.equal(first.migratedRows, 1);
  assert.equal(second.migratedRows, 0);
  const row = db.prepare(`SELECT * FROM ${QUEUE_TABLES.breaking_out}`).get();
  assert.equal(row.final_channel_score, 73);
  assert.equal(JSON.parse(row.evidence_json).migration_source, "channel_queue_scores");
  db.close();
});

Shown as it is in the repository at build time (2026-11-03); the home directory appears as <home>. If this page and the file differ, the file is right. Back to the catalogue.