97 lines
4.0 KiB
TypeScript
Vendored
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);
|
|
});
|
|
});
|