/**
* @vitest-environment jsdom
*/
import "fake-indexeddb/auto";
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { SyncButton } from "./SyncButton";
// Mock the useSync hook
const mockSync = vi.fn();
const mockUseSync = vi.fn();
vi.mock("../stores", () => ({
useSync: () => mockUseSync(),
}));
describe("SyncButton", () => {
beforeEach(() => {
vi.clearAllMocks();
mockSync.mockResolvedValue({ success: true });
});
afterEach(() => {
cleanup();
});
it("renders sync button", () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: false,
sync: mockSync,
});
render();
expect(screen.getByTestId("sync-button")).toBeDefined();
expect(screen.getByText("Sync")).toBeDefined();
});
it("displays 'Syncing...' when syncing", () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: true,
sync: mockSync,
});
render();
expect(screen.getByText("Syncing...")).toBeDefined();
});
it("is disabled when offline", () => {
mockUseSync.mockReturnValue({
isOnline: false,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
expect(button).toHaveProperty("disabled", true);
});
it("is disabled when syncing", () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: true,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
expect(button).toHaveProperty("disabled", true);
});
it("is enabled when online and not syncing", () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
expect(button).toHaveProperty("disabled", false);
});
it("calls sync when clicked", async () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
fireEvent.click(button);
expect(mockSync).toHaveBeenCalledTimes(1);
});
it("does not call sync when clicked while disabled", () => {
mockUseSync.mockReturnValue({
isOnline: false,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
fireEvent.click(button);
expect(mockSync).not.toHaveBeenCalled();
});
it("shows tooltip when offline", () => {
mockUseSync.mockReturnValue({
isOnline: false,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
expect(button.getAttribute("title")).toBe("Cannot sync while offline");
});
it("does not show tooltip when online", () => {
mockUseSync.mockReturnValue({
isOnline: true,
isSyncing: false,
sync: mockSync,
});
render();
const button = screen.getByTestId("sync-button");
expect(button.getAttribute("title")).toBeNull();
});
});