Docs/Skills and code/tests/
tests/queue-table-store.test.js
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.