/** * Тесты для Timeline компонента */ import { screen } from "@testing-library/react" import React from "react" import { describe, expect, it } from "vitest" // Import mocks before components import "../../__mocks__/hooks" import "@/test/mocks/libraries/lucide-react" import "@/test/mocks/libraries/resizable" import "@/test/mocks/timeline-components" import { ChatProvider } from "@/features/ai-chat/services/chat-provider" import { ModalProvider } from "@/features/modals" import { ProjectSettingsProvider } from "@/features/project-settings" import { renderWithProviders } from "@/test/test-utils" import { Timeline } from "../../components/timeline" import { TimelineProvider } from "../../services/timeline-provider" // Custom render function for Timeline that includes all required providers const renderTimeline = (ui: React.ReactElement) => { return renderWithProviders( {ui} , ) } describe("Timeline Component", () => { describe("Component Initialization", () => { it("should be defined and exportable", () => { expect(Timeline).toBeDefined() expect(typeof Timeline).toBe("function") }) it("should render without errors", () => { expect(() => { renderTimeline() }).not.toThrow() }) it("should render timeline structure", () => { renderTimeline() // Проверяем, что основная структура отрендерилась через testid const timelineElement = screen.getByTestId("timeline") expect(timelineElement).toBeInTheDocument() }) }) describe("Component Structure", () => { it("should render timeline content", () => { renderTimeline() // Проверяем, что компонент содержит основные элементы const timelineElement = screen.getByTestId("timeline") expect(timelineElement).toBeInTheDocument() }) }) describe("Component Props", () => { it("should accept className and style props without errors", () => { const customStyle = { backgroundColor: "red", width: "100%" } expect(() => { renderTimeline() }).not.toThrow() const timelineElement = screen.getByTestId("timeline") expect(timelineElement).toBeInTheDocument() }) }) describe("Component Accessibility", () => { it("should have proper ARIA attributes", () => { renderTimeline() const timelineElement = screen.getByTestId("timeline") // Проверяем базовые атрибуты доступности expect(timelineElement).toBeInTheDocument() }) it("should be keyboard accessible", () => { renderTimeline() const timelineElement = screen.getByTestId("timeline") expect(timelineElement).toBeInTheDocument() // Timeline должен быть доступен для навигации с клавиатуры expect(timelineElement.tabIndex).toBeGreaterThanOrEqual(-1) }) }) describe("Component Responsiveness", () => { it("should handle different container sizes", () => { const { rerender } = renderTimeline(
, ) expect(screen.getByTestId("timeline")).toBeInTheDocument() // Перерендерим с другим размером rerender(
, ) expect(screen.getByTestId("timeline")).toBeInTheDocument() }) }) describe("Component Performance", () => { it("should render efficiently", () => { const startTime = performance.now() renderTimeline() const endTime = performance.now() const renderTime = endTime - startTime // Проверяем, что рендеринг занимает разумное время // Увеличиваем порог до 500мс для CI/CD окружения и dev режима, где производительность может быть ниже expect(renderTime).toBeLessThan(500) expect(screen.getByTestId("timeline")).toBeInTheDocument() }) it("should handle multiple re-renders", () => { const { rerender } = renderTimeline() // Множественные перерендеры не должны вызывать ошибок for (let i = 0; i < 10; i++) { rerender( , ) } expect(screen.getByTestId("timeline")).toBeInTheDocument() }) }) describe("Component Error Handling", () => { it("should handle missing props gracefully", () => { expect(() => { renderTimeline() }).not.toThrow() }) it("should handle invalid props gracefully", () => { expect(() => { renderTimeline() }).not.toThrow() }) }) describe("Component Integration", () => { it("should work with React Suspense", () => { expect(() => { renderTimeline( Loading...}> , ) }).not.toThrow() }) it("should work with React.StrictMode", () => { expect(() => { renderTimeline( , ) }).not.toThrow() }) }) })