import { assertEquals, cleanup, fireEvent, render, screen } from "./setup.ts";
import PostList from "../../islands/PostList.tsx";
const mockPosts = [
{ id: "1", title: "First Post", content: "Hello world", shared: false },
{ id: "2", title: "Second Post", content: "Another post", shared: true },
{ id: "3", title: "", content: "", shared: false },
];
Deno.test({
name: "PostList - renders correct number of post cards",
fn() {
const { container } = render();
const cards = container.querySelectorAll(".grid > div");
assertEquals(cards.length, 3);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - displays post title",
fn() {
render();
assertEquals(screen.getByText("First Post") !== null, true);
assertEquals(screen.getByText("Second Post") !== null, true);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - shows Untitled for empty title",
fn() {
render();
assertEquals(screen.getByText("Untitled") !== null, true);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - displays post content snippet",
fn() {
render();
assertEquals(screen.getByText("Hello world") !== null, true);
assertEquals(screen.getByText("Another post") !== null, true);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - shows No content for empty content",
fn() {
render();
assertEquals(screen.getByText("No content") !== null, true);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - each card has an Edit button",
fn() {
render();
const editButtons = screen.getAllByText("Edit");
assertEquals(editButtons.length, 3);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - each card has a delete icon",
fn() {
const { container } = render();
const deleteIcons = container.querySelectorAll(".bi-x");
assertEquals(deleteIcons.length, 3);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - delete icon triggers $modal.show",
fn() {
let modalTitle = "";
let modalContent = "";
globalThis.$modal = {
show: (title: string, content: string | preact.JSX.Element) => {
modalTitle = title;
modalContent = content as string;
},
hide: () => {},
};
const { container } = render();
const deleteIcon = container.querySelector(".bi-x")!;
fireEvent.click(deleteIcon);
assertEquals(modalTitle, "Confirm delete");
assertEquals(modalContent.includes("First Post"), true);
delete globalThis.$modal;
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "PostList - renders empty grid with no posts",
fn() {
const { container } = render();
const cards = container.querySelectorAll(".grid > div");
assertEquals(cards.length, 0);
cleanup();
},
sanitizeResources: false,
sanitizeOps: false,
});