diff --git a/frontend/testing/unit/components/Pagination.test.tsx b/frontend/testing/unit/components/Pagination.test.tsx
new file mode 100644
index 00000000..9c91808b
--- /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