import pytest from core.validator import FALLBACK_SPEC, validate def test_validate_slider_passes(sample_slider_spec): ok, spec = validate(sample_slider_spec) assert ok is True assert spec["component"] == "Slider" def test_validate_textbox_passes(sample_textbox_spec): ok, spec = validate(sample_textbox_spec) assert ok is True assert spec["component"] == "Textbox" def test_validate_image_passes(sample_image_spec): ok, spec = validate(sample_image_spec) assert ok is True assert spec["component"] == "Image" def test_validate_dropdown_passes(sample_dropdown_spec): ok, spec = validate(sample_dropdown_spec) assert ok is True assert spec["component"] == "Dropdown" def test_validate_checkbox_passes(sample_checkbox_spec): ok, spec = validate(sample_checkbox_spec) assert ok is True assert spec["component"] == "Checkbox" def test_validate_button_passes(sample_button_spec): ok, spec = validate(sample_button_spec) assert ok is True assert spec["component"] == "Button" def test_validate_audio_passes(sample_audio_spec): ok, spec = validate(sample_audio_spec) assert ok is True assert spec["component"] == "Audio" def test_validate_file_passes(sample_file_spec): ok, spec = validate(sample_file_spec) assert ok is True assert spec["component"] == "File" def test_validate_plot_passes(sample_plot_spec): ok, spec = validate(sample_plot_spec) assert ok is True assert spec["component"] == "Plot" def test_validate_dataframe_passes(sample_dataframe_spec): ok, spec = validate(sample_dataframe_spec) assert ok is True assert spec["component"] == "Dataframe" def test_validate_unknown_component_returns_fallback(): spec = {"component": "ColorPicker", "props": {}} ok, result = validate(spec) assert ok is False assert result["component"] == FALLBACK_SPEC["component"] def test_validate_missing_props_returns_fallback(): spec = {"component": "Slider"} ok, result = validate(spec) assert ok is False assert result["component"] == FALLBACK_SPEC["component"] def test_validate_not_a_dict_returns_fallback(): ok, result = validate("not a dict") # type: ignore[arg-type] assert ok is False assert result["component"] == FALLBACK_SPEC["component"] def test_validate_extra_props_stripped_silently(): spec = { "component": "Slider", "props": {"label": "X", "minimum": 0, "maximum": 10, "unknown_prop": "bad"}, "layout": "vertical", "connected_output": None, } ok, result = validate(spec) assert ok is True assert "unknown_prop" not in result["props"] assert "label" in result["props"] def test_validate_preserves_layout_and_connected_output(sample_slider_spec): sample_slider_spec["layout"] = "horizontal" sample_slider_spec["connected_output"] = "image" ok, spec = validate(sample_slider_spec) assert ok is True assert spec["layout"] == "horizontal" assert spec["connected_output"] == "image"