learn and share notes on atproto (wip) 馃
malfestio.stormlightlabs.org/
readability
solid
axum
atproto
srs
1import "fake-indexeddb/auto";
2import { db } from "$lib/db";
3import { cleanup, render, screen } from "@solidjs/testing-library";
4import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
6const mockSyncStore = vi.hoisted(() => ({
7 getAllLocalData: vi.fn(),
8 queueForSync: vi.fn(),
9 processQueue: vi.fn(),
10 clearAll: vi.fn(),
11}));
12
13vi.mock("$lib/sync-store", () => ({ syncStore: mockSyncStore }));
14vi.mock("$lib/api", () => ({ api: { resolveConflict: vi.fn().mockResolvedValue({ ok: true }) } }));
15
16import { SyncDataTable } from "../SyncDataTable";
17
18describe("SyncDataTable", () => {
19 beforeEach(async () => {
20 vi.clearAllMocks();
21 mockSyncStore.getAllLocalData.mockResolvedValue({ decks: [], notes: [], cards: [], queue: [] });
22 await db.decks.clear();
23 await db.notes.clear();
24 await db.cards.clear();
25 await db.syncQueue.clear();
26 });
27
28 afterEach(cleanup);
29
30 it("renders with empty state", async () => {
31 render(() => <SyncDataTable />);
32
33 await new Promise((r) => setTimeout(r, 100));
34
35 expect(screen.getByText("Records (0)")).toBeInTheDocument();
36 expect(screen.getByText("Queue (0)")).toBeInTheDocument();
37 });
38
39 it("renders records tab with data", async () => {
40 mockSyncStore.getAllLocalData.mockResolvedValue({
41 decks: [{
42 id: "deck-1",
43 title: "Test Deck",
44 syncStatus: "synced",
45 localVersion: 1,
46 updatedAt: new Date().toISOString(),
47 }],
48 notes: [],
49 cards: [],
50 queue: [],
51 });
52
53 render(() => <SyncDataTable />);
54
55 await new Promise((r) => setTimeout(r, 100));
56
57 expect(screen.getByText("Records (1)")).toBeInTheDocument();
58 });
59
60 it("renders queue tab with pending items", async () => {
61 mockSyncStore.getAllLocalData.mockResolvedValue({
62 decks: [],
63 notes: [],
64 cards: [],
65 queue: [{
66 id: 1,
67 entityType: "deck",
68 entityId: "deck-1",
69 operation: "push",
70 retryCount: 0,
71 createdAt: new Date().toISOString(),
72 }],
73 });
74
75 render(() => <SyncDataTable />);
76
77 await new Promise((r) => setTimeout(r, 100));
78
79 expect(screen.getByText("Queue (1)")).toBeInTheDocument();
80 });
81
82 it("has refresh and clear buttons", async () => {
83 render(() => <SyncDataTable />);
84
85 await new Promise((r) => setTimeout(r, 100));
86
87 expect(screen.getByText("Refresh")).toBeInTheDocument();
88 expect(screen.getByText("Clear All")).toBeInTheDocument();
89 });
90});