import { fireEvent, render, screen } from "@testing-library/react" import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" import { MidiDevice } from "../../../services/midi/midi-engine" import { MidiLearnDialog } from "../midi-learn-dialog" import { mockUIComponents, resetSelectStates } from "./test-utils/mocks" // Setup all UI mocks mockUIComponents() // Override the dialog mock to show the test version vi.mock("@/components/ui/dialog", () => ({ Dialog: ({ open, onOpenChange, children }: any) => open ? (
onOpenChange?.(false)}> {children}
) : null, DialogContent: ({ children, className }: any) =>
{children}
, DialogDescription: ({ children }: any) =>
{children}
, DialogFooter: ({ children }: any) =>
{children}
, DialogHeader: ({ children }: any) =>
{children}
, DialogTitle: ({ children }: any) =>

{children}

, })) // Mock MIDI hook const mockStartLearning = vi.fn() vi.mock("../../../hooks/use-midi", () => ({ useMidi: () => ({ startLearning: mockStartLearning, }), })) describe("MidiLearnDialog", () => { const mockOnClose = vi.fn() const mockOnComplete = vi.fn() const mockDevices: MidiDevice[] = [ { id: "device1", name: "MIDI Device 1", type: "input", manufacturer: "", connected: true }, { id: "device2", name: "MIDI Device 2", type: "input", manufacturer: "", connected: true }, ] const defaultProps = { open: true, onClose: mockOnClose, devices: mockDevices, onComplete: mockOnComplete, } beforeEach(() => { vi.clearAllMocks() resetSelectStates() }) afterEach(() => { vi.restoreAllMocks() resetSelectStates() }) describe("Rendering", () => { it("should render when open", () => { render() expect(screen.getByTestId("dialog")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.title")).toBeInTheDocument() }) it("should not render when closed", () => { render() expect(screen.queryByTestId("dialog")).not.toBeInTheDocument() }) it("should render device selection", () => { render() expect(screen.getByText("fairlightAudio.midi.learnDialog.midiDevice")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.selectMidiDevice")).toBeInTheDocument() }) it("should render parameter selection", () => { render() expect(screen.getByText("fairlightAudio.midi.learnDialog.targetParameter")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.selectParameter")).toBeInTheDocument() }) it("should render parameter select", () => { render() // Check that parameter select exists const paramSelects = screen.getAllByRole("combobox") expect(paramSelects).toHaveLength(2) // Device and parameter selects expect(screen.getByText("fairlightAudio.midi.learnDialog.selectParameter")).toBeInTheDocument() }) it("should render initial status", () => { render() expect(screen.getByTestId("music-icon")).toHaveClass("text-zinc-600") expect(screen.getByText("fairlightAudio.midi.learnDialog.status.ready")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.status.readyHint")).toBeInTheDocument() }) }) describe("Device Selection", () => { it("should render device select", () => { render() // Check that device select exists const selects = screen.getAllByRole("combobox") expect(selects).toHaveLength(2) // Device and parameter selects expect(screen.getByText("fairlightAudio.midi.learnDialog.selectMidiDevice")).toBeInTheDocument() }) it("should handle device selection", () => { // Since we're using real Radix UI components, we can't test the selection directly // We'll just verify the component renders correctly render() const selects = screen.getAllByRole("combobox") expect(selects).toHaveLength(2) expect(selects[0]).toBeInTheDocument() // Device select }) }) describe("Parameter Selection", () => { it("should handle parameter selection", () => { // Since we're using real Radix UI components, we can't test the selection directly // We'll just verify the component renders correctly render() const selects = screen.getAllByRole("combobox") expect(selects).toHaveLength(2) expect(selects[1]).toBeInTheDocument() // Parameter select }) }) describe("Start Listening", () => { it("should disable start button when device not selected", () => { render() const startButton = screen.getByText("fairlightAudio.midi.learnDialog.buttons.startListening") expect(startButton).toBeDisabled() }) it("should disable start button when parameter not selected", () => { render() // Start button should be disabled when nothing is selected const startButton = screen.getByText("fairlightAudio.midi.learnDialog.buttons.startListening") expect(startButton).toBeDisabled() }) it("should have disabled start button initially", () => { render() const startButton = screen.getByText("fairlightAudio.midi.learnDialog.buttons.startListening") expect(startButton).toBeDisabled() }) it("should show correct UI elements", () => { render() // Check that all main UI elements are present expect(screen.getByText("fairlightAudio.midi.learnDialog.status.ready")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.buttons.cancel")).toBeInTheDocument() expect(screen.getByText("fairlightAudio.midi.learnDialog.buttons.startListening")).toBeInTheDocument() }) }) describe("MIDI Message Reception", () => { it("should setup MIDI learning hook", () => { render() // Verify the component renders and hook is available expect(mockStartLearning).toBeDefined() }) }) describe("Dialog Control", () => { it("should call onClose when cancel clicked", () => { render() const cancelButton = screen.getByText("fairlightAudio.midi.learnDialog.buttons.cancel") fireEvent.click(cancelButton) expect(mockOnClose).toHaveBeenCalled() }) it("should call onClose when dialog closed", () => { render() const dialog = screen.getByTestId("dialog") fireEvent.click(dialog) expect(mockOnClose).toHaveBeenCalled() }) }) })