import { describe, it, expect, vi, beforeEach } from "vitest"; import { renderHook, act } from "@testing-library/react"; import type { RefObject } from "react"; // ── Hoist mocks so they're available in vi.mock factories ───────────────────── const { audioServiceMock } = vi.hoisted(() => ({ audioServiceMock: { initialize: vi.fn().mockResolvedValue(undefined), play: vi.fn().mockResolvedValue(undefined), pause: vi.fn(), seekTo: vi.fn(), getDuration: vi.fn(() => 0), isWaveformReady: vi.fn(() => false), }, })); vi.mock("../services/audioService", () => ({ audioService: audioServiceMock, })); vi.mock("../stores/playerStore", () => ({ usePlayerStore: vi.fn((selector: (s: unknown) => unknown) => selector({ isPlaying: false, currentTime: 0, duration: 0 }) ), })); // ── Import after mocks ───────────────────────────────────────────────────────── import { useWaveform } from "./useWaveform"; // ── Tests ────────────────────────────────────────────────────────────────────── describe("useWaveform", () => { beforeEach(() => { vi.clearAllMocks(); audioServiceMock.initialize.mockResolvedValue(undefined); }); it("forwards peaks to audioService.initialize when provided", async () => { const containerRef: RefObject = { current: document.createElement("div"), }; const peaks = Array.from({ length: 500 }, (_, i) => i / 500); renderHook(() => useWaveform(containerRef, { url: "http://localhost/song.mp3", peaksUrl: null, peaks, songId: "song-1", bandId: "band-1", }) ); await act(async () => { await new Promise((r) => setTimeout(r, 0)); }); expect(audioServiceMock.initialize).toHaveBeenCalledOnce(); const [, , passedPeaks] = audioServiceMock.initialize.mock.calls[0]; expect(passedPeaks).toEqual(peaks); }); it("passes undefined when no peaks provided", async () => { const containerRef: RefObject = { current: document.createElement("div"), }; renderHook(() => useWaveform(containerRef, { url: "http://localhost/song.mp3", peaksUrl: null, songId: "song-1", bandId: "band-1", }) ); await act(async () => { await new Promise((r) => setTimeout(r, 0)); }); expect(audioServiceMock.initialize).toHaveBeenCalledOnce(); const [, , passedPeaks] = audioServiceMock.initialize.mock.calls[0]; expect(passedPeaks).toBeUndefined(); }); });