From 1f721754620af7c6f1a8980622d8a56d614d0f06 Mon Sep 17 00:00:00 2001 From: jess2937 Date: Sun, 7 Jun 2026 22:28:08 +0530 Subject: [PATCH 1/2] test: add unit tests for usePreferredExportFormat hook --- .../hooks/usePreferredExportFormat.test.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 frontend/testing/unit/hooks/usePreferredExportFormat.test.ts diff --git a/frontend/testing/unit/hooks/usePreferredExportFormat.test.ts b/frontend/testing/unit/hooks/usePreferredExportFormat.test.ts new file mode 100644 index 000000000..91d336bbc --- /dev/null +++ b/frontend/testing/unit/hooks/usePreferredExportFormat.test.ts @@ -0,0 +1,37 @@ +import { renderHook, act } from '@testing-library/react' +import { usePreferredExportFormat } from "../../../src/hooks/usePreferredExportFormat"; + +const STORAGE_KEY = 'secuscan:preferred-export-format' + +beforeEach(() => { + localStorage.clear() +}) + +describe('usePreferredExportFormat', () => { + it('returns null as default when no preference is stored', () => { + const { result } = renderHook(() => usePreferredExportFormat()) + expect(result.current.preferred).toBeNull() + }) + + it('returns stored preference from localStorage on mount', () => { + localStorage.setItem(STORAGE_KEY, 'pdf') + const { result } = renderHook(() => usePreferredExportFormat()) + expect(result.current.preferred).toBe('pdf') + }) + + it('saves preference to localStorage when savePreference is called', () => { + const { result } = renderHook(() => usePreferredExportFormat()) + act(() => { + result.current.savePreference('csv') + }) + expect(localStorage.getItem(STORAGE_KEY)).toBe('csv') + }) + + it('updates preferred state when savePreference is called', () => { + const { result } = renderHook(() => usePreferredExportFormat()) + act(() => { + result.current.savePreference('json') + }) + expect(result.current.preferred).toBe('json') + }) +}) \ No newline at end of file From 8ff7ebc7f6dec2c2013f55f1062a20d3eb9191eb Mon Sep 17 00:00:00 2001 From: jess2937 Date: Tue, 9 Jun 2026 22:08:37 +0530 Subject: [PATCH 2/2] test: add Pagination component coverage (#554) --- .../unit/components/Pagination.test.tsx | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 frontend/testing/unit/components/Pagination.test.tsx diff --git a/frontend/testing/unit/components/Pagination.test.tsx b/frontend/testing/unit/components/Pagination.test.tsx new file mode 100644 index 000000000..9c91808bd --- /dev/null +++ b/frontend/testing/unit/components/Pagination.test.tsx @@ -0,0 +1,62 @@ +import { render, screen } from "@testing-library/react"; +import Pagination from "../../../src/components/Pagination"; + +describe("Pagination", () => { + const defaultProps = { + page: 1, + total: 100, + limit: 10, + loading: false, + onPrev: vi.fn(), + onNext: vi.fn(), + }; + + // Range math tests + it("shows correct start and end for first page", () => { + render(); + expect(screen.getByText("1–10")).toBeInTheDocument(); + }); + + it("shows correct start and end for middle page", () => { + render(); + expect(screen.getByText("21–30")).toBeInTheDocument(); + }); + + it("shows correct end on last page with partial results", () => { + render(); + expect(screen.getByText("41–42")).toBeInTheDocument(); + }); + + it("shows 0 start and 0 end when total is 0", () => { + render(); + expect(screen.getByText("0–0")).toBeInTheDocument(); + }); + + // Disabled state tests + it("disables prev button on first page", () => { + render(); + expect(screen.getByText("Prev_Page").closest("button")).toBeDisabled(); + }); + + it("enables next button when not on last page", () => { + render(); + expect(screen.getByText("Next_Page").closest("button")).not.toBeDisabled(); + }); + + it("disables next button on last page", () => { + render(); + expect(screen.getByText("Next_Page").closest("button")).toBeDisabled(); + }); + + it("disables both buttons when total is 0", () => { + render(); + expect(screen.getByText("Prev_Page").closest("button")).toBeDisabled(); + expect(screen.getByText("Next_Page").closest("button")).toBeDisabled(); + }); + + it("disables both buttons when loading", () => { + render(); + expect(screen.getByText("Prev_Page").closest("button")).toBeDisabled(); + expect(screen.getByText("Next_Page").closest("button")).toBeDisabled(); + }); +}) \ No newline at end of file