|
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 |