import type { Note } from "$lib/model"; import type { WikiLink } from "$lib/wikilink"; import { cleanup, render, screen } from "@solidjs/testing-library"; import { JSX } from "solid-js"; import { afterEach, describe, expect, it, vi } from "vitest"; import { WikilinksPanel } from "../WikilinksPanel"; vi.mock( "@solidjs/router", () => ({ A: (props: { href: string; children: JSX.Element }) => {props.children} }), ); describe("WikilinksPanel", () => { afterEach(() => { cleanup(); vi.clearAllMocks(); }); const mockNotes: Note[] = [{ id: "note-1", owner_did: "did:plc:test", title: "Existing Note", body: "Content", tags: [], visibility: { type: "Private" }, created_at: "2026-01-01T00:00:00Z", updated_at: "2026-01-01T00:00:00Z", }]; const mockLinks: WikiLink[] = [{ raw: "[[Existing Note]]", title: "Existing Note", start: 0, end: 17 }, { raw: "[[Missing Note]]", title: "Missing Note", start: 20, end: 36, }, { raw: "[[Aliased|Display]]", title: "Aliased", alias: "Display", start: 40, end: 59 }]; const resolveNote = (title: string) => mockNotes.find((n) => n.title === title) ?? null; it("renders heading title", () => { render(() => null} />); expect(screen.getByText("Wikilinks")).toBeInTheDocument(); }); it("shows empty state when no links", () => { render(() => null} />); expect(screen.getByText("No outgoing links")).toBeInTheDocument(); }); it("renders resolved links as navigation links", () => { render(() => ); const existingLink = screen.getByRole("link", { name: /Existing Note/ }); expect(existingLink).toHaveAttribute("href", "/notes/note-1"); }); it("renders unresolved links with strikethrough", () => { render(() => ); const missingLink = screen.getByText("Missing Note"); expect(missingLink).toHaveClass("line-through"); }); it("deduplicates links by title", () => { const duplicateLinks: WikiLink[] = [{ raw: "[[Same]]", title: "Same", start: 0, end: 8 }, { raw: "[[Same]]", title: "Same", start: 10, end: 18, }]; render(() => null} />); const sameLinks = screen.getAllByText("Same"); expect(sameLinks).toHaveLength(1); }); });