from __future__ import annotations from daena.config import ( DaenaConfig, MetricsConfig, ProcessorConfig, SinkConfig, SourceConfig, ) from daena.core.layout import preview_message, render_layout def _config() -> DaenaConfig: config = DaenaConfig() config.persistence.lmdb.path = "/tmp/daena/data" config.sources = [ SourceConfig(name="dummy", type="dummy", options={"interval": 2.0}), SourceConfig( name="system", type="journald", enabled=False, options={"units": ["ssh.service"]}, ), ] config.processors = [ ProcessorConfig(name="host", type="enricher", options={"static": {"env": "local"}}), ProcessorConfig(name="keep", type="filter", options={"drop": {"body.priority": "7"}}), ] config.sinks = [ SinkConfig(name="log", type="dummy"), SinkConfig( name="loki", type="loki", options={"url": "http://127.0.0.1:3100/loki/api/v1/push"}, ), ] config.logging.verbose = True return config def test_layout_is_a_single_pipeline_line() -> None: text = render_layout(_config(), "./daena.yaml") assert "┌" not in text assert "▼" not in text flow = text.splitlines()[1] assert flow.index("dummy") < flow.index("host") assert flow.index("host") < flow.index("lmdb") assert flow.index("lmdb") < flow.index("log") assert "daena 0.2.0 ./daena.yaml" in text assert "/tmp/daena/data" in text assert "127.0.0.1:8642 127.0.0.1:8643" in text def test_layout_names_each_plugin_once() -> None: text = render_layout(_config(), None) flow = text.splitlines()[1] assert flow == " → ".join( [ "dummy (2s), system (journald, off)", "host (enricher), keep (filter)", "lmdb", "log (dummy), loki (127.0.0.1:3100)", ] ) assert "daena 0.2.0 defaults" in text def test_layout_skips_empty_stages_and_disabled_metrics() -> None: config = DaenaConfig() config.api.metrics = MetricsConfig(enabled=False) text = render_layout(config, None) assert "→ lmdb" not in text assert text.splitlines()[1] == "lmdb" assert text.splitlines()[-1] == "127.0.0.1:8642" def test_preview_message_uses_message_then_clips() -> None: assert preview_message({"message": "daena heartbeat #1"}) == "daena heartbeat #1" assert preview_message({"message": "a\nb"}) == "a b" assert preview_message({"counter": 1}) == '{"counter":1}' clipped = preview_message({"message": "x" * 130}, limit=10) assert clipped.endswith("…") assert len(clipped) == 10