// @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, tagsColumnTest } from "./channelColumns"; import { NO_TAG_SENTINEL, type ManagedChannel } from "../lib/api"; const ch = (over: Partial): 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"]); }); }); describe("tagsColumnTest (item B — 'No tag')", () => { const tagged = ch({ id: "tagged", tag_ids: [1, 2] }); const untagged = ch({ id: "untagged", tag_ids: [] }); it("the No-tag sentinel keeps only channels with no user tag", () => { expect(tagsColumnTest(tagged, [NO_TAG_SENTINEL])).toBe(false); expect(tagsColumnTest(untagged, [NO_TAG_SENTINEL])).toBe(true); }); it("real tag values match ANY selected id (sentinel absent)", () => { expect(tagsColumnTest(tagged, ["2"])).toBe(true); expect(tagsColumnTest(tagged, ["3"])).toBe(false); expect(tagsColumnTest(untagged, ["1"])).toBe(false); }); it("the sentinel wins if it somehow co-exists with real ids", () => { expect(tagsColumnTest(tagged, [NO_TAG_SENTINEL, "1"])).toBe(false); }); });