/** @jsxImportSource react */
import { act, fireEvent, render, screen } from "@testing-library/react";
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import React from "react";
import { it, vi } from "vitest";
import Demo from "../../../src/framework/react/Demo";
describe("Demo", () => {
const defaultProps = {
children:
Test Children
,
header: Test Header
,
initialCount: 5,
showMessage: "mockFunction",
};
let capturedListener: ((val: string) => void) | undefined;
let storeValue = "Mocked Nano Value";
beforeEach(() => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).mockFunction = vi.fn();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).Stores = {
reactStore: {
get: vi.fn(() => storeValue),
listen: vi.fn((callback) => {
capturedListener = callback;
callback(storeValue);
return () => {};
}),
},
};
});
afterEach(() => {
vi.clearAllMocks();
capturedListener = undefined;
storeValue = "Mocked Nano Value";
});
it("renders the initial count", () => {
render();
expect(screen.getByText("5")).toBeInTheDocument();
});
it("renders header", () => {
render();
expect(screen.getByText("Test Header")).toBeInTheDocument();
});
it("renders children", () => {
render();
expect(screen.getByText("Test Children")).toBeInTheDocument();
});
it("increments count when add button is clicked", () => {
render();
fireEvent.click(screen.getByRole("button", { name: "+" }));
expect(screen.getByText("6")).toBeInTheDocument();
});
it("decrements count when subtract button is clicked", () => {
render();
fireEvent.click(screen.getByRole("button", { name: "-" }));
expect(screen.getByText("4")).toBeInTheDocument();
});
it("calls the show message function", () => {
render();
fireEvent.click(screen.getByRole("button", { name: "Send value" }));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
expect((window as any).mockFunction).toHaveBeenCalledWith(5);
});
it("updates the component when the nanostore value changes", async () => {
render();
expect(screen.getByText(/Mocked Nano Value/i)).toBeInTheDocument();
await act(async () => {
storeValue = "Updated Nano Value";
capturedListener?.("Updated Nano Value");
});
expect(await screen.findByText(/Updated Nano Value/i)).toBeInTheDocument();
});
});