Files
dbx/apps/desktop/src/lib/__tests__/diff/tableMultiSelect.spec.ts
T

97 lines
4.0 KiB
TypeScript
Vendored

import { describe, expect, it } from "vitest";
import { filterTableNames, isEveryFilteredSelected, toggleSelectFiltered, toggleTableName } from "@/lib/diff/tableMultiSelect";
describe("tableMultiSelect helpers", () => {
const tables = ["users", "active_users", "orders", "audit_log", "payments"];
describe("filterTableNames", () => {
it("returns all tables for an empty/whitespace query", () => {
expect(filterTableNames(tables, "")).toEqual(tables);
expect(filterTableNames(tables, " ")).toEqual(tables);
});
it("filters by case-insensitive substring", () => {
expect(filterTableNames(tables, "USER")).toEqual(["users", "active_users"]);
expect(filterTableNames(tables, "pay")).toEqual(["payments"]);
});
it("returns an empty list when nothing matches", () => {
expect(filterTableNames(tables, "zzz")).toEqual([]);
});
});
describe("toggleTableName", () => {
it("adds a table to the selection", () => {
expect(toggleTableName([], "users")).toEqual(["users"]);
expect(toggleTableName(["orders"], "users")).toEqual(["orders", "users"]);
});
it("removes a table from the selection", () => {
expect(toggleTableName(["users", "orders"], "users")).toEqual(["orders"]);
});
it("returns a new array and never duplicates", () => {
const input = ["users"];
const next = toggleTableName(input, "users");
expect(next).toEqual([]);
expect(next).not.toBe(input);
});
});
describe("isEveryFilteredSelected", () => {
it("is false for an empty filtered set", () => {
expect(isEveryFilteredSelected(["users"], [])).toBe(false);
});
it("is true only when every filtered table is selected", () => {
expect(isEveryFilteredSelected(["users", "orders"], ["users", "orders"])).toBe(true);
expect(isEveryFilteredSelected(["users"], ["users", "orders"])).toBe(false);
expect(isEveryFilteredSelected([], ["users"])).toBe(false);
});
});
describe("toggleSelectFiltered", () => {
it("selects all filtered tables when not all are selected (select-all)", () => {
const result = toggleSelectFiltered(["users"], [...tables]);
expect(result).toEqual([...tables]);
});
it("deselects all filtered tables when all are already selected (deselect-all)", () => {
const result = toggleSelectFiltered([...tables], [...tables]);
expect(result).toEqual([]);
});
it("only affects the filtered subset and preserves other selections", () => {
const filtered = ["users", "orders"];
const result = toggleSelectFiltered(["payments"], filtered);
expect(result).toEqual(["payments", "users", "orders"]);
});
it("after a search, select-all only toggles the current filtered subset", () => {
const filtered = filterTableNames(tables, "user"); // users, active_users
const selected = ["orders", "payments"];
const afterSelect = toggleSelectFiltered(selected, filtered);
expect([...afterSelect].sort()).toEqual(["active_users", "orders", "payments", "users"]);
});
it("keeps already-selected tables untouched by the filtered subset change", () => {
// simulating: selected [users, orders], search narrowed to [users], deselect-all removes only users
const filtered = ["users"];
const result = toggleSelectFiltered(["users", "orders"], filtered);
expect(result).toEqual(["orders"]);
});
});
it("selection persists across a changing search query (search is independent of selection)", () => {
// selection state is external; filtering only selects which rows are visible
const selected = ["users", "audit_log"];
const visibleA = filterTableNames(tables, "user");
const visibleB = filterTableNames(tables, "audit");
expect(visibleA).toEqual(["users", "active_users"]);
expect(visibleB).toEqual(["audit_log"]);
// both still reflect the same underlying selection
expect(isEveryFilteredSelected(selected, ["users"])).toBe(true);
expect(isEveryFilteredSelected(selected, ["audit_log"])).toBe(true);
});
});