BlueSky & more on desktop
lazurite.stormlightlabs.org/
tauri
rust
typescript
bluesky
appview
atproto
solid
1import { fireEvent, render, screen, waitFor } from "@solidjs/testing-library";
2import { beforeEach, describe, expect, it, vi } from "vitest";
3import { AddColumnPanel } from "../AddColumnPanel";
4
5const getFeedGeneratorsMock = vi.hoisted(() => vi.fn());
6const getPreferencesMock = vi.hoisted(() => vi.fn());
7
8vi.mock(
9 "$/lib/api/feeds",
10 () => ({ FeedController: { getFeedGenerators: getFeedGeneratorsMock, getPreferences: getPreferencesMock } }),
11);
12vi.mock("@tauri-apps/plugin-log", () => ({ error: vi.fn(), info: vi.fn(), warn: vi.fn() }));
13
14describe("AddColumnPanel", () => {
15 beforeEach(() => {
16 vi.resetAllMocks();
17 getFeedGeneratorsMock.mockResolvedValue({ feeds: [] });
18 getPreferencesMock.mockResolvedValue({
19 feedViewPrefs: [],
20 savedFeeds: [{ id: "following", pinned: true, type: "timeline", value: "following" }],
21 });
22 });
23
24 it("renders the picker when open", async () => {
25 render(() => <AddColumnPanel open={true} onAdd={vi.fn()} onClose={vi.fn()} />);
26
27 expect(await screen.findByRole("dialog")).toBeInTheDocument();
28 expect(await screen.findByText("Add column")).toBeInTheDocument();
29 expect(await screen.findByText("Following")).toBeInTheDocument();
30 });
31
32 it("submits the selected feed as a deck column", async () => {
33 const onAdd = vi.fn();
34
35 render(() => <AddColumnPanel open={true} onAdd={onAdd} onClose={vi.fn()} />);
36
37 fireEvent.click(await screen.findByRole("button", { name: /timeline/i }));
38
39 await waitFor(() =>
40 expect(onAdd).toHaveBeenCalledWith(
41 "feed",
42 JSON.stringify({ feedType: "timeline", feedUri: "following", title: "Following" }),
43 )
44 );
45 });
46
47 it("hydrates feed generator labels in the picker and submission config", async () => {
48 const onAdd = vi.fn();
49 getPreferencesMock.mockResolvedValue({
50 feedViewPrefs: [],
51 savedFeeds: [{
52 id: "at://did:plc:alice/app.bsky.feed.generator/for-you",
53 pinned: true,
54 type: "feed",
55 value: "at://did:plc:alice/app.bsky.feed.generator/for-you",
56 }],
57 });
58 getFeedGeneratorsMock.mockResolvedValue({
59 feeds: [{
60 avatar: "https://cdn.example.com/for-you.png",
61 did: "did:plc:alice",
62 displayName: "For You",
63 uri: "at://did:plc:alice/app.bsky.feed.generator/for-you",
64 }],
65 });
66
67 render(() => <AddColumnPanel open={true} onAdd={onAdd} onClose={vi.fn()} />);
68
69 expect(await screen.findByText("For You")).toBeInTheDocument();
70 expect(document.querySelector("img[src=\"https://cdn.example.com/for-you.png\"]")).toBeTruthy();
71
72 fireEvent.click(await screen.findByRole("button", { name: /for you/i }));
73
74 await waitFor(() =>
75 expect(onAdd).toHaveBeenCalledWith(
76 "feed",
77 JSON.stringify({
78 feedType: "feed",
79 feedUri: "at://did:plc:alice/app.bsky.feed.generator/for-you",
80 title: "For You",
81 }),
82 )
83 );
84 });
85});