import { api } from "$lib/api";
import Library from "$pages/Library";
import { cleanup, render, screen, waitFor } from "@solidjs/testing-library";
import type { JSX } from "solid-js";
import { afterEach, describe, expect, it, type Mock, vi } from "vitest";
vi.mock("$lib/api", () => ({ api: { search: vi.fn() } }));
vi.mock(
"@solidjs/router",
() => ({ A: (props: { href: string; children: JSX.Element }) => {props.children} }),
);
describe("Library page", () => {
afterEach(cleanup);
it("renders loading state initially", () => {
(api.search as Mock).mockReturnValue(new Promise(() => {}));
const { container } = render(() => );
expect(container.querySelector(".animate-spin")).toBeInTheDocument();
});
it("renders remote decks when loaded", async () => {
(api.search as Mock).mockResolvedValue({
ok: true,
json:
async () => [{
item_type: "deck",
item_id: "deck1",
creator_did: "did:plc:other",
data: {
title: "Federated Deck",
description: "From another server",
tags: ["remote"],
at_uri: "at://did:plc:other/org.stormlightlabs.malfestio.deck/deck1",
},
rank: 1,
source: "remote",
}],
});
render(() => );
await waitFor(() => expect(screen.getByText("Federated Deck")).toBeInTheDocument());
expect(screen.getByText("by did:plc:othe...")).toBeInTheDocument();
expect(screen.getByText("#remote")).toBeInTheDocument();
});
it("renders empty state when no content", async () => {
(api.search as Mock).mockResolvedValue({ ok: true, json: async () => [] });
render(() => );
await waitFor(() => expect(screen.getByText("No federated content found")).toBeInTheDocument());
});
});