import { fireEvent, render, screen } from "@testing-library/react"
import { beforeEach, describe, expect, it, vi } from "vitest"
import { Browser } from "../../components/browser"
// Мокаем зависимости
let mockOnTabChange: (tab: string) => void
vi.mock("../../components/browser-tabs", () => ({
BrowserTabs: ({ activeTab, onTabChange }: any) => {
mockOnTabChange = onTabChange
return (
)
},
}))
vi.mock("../../components/browser-content", () => ({
BrowserContent: () => Browser Content
,
}))
vi.mock("@/features/app-state", () => ({
useAppSettings: () => ({
getUserSettings: vi.fn(() => ({})),
updateUserSettings: vi.fn(),
state: {
appSettings: {},
},
}),
AppSettingsProvider: ({ children }: { children: any }) => children,
}))
// Мокаем AI интеграцию
vi.mock("@/features/ai-chat/hooks/use-browser-ai-integration", () => ({
useBrowserAIIntegration: () => ({
isReady: true,
hasFiles: false,
fileCount: 0,
selectedCount: 0,
}),
}))
// Мокаем EffectsProvider
vi.mock("../../providers/effects-provider", () => ({
EffectsProvider: ({ children }: { children: any }) => children,
}))
// Мокаем BrowserStateProvider и его хук
let mockActiveTab = "media"
let mockSwitchTab = vi.fn()
vi.mock("../../services/browser-state-provider", () => ({
BrowserStateProvider: ({ children }: { children: any }) => children,
useBrowserState: () => ({
activeTab: mockActiveTab,
switchTab: mockSwitchTab,
}),
}))
describe("Browser", () => {
beforeEach(() => {
vi.clearAllMocks()
mockActiveTab = "media"
mockSwitchTab = vi.fn((tab: string) => {
mockActiveTab = tab
})
})
it("должен рендериться с компонентами табов и контента", () => {
render()
expect(screen.getByTestId("browser-tabs")).toBeInTheDocument()
expect(screen.getByTestId("browser-content")).toBeInTheDocument()
})
it("должен иметь начальную вкладку media", () => {
render()
const browserTabs = screen.getByTestId("browser-tabs")
expect(browserTabs).toHaveAttribute("data-active-tab", "media")
})
it("должен переключать вкладки при клике", () => {
render()
const musicTab = screen.getByTestId("tab-music")
fireEvent.click(musicTab)
expect(mockSwitchTab).toHaveBeenCalledWith("music")
})
it("должен иметь правильные CSS классы", () => {
const { container } = render()
const wrapper = container.querySelector(".relative.h-full.w-full.flex.flex-col")
expect(wrapper).toBeInTheDocument()
expect(wrapper).toHaveClass("dark:bg-[#2D2D2D]")
})
it("должен обрабатывать изменение вкладки через компонент Tabs", () => {
render()
const tabChangeButton = screen.getByTestId("trigger-tab-change")
fireEvent.click(tabChangeButton)
expect(mockSwitchTab).toHaveBeenCalledWith("test")
})
it("должен рендериться внутри контейнера с правильными классами", () => {
const { container } = render()
const wrapper = container.firstChild as HTMLElement
expect(wrapper).toHaveClass("relative h-full w-full flex flex-col")
})
it("должен предоставлять контекст состояния браузера дочерним компонентам", () => {
// Факт того, что компонент рендерится без ошибок, подтверждает,
// что контекст доступен
expect(() => render()).not.toThrow()
})
it("должен сохранять состояние вкладки при повторном рендере", () => {
const { rerender } = render()
// Переключаем вкладку
const effectsTab = screen.getByTestId("tab-effects")
fireEvent.click(effectsTab)
// Перерендер компонента
rerender()
// Проверяем, что активная вкладка сохранилась
expect(mockSwitchTab).toHaveBeenCalledWith("effects")
})
})