import type { ComponentProps } from "react"; import { fireEvent, render, screen } from "@testing-library/react"; import "@testing-library/jest-dom/vitest"; import { expect, test, vi } from "vitest"; import { SettingsPage } from "../src/pages/SettingsPage"; const noopString = vi.fn(async () => ""); const noopVoid = vi.fn(async () => {}); function buildProps(overrides?: Partial>): ComponentProps { return { bpmStatus: { mode: "manual", bpm: 120, confidence: 1, devices: [], current_device: "alsa:plughw:1,0", selected_device: "alsa:auto", recommended_device: "alsa:plughw:1,0", audio_connected: true, last_error: null, input_level: 0.12, peak_level: 0.25, clipping: false, sample_rate: 44100, channels: 1, format: "S16_LE" }, bpmDevices: [ { id: "alsa:auto", name: "Auto", backend: "alsa", is_default: true }, { id: "alsa:plughw:1,0", name: "plughw:1,0", backend: "alsa", is_default: false } ], dmxConfig: { backend: "artnet", universe: 1, output_port: "WLED Matrix Loft", target_host: "", artnet_nodes: [] }, dmxDevices: [], haConfig: { enabled: true, base_url: "", default_universe: 10, has_token: true, token_mask: "********", mapping_count: 0, dispatch_count: 0, error_count: 0, last_error: null, last_successful_call_at: null, last_connection_success_at: null, last_connection_error: null, ha_version: null, auth_ok: false, reachable: false }, haEntities: [], haMappings: [], onSaveDmxConfig: noopString, onDiscoverArtNet: noopString, onSaveHomeAssistantConfig: noopString, onTestHomeAssistantConnection: noopString, onRefreshHomeAssistantEntities: noopString, onSaveHomeAssistantMapping: noopString, onDeleteHomeAssistantMapping: noopVoid, onTestHomeAssistantMapping: noopString, onSaveBpmDevice: noopString, onRefreshAudioDevices: noopVoid, onRestartService: noopString, onRebootHost: noopString, ...overrides }; } test("bevarer HA base url mens live refresh opdaterer props", () => { const view = render(); const input = screen.getByPlaceholderText("fx http://homeassistant.local:8123") as HTMLInputElement; fireEvent.change(input, { target: { value: "http://192.168.2.50:8123" } }); expect(input.value).toBe("http://192.168.2.50:8123"); view.rerender( ); expect(screen.getByPlaceholderText("fx http://homeassistant.local:8123")).toHaveValue( "http://192.168.2.50:8123" ); }); test("bevarer Art-Net target host mens live refresh opdaterer props", () => { const view = render(); const input = screen.getByPlaceholderText("fx 192.168.2.60") as HTMLInputElement; fireEvent.change(input, { target: { value: "192.168.2.77" } }); expect(input.value).toBe("192.168.2.77"); view.rerender( ); expect(screen.getByPlaceholderText("fx 192.168.2.60")).toHaveValue("192.168.2.77"); }); test("bevarer valgt audio-input mens live refresh opdaterer props", () => { const view = render(); const select = screen.getByLabelText("ALSA-input") as HTMLSelectElement; fireEvent.change(select, { target: { value: "alsa:plughw:1,0" } }); expect(select.value).toBe("alsa:plughw:1,0"); view.rerender( ); expect(screen.getByLabelText("ALSA-input")).toHaveValue("alsa:plughw:1,0"); });