"""Config generator unit tests (spec section 64: configuration generation).""" from __future__ import annotations import pytest from app.configgen import generate_config from app.models import BrokerSettings, ListenerConfig @pytest.fixture() def session(db_session): yield db_session def test_generate_with_one_listener(session): session.add( ListenerConfig( name="Production MQTT", port=1883, protocol="mqtt", allow_anonymous=False, max_connections=-1, tls_enabled=False, require_certificate=False, use_identity_as_username=False, ) ) session.commit() result = generate_config(session) assert "listener 1883" in result.config_text assert "global_plugin /usr/lib/mosquitto_dynamic_security.so" in result.config_text assert "allow_anonymous false" in result.config_text # Must NOT use options deprecated in 2.1 (spec 3.1). assert "per_listener_settings" not in result.config_text assert result.warnings == [] def test_generate_includes_global_settings(session): session.add(ListenerConfig(name="l", port=1883, protocol="mqtt")) session.add(BrokerSettings(key="max_packet_size", value="2000000", value_type="int")) session.commit() result = generate_config(session) assert "max_packet_size 2000000" in result.config_text def test_generate_with_empty_model_warns_instead_of_raising(session): """Fresh-platform state: preview must work, not 500 (config page fix).""" result = generate_config(session) assert "global_plugin /usr/lib/mosquitto_dynamic_security.so" in result.config_text assert "persistence true" in result.config_text assert any("No enabled listeners" in w for w in result.warnings) def test_disabled_listeners_are_omitted(session): session.add(ListenerConfig(name="off", port=1884, protocol="mqtt", enabled=False)) session.add(ListenerConfig(name="on", port=1883, protocol="mqtt")) session.commit() result = generate_config(session) assert "listener 1883" in result.config_text assert "listener 1884" not in result.config_text def test_tls_listener_without_pki_warns(session): session.add( ListenerConfig( name="tls-later", port=8883, protocol="mqtt", tls_enabled=True, tls_min_version="tlsv1.2", ) ) session.commit() result = generate_config(session) assert any("PKI is not available" in w for w in result.warnings) assert "tls_version tlsv1.2" in result.config_text