import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import ContentThumbnailTemplate from "../../app/components/ContentThumbnailTemplate"; import RelatedArticles from "../../app/components/RelatedArticles"; // Mock Next.js navigation const mockPush = vi.fn(); vi.mock("next/navigation", () => ({ useRouter: () => ({ push: mockPush }), notFound: vi.fn(), usePathname: vi.fn(() => "/"), })); // Mock Next.js Link to trigger navigation vi.mock("next/link", () => ({ default: ({ children, href, ...props }) => ( { e.preventDefault(); mockPush(href); }} > {children} ), })); // Mock asset utils vi.mock("../../lib/assetUtils", () => ({ getAssetPath: vi.fn((asset) => `/assets/${asset}`), ASSETS: { CONTENT_THUMBNAIL_1: "Content_Thumbnail_1.svg", CONTENT_THUMBNAIL_2: "Content_Thumbnail_2.svg", CONTENT_THUMBNAIL_3: "Content_Thumbnail_3.svg", CONTENT_ICON_1: "Content_Icon_1.svg", CONTENT_ICON_2: "Content_Icon_2.svg", CONTENT_ICON_3: "Content_Icon_3.svg", }, })); const mockBlogPost = { slug: "resolving-active-conflicts", frontmatter: { title: "Resolving Active Conflicts", description: "Practical steps for resolving conflicts while maintaining trust", author: "Test Author", date: "2025-04-15", }, }; const mockRelatedPosts = [ { slug: "operational-security-mutual-aid", frontmatter: { title: "Operational Security for Mutual Aid", description: "Tactics to protect members, secure communication", author: "Test Author", date: "2025-04-14", }, }, { slug: "making-decisions-without-hierarchy", frontmatter: { title: "Making Decisions Without Hierarchy", description: "A brief guide to collaborative nonhierarchical decision making", author: "Test Author", date: "2025-04-13", }, }, ]; describe("Blog Navigation E2E", () => { beforeEach(() => { vi.clearAllMocks(); }); describe("ContentThumbnailTemplate Navigation", () => { it("should navigate to blog post when thumbnail is clicked", () => { render(); // Find the thumbnail link const thumbnailLink = screen.getByRole("link"); expect(thumbnailLink).toBeInTheDocument(); expect(thumbnailLink).toHaveAttribute( "href", "/blog/resolving-active-conflicts", ); // Click the thumbnail fireEvent.click(thumbnailLink); // Verify navigation was called expect(mockPush).toHaveBeenCalledWith("/blog/resolving-active-conflicts"); }); it("should display correct post information", () => { render(); // Verify post content is displayed expect( screen.getByText("Resolving Active Conflicts"), ).toBeInTheDocument(); expect( screen.getByText( "Practical steps for resolving conflicts while maintaining trust", ), ).toBeInTheDocument(); expect(screen.getByText("Test Author")).toBeInTheDocument(); expect(screen.getByText("April 2025")).toBeInTheDocument(); }); it("should render with correct variant based on screen size", () => { render(); // Verify the thumbnail container exists const thumbnailContainer = screen.getByRole("link").closest("div"); expect(thumbnailContainer).toBeInTheDocument(); }); }); describe("RelatedArticles Navigation", () => { it("should display related articles with correct links", () => { render(); // Verify related articles are displayed expect( screen.getByText("Operational Security for Mutual Aid"), ).toBeInTheDocument(); expect( screen.getByText("Making Decisions Without Hierarchy"), ).toBeInTheDocument(); // Verify links are present const relatedLinks = screen.getAllByRole("link"); expect(relatedLinks).toHaveLength(2); expect(relatedLinks[0]).toHaveAttribute( "href", "/blog/operational-security-mutual-aid", ); expect(relatedLinks[1]).toHaveAttribute( "href", "/blog/making-decisions-without-hierarchy", ); }); it("should navigate to related article when clicked", () => { render(); // Find and click first related article const firstRelatedLink = screen .getByText("Operational Security for Mutual Aid") .closest("a"); expect(firstRelatedLink).toBeInTheDocument(); fireEvent.click(firstRelatedLink); // Verify navigation was called expect(mockPush).toHaveBeenCalledWith( "/blog/operational-security-mutual-aid", ); }); it("should handle empty related posts gracefully", () => { const { container } = render(); // Should not crash and should render nothing (component returns null) expect(container.firstChild).toBeNull(); }); }); describe("Navigation Flow", () => { it("should complete navigation flow: thumbnail → related article", () => { // Render thumbnail const { rerender } = render( , ); // Click thumbnail const thumbnailLink = screen.getByRole("link"); fireEvent.click(thumbnailLink); expect(mockPush).toHaveBeenCalledWith("/blog/resolving-active-conflicts"); // Clear mocks and render related articles vi.clearAllMocks(); rerender(); // Click related article const relatedLink = screen .getByText("Operational Security for Mutual Aid") .closest("a"); fireEvent.click(relatedLink); expect(mockPush).toHaveBeenCalledWith( "/blog/operational-security-mutual-aid", ); }); }); });