import { renderHook } from "@testing-library/react" import { describe, expect, it } from "vitest" import { useDedupedItems } from "./useDedupedItems" describe("useDedupedItems", () => { it("should return the original array if it has no duplicates", () => { const items = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Charlie" }, ] const { result } = renderHook(() => useDedupedItems(items, item => item?.id), ) expect(result.current).toHaveLength(3) expect(result.current).toEqual(items) }) it("should filter out duplicate items based on the key extractor", () => { const items = [ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 1, name: "Alice (duplicate)" }, { id: 3, name: "Charlie" }, { id: 2, name: "Bob (duplicate)" }, ] const { result } = renderHook(() => useDedupedItems(items, item => item?.id), ) expect(result.current).toHaveLength(3) expect(result.current).toEqual([ { id: 1, name: "Alice" }, { id: 2, name: "Bob" }, { id: 3, name: "Charlie" }, ]) }) it("should handle an empty array", () => { const { result } = renderHook(() => useDedupedItems([], () => undefined)) expect(result.current).toEqual([]) }) it("should use index as fallback key if key extractor returns undefined", () => { const items = [ { name: "Alice" }, { name: "Bob" }, { name: "Alice" }, // Same name but different index ] // Deliberately returning undefined to test fallback const { result } = renderHook(() => useDedupedItems(items, () => undefined as unknown as number), ) expect(result.current).toHaveLength(3) expect(result.current).toEqual(items) }) })