import { vi } from "vitest"
// Мок данных YOLO
export const mockYoloData = {
videoId: "test-video",
videoName: "test.mp4",
videoPath: "/path/to/test.mp4",
frames: [
{
timestamp: 0,
detections: [
{
class: "person",
confidence: 0.95,
bbox: { x: 0.1, y: 0.2, width: 0.3, height: 0.6 },
},
],
},
{
timestamp: 5,
detections: [
{
class: "car",
confidence: 0.87,
bbox: { x: 0.5, y: 0.4, width: 0.2, height: 0.3 },
},
{
class: "person",
confidence: 0.92,
bbox: { x: 0.2, y: 0.3, width: 0.25, height: 0.5 },
},
],
},
],
}
export const mockDetections = [
{
class: "person",
confidence: 0.95,
bbox: { x: 0.1, y: 0.2, width: 0.3, height: 0.6 },
},
{
class: "car",
confidence: 0.87,
bbox: { x: 0.5, y: 0.4, width: 0.2, height: 0.3 },
},
]
export const mockVideoSummary = {
videoId: "test-video",
videoName: "test.mp4",
frameCount: 2,
detectedClasses: ["person", "car"],
classCounts: { person: 2, car: 1 },
classTimeRanges: {
person: [{ start: 0, end: 5 }],
car: [{ start: 5, end: 5 }],
},
}
// Мок компонентов
export const YoloDataOverlay = vi.fn(({ video, currentTime }) => {
return `
Video: ${video.name}, Time: ${currentTime}
`
})
export const YoloDataVisualization = vi.fn(({ yoloData, width, height }) => {
return `Video: ${yoloData.videoName}, Size: ${width}x${height}
`
})
export const YoloGraphOverlay = vi.fn(({ yoloData }) => {
return ` onTimeChange?.(10)}>Graph for ${yoloData.videoName}
`
})
export const YoloTrackOverlay = vi.fn(({ showTrajectories }) => {
return `Tracks: ${showTrajectories ? "shown" : "hidden"}
`
})
// Мок хука useYoloData
export const useYoloData = vi.fn(() => ({
loadYoloData: vi.fn().mockResolvedValue(mockYoloData),
getYoloDataAtTimestamp: vi.fn().mockResolvedValue(mockDetections),
getVideoSummary: vi.fn().mockResolvedValue(mockVideoSummary),
getAllYoloData: vi.fn().mockResolvedValue(mockYoloData),
hasYoloData: vi.fn().mockReturnValue(true),
clearVideoCache: vi.fn(),
clearAllCache: vi.fn(),
getCacheStats: vi.fn().mockReturnValue({
cachedVideos: 1,
nonExistentVideos: 0,
totalMemoryUsage: 1024,
missingDataCount: 0,
}),
preloadYoloData: vi.fn().mockResolvedValue(undefined),
getSceneContext: vi.fn().mockResolvedValue("В кадре обнаружено: person, car"),
loadingStates: {},
errorStates: {},
}))
// Мок сервисов
export const YoloDataService = vi.fn().mockImplementation(() => ({
loadYoloData: vi.fn().mockResolvedValue(mockYoloData),
getYoloDataAtTimestamp: vi.fn().mockResolvedValue(mockDetections),
getVideoSummary: vi.fn().mockResolvedValue(mockVideoSummary),
getAllYoloData: vi.fn().mockResolvedValue(mockYoloData),
hasYoloData: vi.fn().mockReturnValue(true),
clearVideoCache: vi.fn(),
clearAllCache: vi.fn(),
getCacheStats: vi.fn().mockReturnValue({
cachedVideos: 1,
nonExistentVideos: 0,
totalMemoryUsage: 1024,
missingDataCount: 0,
}),
}))
export const SceneContextService = vi.fn().mockImplementation(() => ({
createSceneContext: vi.fn().mockReturnValue({
currentVideo: { id: "test-video", name: "test.mp4", timestamp: 5 },
detectedObjects: mockDetections.map((d) => ({
class: d.class,
confidence: d.confidence,
position: "в центре кадра",
size: "средний",
description: `${d.class} в центре кадра`,
})),
sceneDescription: "В кадре обнаружено: person, car",
objectCounts: { person: 1, car: 1 },
dominantObjects: [],
}),
createChatDescription: vi.fn().mockReturnValue("Сцена содержит 2 объекта"),
createDetailedDescription: vi.fn().mockReturnValue("Детальное описание сцены"),
exportToJSON: vi.fn().mockReturnValue(JSON.stringify({ test: "data" })),
filterByClass: vi.fn().mockReturnValue({
currentVideo: { id: "test-video", name: "test.mp4", timestamp: 5 },
detectedObjects: [mockDetections[0]],
sceneDescription: "В кадре обнаружено: person",
objectCounts: { person: 1 },
dominantObjects: ["person"],
}),
}))
// Утилиты для тестов
export const createMockVideo = (overrides = {}) => ({
id: "test-video",
name: "test.mp4",
path: "/path/to/test.mp4",
...overrides,
})
export const createMockDetection = (overrides = {}) => ({
class: "person",
confidence: 0.95,
bbox: { x: 0.1, y: 0.2, width: 0.3, height: 0.6 },
...overrides,
})
export const createMockYoloData = (overrides = {}) => ({
...mockYoloData,
...overrides,
})
// Хелперы для Canvas API моков
export const mockCanvasContext = {
clearRect: vi.fn(),
scale: vi.fn(),
fillRect: vi.fn(),
strokeRect: vi.fn(),
beginPath: vi.fn(),
moveTo: vi.fn(),
lineTo: vi.fn(),
stroke: vi.fn(),
fill: vi.fn(),
arc: vi.fn(),
fillText: vi.fn(),
setLineDash: vi.fn(),
fillStyle: "",
strokeStyle: "",
lineWidth: 0,
lineCap: "",
lineJoin: "",
font: "",
}
export const setupCanvasMock = () => {
const mockGetContext = vi.fn().mockReturnValue(mockCanvasContext)
// Проверяем, что HTMLCanvasElement существует в тестовой среде
if (typeof HTMLCanvasElement !== "undefined") {
HTMLCanvasElement.prototype.getContext = mockGetContext
}
// Мокаем window.devicePixelRatio если window существует
if (typeof window !== "undefined") {
Object.defineProperty(window, "devicePixelRatio", {
value: 2,
writable: true,
})
}
return { mockGetContext, mockCanvasContext }
}
// Мок для navigator.clipboard
export const setupClipboardMock = () => {
Object.assign(navigator, {
clipboard: {
writeText: vi.fn(),
},
})
return navigator.clipboard
}