import { fireEvent, render, screen, waitFor } from "@solidjs/testing-library"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { AddColumnPanel } from "../AddColumnPanel"; const getFeedGeneratorsMock = vi.hoisted(() => vi.fn()); const getPreferencesMock = vi.hoisted(() => vi.fn()); vi.mock( "$/lib/api/feeds", () => ({ FeedController: { getFeedGenerators: getFeedGeneratorsMock, getPreferences: getPreferencesMock } }), ); vi.mock("@tauri-apps/plugin-log", () => ({ error: vi.fn(), info: vi.fn(), warn: vi.fn() })); describe("AddColumnPanel", () => { beforeEach(() => { vi.resetAllMocks(); getFeedGeneratorsMock.mockResolvedValue({ feeds: [] }); getPreferencesMock.mockResolvedValue({ feedViewPrefs: [], savedFeeds: [{ id: "following", pinned: true, type: "timeline", value: "following" }], }); }); it("renders the picker when open", async () => { render(() => ); expect(await screen.findByRole("dialog")).toBeInTheDocument(); expect(await screen.findByText("Add column")).toBeInTheDocument(); expect(await screen.findByText("Following")).toBeInTheDocument(); }); it("submits the selected feed as a deck column", async () => { const onAdd = vi.fn(); render(() => ); fireEvent.click(await screen.findByRole("button", { name: /timeline/i })); await waitFor(() => expect(onAdd).toHaveBeenCalledWith( "feed", JSON.stringify({ feedType: "timeline", feedUri: "following", title: "Following" }), ) ); }); it("hydrates feed generator labels in the picker and submission config", async () => { const onAdd = vi.fn(); getPreferencesMock.mockResolvedValue({ feedViewPrefs: [], savedFeeds: [{ id: "at://did:plc:alice/app.bsky.feed.generator/for-you", pinned: true, type: "feed", value: "at://did:plc:alice/app.bsky.feed.generator/for-you", }], }); getFeedGeneratorsMock.mockResolvedValue({ feeds: [{ avatar: "https://cdn.example.com/for-you.png", did: "did:plc:alice", displayName: "For You", uri: "at://did:plc:alice/app.bsky.feed.generator/for-you", }], }); render(() => ); expect(await screen.findByText("For You")).toBeInTheDocument(); expect(document.querySelector("img[src=\"https://cdn.example.com/for-you.png\"]")).toBeTruthy(); fireEvent.click(await screen.findByRole("button", { name: /for you/i })); await waitFor(() => expect(onAdd).toHaveBeenCalledWith( "feed", JSON.stringify({ feedType: "feed", feedUri: "at://did:plc:alice/app.bsky.feed.generator/for-you", title: "For You", }), ) ); }); });