learn and share notes on atproto (wip) 馃 malfestio.stormlightlabs.org/
readability solid axum atproto srs
at main 90 lines 2.5 kB view raw
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});