BoilerWorks

boilerworks / tests / test_console.py
Source Blame History 103 lines
0cb4a5e… anonymous 1 """Tests for boilerworks.console."""
0cb4a5e… anonymous 2
0cb4a5e… anonymous 3 from __future__ import annotations
0cb4a5e… anonymous 4
0cb4a5e… anonymous 5 from io import StringIO
0cb4a5e… anonymous 6
0cb4a5e… anonymous 7 from rich.console import Console
0cb4a5e… anonymous 8
0cb4a5e… anonymous 9 from boilerworks.console import (
0cb4a5e… anonymous 10 print_error,
0cb4a5e… anonymous 11 print_info,
0cb4a5e… anonymous 12 print_success,
0cb4a5e… anonymous 13 print_template_detail,
0cb4a5e… anonymous 14 print_template_table,
0cb4a5e… anonymous 15 print_warning,
0cb4a5e… anonymous 16 )
0cb4a5e… anonymous 17 from boilerworks.registry import Registry, TemplateInfo
0cb4a5e… anonymous 18
0cb4a5e… anonymous 19
0cb4a5e… anonymous 20 def _capture(fn, *args, **kwargs) -> str:
0cb4a5e… anonymous 21 """Call fn with a capturing console and return the output."""
0cb4a5e… anonymous 22 buf = StringIO()
0cb4a5e… anonymous 23 cap = Console(file=buf, highlight=False, markup=True)
0cb4a5e… anonymous 24 # Temporarily override the module-level console
0cb4a5e… anonymous 25 import boilerworks.console as _mod
0cb4a5e… anonymous 26
0cb4a5e… anonymous 27 original = _mod.console
0cb4a5e… anonymous 28 _mod.console = cap
0cb4a5e… anonymous 29 try:
0cb4a5e… anonymous 30 fn(*args, **kwargs)
0cb4a5e… anonymous 31 finally:
0cb4a5e… anonymous 32 _mod.console = original
0cb4a5e… anonymous 33 return buf.getvalue()
0cb4a5e… anonymous 34
0cb4a5e… anonymous 35
0cb4a5e… anonymous 36 class TestPrintTemplateTable:
0cb4a5e… anonymous 37 def test_shows_all_templates(self) -> None:
0cb4a5e… anonymous 38 registry = Registry()
0cb4a5e… anonymous 39 templates = registry.list_all()
0cb4a5e… anonymous 40 output = _capture(print_template_table, templates)
0cb4a5e… anonymous 41 assert "django-nextjs" in output
0cb4a5e… anonymous 42 assert "astro-site" in output
0cb4a5e… anonymous 43
0cb4a5e… anonymous 44 def test_shows_26_count(self) -> None:
0cb4a5e… anonymous 45 registry = Registry()
0cb4a5e… anonymous 46 templates = registry.list_all()
0cb4a5e… anonymous 47 output = _capture(print_template_table, templates)
0cb4a5e… anonymous 48 assert "26" in output
0cb4a5e… anonymous 49
0cb4a5e… anonymous 50 def test_empty_list_shows_message(self) -> None:
0cb4a5e… anonymous 51 output = _capture(print_template_table, [])
0cb4a5e… anonymous 52 assert "No templates match" in output
0cb4a5e… anonymous 53
0cb4a5e… anonymous 54 def test_filtered_table(self) -> None:
0cb4a5e… anonymous 55 registry = Registry()
0cb4a5e… anonymous 56 templates = registry.filter_by_size("micro")
0cb4a5e… anonymous 57 output = _capture(print_template_table, templates)
0cb4a5e… anonymous 58 assert "fastapi-micro" in output
0cb4a5e… anonymous 59 assert "django-nextjs" not in output
0cb4a5e… anonymous 60
0cb4a5e… anonymous 61
0cb4a5e… anonymous 62 class TestPrintTemplateDetail:
0cb4a5e… anonymous 63 def test_shows_template_fields(self) -> None:
0cb4a5e… anonymous 64 registry = Registry()
0cb4a5e… anonymous 65 template = registry.get_by_name("django-nextjs")
0cb4a5e… anonymous 66 assert template is not None
0cb4a5e… anonymous 67 output = _capture(print_template_detail, template)
0cb4a5e… anonymous 68 assert "django-nextjs" in output
0cb4a5e… anonymous 69 assert "python" in output.lower()
0cb4a5e… anonymous 70 assert "Django" in output
0cb4a5e… anonymous 71
0cb4a5e… anonymous 72 def test_template_without_frontend(self) -> None:
0cb4a5e… anonymous 73 # Micro templates have no frontend
0cb4a5e… anonymous 74 t = TemplateInfo(
0cb4a5e… anonymous 75 name="test-micro",
0cb4a5e… anonymous 76 repo="ConflictHQ/test",
0cb4a5e… anonymous 77 size="micro",
0cb4a5e… anonymous 78 language="python",
0cb4a5e… anonymous 79 backend="FastAPI",
0cb4a5e… anonymous 80 frontend="",
0cb4a5e… anonymous 81 status="planned",
0cb4a5e… anonymous 82 description="Test",
0cb4a5e… anonymous 83 )
0cb4a5e… anonymous 84 output = _capture(print_template_detail, t)
0cb4a5e… anonymous 85 assert "test-micro" in output
0cb4a5e… anonymous 86
0cb4a5e… anonymous 87
0cb4a5e… anonymous 88 class TestPrintHelpers:
0cb4a5e… anonymous 89 def test_print_success(self) -> None:
0cb4a5e… anonymous 90 output = _capture(print_success, "All good")
0cb4a5e… anonymous 91 assert "All good" in output
0cb4a5e… anonymous 92
0cb4a5e… anonymous 93 def test_print_error(self) -> None:
0cb4a5e… anonymous 94 output = _capture(print_error, "Something failed")
0cb4a5e… anonymous 95 assert "Something failed" in output
0cb4a5e… anonymous 96
0cb4a5e… anonymous 97 def test_print_info(self) -> None:
0cb4a5e… anonymous 98 output = _capture(print_info, "Just FYI")
0cb4a5e… anonymous 99 assert "Just FYI" in output
0cb4a5e… anonymous 100
0cb4a5e… anonymous 101 def test_print_warning(self) -> None:
0cb4a5e… anonymous 102 output = _capture(print_warning, "Be careful")
0cb4a5e… anonymous 103 assert "Be careful" in output

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button