import { act, render, screen } from "@testing-library/react"
import { describe, expect, it, vi } from "vitest"
import { StyleTemplateErrorBoundary } from "../../components/style-template-error-boundary"
// Компонент, который выбрасывает ошибку
const ThrowError = ({ shouldThrow }: { shouldThrow: boolean }) => {
if (shouldThrow) {
throw new Error("Test error")
}
return
No error
}
describe("StyleTemplateErrorBoundary", () => {
beforeEach(() => {
// Подавляем ошибки в консоли для тестов
vi.spyOn(console, "error").mockImplementation(() => {})
})
afterEach(() => {
vi.restoreAllMocks()
})
it("должен отображать дочерние компоненты если нет ошибки", () => {
render(
,
)
expect(screen.getByText("No error")).toBeInTheDocument()
})
it("должен отображать сообщение об ошибке при возникновении ошибки", () => {
render(
,
)
expect(screen.getByText("Ошибка загрузки шаблонов")).toBeInTheDocument()
})
it("должен отображать кнопку повтора", () => {
render(
,
)
expect(screen.getByRole("button", { name: /попробовать снова/i })).toBeInTheDocument()
})
it("должен сбрасывать ошибку при нажатии на кнопку повтора", () => {
const { rerender } = render(
,
)
// Проверяем, что отображается ошибка
expect(screen.getByText("Ошибка загрузки шаблонов")).toBeInTheDocument()
// Сначала перерендериваем с исправленным компонентом
act(() => {
rerender(
,
)
})
// Нажимаем кнопку повтора для сброса состояния ошибки
const retryButton = screen.getByRole("button", {
name: /попробовать снова/i,
})
act(() => {
retryButton.click()
})
// Проверяем, что ошибка исчезла
expect(screen.getByText("No error")).toBeInTheDocument()
})
it("должен иметь правильную структуру при ошибке", () => {
const renderResult = render(
,
)
expect(renderResult.container.firstChild).toHaveClass(
"flex",
"h-64",
"w-full",
"flex-col",
"items-center",
"justify-center",
)
})
it("должен центрировать содержимое ошибки", () => {
render(
,
)
const errorContainer = screen.getByText("Ошибка загрузки шаблонов").parentElement
expect(errorContainer).toHaveClass("flex", "h-64", "w-full", "flex-col", "items-center", "justify-center")
})
it("должен отображать иконку ошибки", () => {
render(
,
)
expect(screen.getByTestId("alerttriangle-icon")).toBeInTheDocument()
})
})