/**
* @vitest-environment jsdom
*
* Простые интеграционные тесты для drag-drop функциональности Timeline
*/
import { render, screen } from "@testing-library/react"
import { beforeEach, describe, expect, it, vi } from "vitest"
import { DragDropProvider } from "../../components/drag-drop-provider"
import { TrackControlsPanel } from "../../components/track-controls-panel"
import { TrackInsertionZone } from "../../components/track-insertion-zone"
// Mock ResizeObserver
global.ResizeObserver = vi.fn().mockImplementation(() => ({
observe: vi.fn(),
unobserve: vi.fn(),
disconnect: vi.fn(),
}))
// Моки для хуков
const mockAddTrack = vi.fn()
const mockUpdateTrack = vi.fn()
vi.mock("../../hooks/use-timeline", () => ({
useTimeline: () => ({
project: {
id: "test-project",
name: "Test Project",
},
uiState: {
timeScale: 1,
snapMode: "none",
selectedTrackIds: [],
},
addTrack: mockAddTrack,
updateTrack: mockUpdateTrack,
}),
}))
vi.mock("../../hooks/use-tracks", () => ({
useTracks: () => ({
tracks: [
{
id: "video-track-1",
name: "Video Track 1",
type: "video",
height: 80,
isHidden: false,
isLocked: false,
},
],
setTrackHeight: vi.fn(),
}),
}))
vi.mock("../../hooks/use-drag-drop-timeline", () => ({
useDragDropTimeline: () => ({
dragState: {
isDragging: false,
draggedItem: null,
dragOverTrack: null,
dropPosition: null,
},
handleDragStart: vi.fn(),
handleDragOver: vi.fn(),
handleDragEnd: vi.fn(),
isValidDropTarget: vi.fn(() => false),
isValidDropTargetForNewTrack: vi.fn(() => false),
}),
}))
describe("Drag-Drop Integration Tests", () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe("DragDropProvider", () => {
it("renders children correctly", () => {
render(
Test Content
,
)
expect(screen.getByTestId("test-content")).toBeInTheDocument()
})
it("provides DndContext with accessibility elements", () => {
const { container } = render(
Content
,
)
// DndContext creates accessibility elements
expect(container.querySelector("[aria-live]")).toBeInTheDocument()
expect(container.querySelector("[role='status']")).toBeInTheDocument()
})
})
describe("TrackControlsPanel", () => {
it("displays track controls header", () => {
render()
// Check for the new header text
expect(screen.getByText("Треки проекта")).toBeInTheDocument()
})
it("displays track information", () => {
render()
// Check for track name
expect(screen.getByText("Video Track 1")).toBeInTheDocument()
// Height control was removed, so we don't check for "80px" anymore
})
})
describe("TrackInsertionZone", () => {
it("renders a single insertion zone", () => {
const { container } = render()
// The zone should render with data-testid
expect(container.firstChild).toBeInTheDocument()
expect(container.firstChild).toHaveAttribute("data-testid", "track-insertion-above-none-0")
})
it("displays hover effect text", () => {
render()
// Should show the correct insertion text based on position
expect(screen.getByText("Создать трек между")).toBeInTheDocument()
})
it("applies correct classes based on position", () => {
const { container } = render()
const zone = container.firstChild
expect(zone).toHaveClass("custom-class")
expect(zone).toHaveClass("group")
})
})
})