- list_channels no longer computes the Normal/Shorts/Live aggregation the frontend stopped reading when R14 dropped the N/S/L table column; the dead ManagedChannel.count_* fields are gone too. - Immediate "get full history" backfill now coordinates with the paced scheduler via a small in-flight set: capped at 2 concurrent + per-channel dedup, and run_deep_backfill skips a channel an immediate backfill owns — killing the cursor race and bounding the quota-drain burst, without losing the speed win. - Add test_channel_backfill.py: the channelDetail N/S/L counts + the guard's no-op / cap / scheduler-skip behaviour. - Inline the syncedChannels useMemo (its dep is a fresh array each render, so it never cached); fix the stale "~2-min ticks" comment (it's 10 minutes).
54 lines
1.9 KiB
TypeScript
54 lines
1.9 KiB
TypeScript
// @vitest-environment jsdom
|
|
//
|
|
// applySyncFilter is the sync-status pre-filter the top chips drive (R14 retired the Sync column and
|
|
// folded its status into a Stored charm). It replaced a column `filter.test`, so it carries the exact
|
|
// "fully" | "needsFull" | "" vocab + predicate — asserted here so a regression can't silently change
|
|
// which channels the top chips show.
|
|
import { describe, it, expect } from "vitest";
|
|
import { applySyncFilter } from "./channelColumns";
|
|
import { type ManagedChannel } from "../lib/api";
|
|
|
|
const ch = (over: Partial<ManagedChannel>): ManagedChannel => ({
|
|
id: "c",
|
|
title: null,
|
|
handle: null,
|
|
thumbnail_url: null,
|
|
subscriber_count: null,
|
|
video_count: null,
|
|
description: null,
|
|
stored_videos: 0,
|
|
last_video_at: null,
|
|
total_duration_seconds: 0,
|
|
priority: 0,
|
|
hidden: false,
|
|
deep_requested: false,
|
|
deep_in_queue: false,
|
|
tag_ids: [],
|
|
details_synced: false,
|
|
recent_synced: false,
|
|
backfill_done: false,
|
|
...over,
|
|
});
|
|
|
|
const rows = [
|
|
ch({ id: "fully", recent_synced: true, backfill_done: true }),
|
|
ch({ id: "recentOnly", recent_synced: true, backfill_done: false }),
|
|
ch({ id: "none", recent_synced: false, backfill_done: false }),
|
|
];
|
|
|
|
describe("applySyncFilter", () => {
|
|
it("returns every row for the empty/all value (and unknown values)", () => {
|
|
expect(applySyncFilter(rows, "").map((r) => r.id)).toEqual(["fully", "recentOnly", "none"]);
|
|
expect(applySyncFilter(rows, undefined)).toHaveLength(3);
|
|
expect(applySyncFilter(rows, "bogus")).toHaveLength(3);
|
|
});
|
|
|
|
it("'fully' keeps only channels with recent uploads AND full history in", () => {
|
|
expect(applySyncFilter(rows, "fully").map((r) => r.id)).toEqual(["fully"]);
|
|
});
|
|
|
|
it("'needsFull' keeps every channel whose back-catalogue is not done", () => {
|
|
expect(applySyncFilter(rows, "needsFull").map((r) => r.id)).toEqual(["recentOnly", "none"]);
|
|
});
|
|
});
|