from __future__ import annotations import unittest from pathlib import Path from streamlit.testing.v1 import AppTest ROOT = Path(__file__).resolve().parents[1] class StreamlitSmokeTests(unittest.TestCase): def test_default_demo_renders_without_exception(self) -> None: app = AppTest.from_file(str(ROOT / "app.py"), default_timeout=30).run() self.assertEqual(len(app.exception), 0) self.assertGreaterEqual(len(app.selectbox), 1) self.assertEqual(app.radio[0].value, "Dane demonstracyjne") self.assertEqual(app.segmented_control[0].value, "Przegląd") self.assertEqual( app.segmented_control[0].options, ["Przegląd", "Szczegóły cylindra"], ) self.assertFalse(any("C01" in button.label for button in app.button)) self.assertFalse( any(selector.label == "Cylinder do analizy" for selector in app.selectbox) ) rendered = "\n".join(markdown.value for markdown in app.markdown) self.assertIn("Konsola diagnostyczna ENGIN", rendered) self.assertNotIn("MODEL GOTOWY", rendered) self.assertNotIn("ARTEFAKT ZWERYFIKOWANY", rendered) self.assertNotIn("CPU · DANE LOKALNE", rendered) for english_fragment in ( "Diagnostic Console", "LIVE INFERENCE", "DEMO FALLBACK", "LEAKAGE-SAFE", "Grouped Macro F1", "Severity accuracy", ): self.assertNotIn(english_fragment, rendered) self.assertEqual( [metric.label for metric in app.metric], [ "Makro F1 (grupowe)", "Trafność nasilenia", "Punkty walidacyjne", "Testy", ], ) technical_expander = next( expander for expander in app.expander if expander.label == "Informacje techniczne" ) self.assertFalse(technical_expander.proto.expanded) diagnostic_table = next( table for table in app.dataframe if "Źródło decyzji" in table.value.columns ) diagnostic_columns = set(diagnostic_table.value.columns) self.assertIn("Źródło decyzji", diagnostic_columns) self.assertNotIn("decision_source", diagnostic_columns) overview_table = next( table for table in app.dataframe if "Priorytet" in table.value.columns ) self.assertEqual( list(overview_table.value.columns), ["Cylinder", "Diagnoza", "Nasilenie", "Priorytet"], ) def test_upload_mode_has_safe_empty_state(self) -> None: app = AppTest.from_file(str(ROOT / "app.py"), default_timeout=30).run() app.radio[0].set_value("Wgraj plik CSV").run() self.assertEqual(len(app.exception), 0) self.assertGreaterEqual(len(app.info), 1) def test_cylinder_selector_exists_only_in_detail_view(self) -> None: app = AppTest.from_file(str(ROOT / "app.py"), default_timeout=30).run() self.assertFalse( any(selector.label == "Cylinder do analizy" for selector in app.selectbox) ) app.segmented_control[0].set_value("Szczegóły cylindra").run() self.assertEqual(app.segmented_control[0].value, "Szczegóły cylindra") detail_selector = next( selector for selector in app.selectbox if selector.label == "Cylinder do analizy" ) rendered = "\n".join(markdown.value for markdown in app.markdown) self.assertIn(f"CYLINDER {int(detail_selector.value):02d}", rendered) detail_selector.set_value(3).run() detail_selector = next( selector for selector in app.selectbox if selector.label == "Cylinder do analizy" ) self.assertEqual(detail_selector.value, 3) for slot, cylinder in enumerate((1, 2, 4), start=1): comparison = next( selector for selector in app.selectbox if selector.label == f"Porównanie {slot}" ) comparison.set_value(cylinder).run() self.assertEqual(len(app.exception), 0) self.assertEqual(len(app.multiselect), 0) rendered = "\n".join(markdown.value for markdown in app.markdown) self.assertIn("CYLINDER 03", rendered) self.assertIn("### Wybór cylindra", rendered) self.assertNotIn("Select all", rendered) self.assertNotIn("You can select up to", rendered)