import "fake-indexeddb/auto";
import { db } from "$lib/db";
import { cleanup, render, screen } from "@solidjs/testing-library";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
const mockSyncStore = vi.hoisted(() => ({
getAllLocalData: vi.fn(),
queueForSync: vi.fn(),
processQueue: vi.fn(),
clearAll: vi.fn(),
}));
vi.mock("$lib/sync-store", () => ({ syncStore: mockSyncStore }));
vi.mock("$lib/api", () => ({ api: { resolveConflict: vi.fn().mockResolvedValue({ ok: true }) } }));
import { SyncDataTable } from "../SyncDataTable";
describe("SyncDataTable", () => {
beforeEach(async () => {
vi.clearAllMocks();
mockSyncStore.getAllLocalData.mockResolvedValue({ decks: [], notes: [], cards: [], queue: [] });
await db.decks.clear();
await db.notes.clear();
await db.cards.clear();
await db.syncQueue.clear();
});
afterEach(cleanup);
it("renders with empty state", async () => {
render(() => );
await new Promise((r) => setTimeout(r, 100));
expect(screen.getByText("Records (0)")).toBeInTheDocument();
expect(screen.getByText("Queue (0)")).toBeInTheDocument();
});
it("renders records tab with data", async () => {
mockSyncStore.getAllLocalData.mockResolvedValue({
decks: [{
id: "deck-1",
title: "Test Deck",
syncStatus: "synced",
localVersion: 1,
updatedAt: new Date().toISOString(),
}],
notes: [],
cards: [],
queue: [],
});
render(() => );
await new Promise((r) => setTimeout(r, 100));
expect(screen.getByText("Records (1)")).toBeInTheDocument();
});
it("renders queue tab with pending items", async () => {
mockSyncStore.getAllLocalData.mockResolvedValue({
decks: [],
notes: [],
cards: [],
queue: [{
id: 1,
entityType: "deck",
entityId: "deck-1",
operation: "push",
retryCount: 0,
createdAt: new Date().toISOString(),
}],
});
render(() => );
await new Promise((r) => setTimeout(r, 100));
expect(screen.getByText("Queue (1)")).toBeInTheDocument();
});
it("has refresh and clear buttons", async () => {
render(() => );
await new Promise((r) => setTimeout(r, 100));
expect(screen.getByText("Refresh")).toBeInTheDocument();
expect(screen.getByText("Clear All")).toBeInTheDocument();
});
});