import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, fireEvent, waitFor } from "@testing-library/react"; import RelatedArticles from "../../app/components/RelatedArticles"; // Mock ContentThumbnailTemplate vi.mock("../../app/components/ContentThumbnailTemplate", () => ({ default: ({ post, variant }) => (

{post.frontmatter?.title || "Untitled"}

{post.frontmatter?.description || "No description"}

), })); // Mock blog post data const mockRelatedPosts = [ { 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", }, }, { slug: "operational-security-mutual-aid", frontmatter: { title: "Operational Security for Mutual Aid", description: "Tactics to protect members, secure communication, and prevent infiltration", 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", }, }, { slug: "building-community-trust", frontmatter: { title: "Building Community Trust", description: "Strategies for fostering trust in community organizations", author: "Test Author", date: "2025-04-12", }, }, ]; describe("Related Articles Integration", () => { beforeEach(() => { // Mock window.innerWidth for responsive tests Object.defineProperty(window, "innerWidth", { writable: true, configurable: true, value: 1024, // Desktop width }); }); it("should filter out current post from related articles", () => { render( ); // Current post should not be displayed expect( screen.queryByTestId("thumbnail-resolving-active-conflicts") ).not.toBeInTheDocument(); // Other posts should be displayed expect( screen.getByTestId("thumbnail-operational-security-mutual-aid") ).toBeInTheDocument(); expect( screen.getByTestId("thumbnail-making-decisions-without-hierarchy") ).toBeInTheDocument(); expect( screen.getByTestId("thumbnail-building-community-trust") ).toBeInTheDocument(); }); it("should display all posts when no current post is specified", () => { render(); // All posts should be displayed expect( screen.getByTestId("thumbnail-resolving-active-conflicts") ).toBeInTheDocument(); expect( screen.getByTestId("thumbnail-operational-security-mutual-aid") ).toBeInTheDocument(); expect( screen.getByTestId("thumbnail-making-decisions-without-hierarchy") ).toBeInTheDocument(); expect( screen.getByTestId("thumbnail-building-community-trust") ).toBeInTheDocument(); }); it("should create correct links for each thumbnail", () => { render( ); // Verify links are created correctly expect( screen.getByTestId("thumbnail-link-operational-security-mutual-aid") ).toHaveAttribute("href", "/blog/operational-security-mutual-aid"); expect( screen.getByTestId("thumbnail-link-making-decisions-without-hierarchy") ).toHaveAttribute("href", "/blog/making-decisions-without-hierarchy"); expect( screen.getByTestId("thumbnail-link-building-community-trust") ).toHaveAttribute("href", "/blog/building-community-trust"); }); it("should handle empty related posts array", () => { const { container } = render( ); expect(container.firstChild).toBeNull(); }); it("should handle single related post", () => { const singlePost = [mockRelatedPosts[0]]; render( ); expect( screen.getByTestId("thumbnail-resolving-active-conflicts") ).toBeInTheDocument(); expect( screen.queryByTestId("thumbnail-operational-security-mutual-aid") ).not.toBeInTheDocument(); }); it("should handle all posts being filtered out", () => { const currentPostOnly = [mockRelatedPosts[0]]; const { container } = render( ); expect(container.firstChild).toBeNull(); }); it("should display section heading", () => { render( ); expect(screen.getByRole("heading", { level: 2 })).toHaveTextContent( "Related Articles" ); }); it("should maintain consistent structure across different current posts", () => { const slugs = [ "resolving-active-conflicts", "operational-security-mutual-aid", "making-decisions-without-hierarchy", ]; slugs.forEach((slug) => { const { unmount } = render( ); // Verify consistent structure expect(screen.getByRole("heading", { level: 2 })).toHaveTextContent( "Related Articles" ); // Check that we have some thumbnails (the exact ones depend on the current post) const thumbnails = screen.getAllByTestId(/thumbnail-/); expect(thumbnails.length).toBeGreaterThan(0); unmount(); }); }); });