import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; vi.mock("@/lib/push", () => ({ currentState: vi.fn(async () => "off"), enable: vi.fn(async () => "on"), })); import { NotificationsRow } from "./NotificationsRow"; import * as push from "@/lib/push"; describe("строка уведомлений", () => { beforeEach(() => { vi.clearAllMocks(); vi.mocked(push.currentState).mockResolvedValue("off"); }); it("выключенные уведомления предлагает включить", async () => { render(); await userEvent.click(await screen.findByRole("button", { name: /Включить уведомления/ })); expect(push.enable).toHaveBeenCalled(); }); it("включённые — строки нет: отказаться от них мы не предлагаем", async () => { // Отключение остаётся системным (настройки телефона или сайта в браузере) — // рядом с балансом кнопка «выключить» только подталкивала бы к отказу. vi.mocked(push.currentState).mockResolvedValue("on"); const { container } = render(); await vi.waitFor(() => expect(container.textContent).toBe("")); expect(screen.queryByText(/Выключить/)).not.toBeInTheDocument(); }); it("запрещённые в браузере — объясняем, а не предлагаем кнопку", async () => { vi.mocked(push.currentState).mockResolvedValue("denied"); render(); expect(await screen.findByText(/запрещены в настройках браузера/)).toBeInTheDocument(); expect(screen.queryByRole("button")).not.toBeInTheDocument(); }); });