import { fireEvent, render, screen } from "@testing-library/react" import { beforeEach, describe, expect, it, vi } from "vitest" import { VolumeSlider } from "../../components/volume-slider" // Мокаем useUserSettings hook vi.mock("@/features/user-settings/hooks/use-user-settings", () => ({ useUserSettings: () => ({ playerVolume: 50, }), })) // Мокаем компонент Slider из @/components/ui/slider vi.mock("@/components/ui/slider", () => ({ Slider: ({ value, min, max, step, onValueChange, onValueCommit, className }: any) => ( onValueChange([Number(e.target.value)])} onMouseUp={() => onValueCommit()} className={className} data-testid="volume-slider" /> ), })) // Мокаем console.log для проверки вызова beforeEach(() => { vi.clearAllMocks() vi.spyOn(console, "log").mockImplementation(() => {}) }) describe("VolumeSlider", () => { it("should render with correct initial volume", () => { // Создаем моки для функций обратного вызова const onValueChange = vi.fn() const onValueCommit = vi.fn() // Рендерим компонент с начальным значением громкости 50 render() // Проверяем, что слайдер отрендерился с правильным значением const slider = screen.getByTestId("volume-slider") expect(slider).toBeInTheDocument() expect(slider).toHaveValue("50") }) it("should call onValueCommit when slider interaction ends", () => { // Создаем моки для функций обратного вызова const onValueChange = vi.fn() const onValueCommit = vi.fn() // Рендерим компонент render() // Находим слайдер const slider = screen.getByTestId("volume-slider") // Симулируем завершение взаимодействия со слайдером fireEvent.mouseUp(slider) // Проверяем, что onValueCommit был вызван expect(onValueCommit).toHaveBeenCalled() }) it("should update volumeRef when provided", () => { // Создаем моки для функций обратного вызова const onValueChange = vi.fn() const onValueCommit = vi.fn() // Создаем ref для громкости const volumeRef = { current: 50 } // Рендерим компонент с volumeRef render( , ) // Находим слайдер const slider = screen.getByTestId("volume-slider") // Изменяем значение слайдера fireEvent.change(slider, { target: { value: 75 } }) // Проверяем, что volumeRef был обновлен expect(volumeRef.current).toBe(75) }) it("should update local volume when external volume changes", () => { // Создаем моки для функций обратного вызова const onValueChange = vi.fn() const onValueCommit = vi.fn() // Рендерим компонент с начальным значением громкости const { rerender } = render( , ) // Проверяем начальное значение let slider = screen.getByTestId("volume-slider") expect(slider).toHaveValue("50") // Перерендериваем компонент с новым значением громкости rerender() // Проверяем, что значение слайдера обновилось slider = screen.getByTestId("volume-slider") expect(slider).toHaveValue("75") }) })