|
1
|
"""Tests for boilerworks.registry.""" |
|
2
|
|
|
3
|
from __future__ import annotations |
|
4
|
|
|
5
|
import pytest |
|
6
|
|
|
7
|
from boilerworks.registry import Registry, TemplateInfo |
|
8
|
|
|
9
|
|
|
10
|
@pytest.fixture(scope="module") |
|
11
|
def registry() -> Registry: |
|
12
|
return Registry() |
|
13
|
|
|
14
|
|
|
15
|
def test_yaml_loads_without_error(registry: Registry) -> None: |
|
16
|
templates = registry.list_all() |
|
17
|
assert isinstance(templates, list) |
|
18
|
assert len(templates) > 0 |
|
19
|
|
|
20
|
|
|
21
|
def test_all_26_templates_present(registry: Registry) -> None: |
|
22
|
assert len(registry.list_all()) == 26 |
|
23
|
|
|
24
|
|
|
25
|
def test_templates_are_template_info_instances(registry: Registry) -> None: |
|
26
|
for t in registry.list_all(): |
|
27
|
assert isinstance(t, TemplateInfo) |
|
28
|
|
|
29
|
|
|
30
|
def test_filter_by_size_full(registry: Registry) -> None: |
|
31
|
full = registry.filter_by_size("full") |
|
32
|
assert len(full) == 15 |
|
33
|
assert all(t.size == "full" for t in full) |
|
34
|
|
|
35
|
|
|
36
|
def test_filter_by_size_micro(registry: Registry) -> None: |
|
37
|
micro = registry.filter_by_size("micro") |
|
38
|
assert len(micro) == 6 |
|
39
|
assert all(t.size == "micro" for t in micro) |
|
40
|
|
|
41
|
|
|
42
|
def test_filter_by_size_edge(registry: Registry) -> None: |
|
43
|
edge = registry.filter_by_size("edge") |
|
44
|
assert len(edge) == 5 |
|
45
|
assert all(t.size == "edge" for t in edge) |
|
46
|
|
|
47
|
|
|
48
|
def test_filter_by_language_python(registry: Registry) -> None: |
|
49
|
python = registry.filter_by_language("python") |
|
50
|
names = {t.name for t in python} |
|
51
|
assert "django-nextjs" in names |
|
52
|
assert "fastapi-micro" in names |
|
53
|
assert "nestjs-nextjs" not in names |
|
54
|
|
|
55
|
|
|
56
|
def test_filter_by_language_typescript(registry: Registry) -> None: |
|
57
|
ts = registry.filter_by_language("typescript") |
|
58
|
names = {t.name for t in ts} |
|
59
|
assert "nestjs-nextjs" in names |
|
60
|
assert "django-nextjs" not in names |
|
61
|
|
|
62
|
|
|
63
|
def test_filter_by_language_go(registry: Registry) -> None: |
|
64
|
go = registry.filter_by_language("go") |
|
65
|
assert all(t.language == "go" for t in go) |
|
66
|
assert len(go) >= 2 |
|
67
|
|
|
68
|
|
|
69
|
def test_get_by_name_returns_correct_template(registry: Registry) -> None: |
|
70
|
t = registry.get_by_name("django-nextjs") |
|
71
|
assert t is not None |
|
72
|
assert t.name == "django-nextjs" |
|
73
|
assert t.size == "full" |
|
74
|
assert t.language == "python" |
|
75
|
assert t.status == "done" |
|
76
|
|
|
77
|
|
|
78
|
def test_get_by_name_returns_none_for_unknown(registry: Registry) -> None: |
|
79
|
assert registry.get_by_name("this-does-not-exist") is None |
|
80
|
|
|
81
|
|
|
82
|
def test_get_by_name_fastapi_micro(registry: Registry) -> None: |
|
83
|
t = registry.get_by_name("fastapi-micro") |
|
84
|
assert t is not None |
|
85
|
assert t.size == "micro" |
|
86
|
assert t.language == "python" |
|
87
|
|
|
88
|
|
|
89
|
def test_search_by_keyword(registry: Registry) -> None: |
|
90
|
results = registry.search("e-commerce") |
|
91
|
names = {t.name for t in results} |
|
92
|
assert "saleor-nextjs" in names |
|
93
|
|
|
94
|
|
|
95
|
def test_search_case_insensitive(registry: Registry) -> None: |
|
96
|
results = registry.search("Python") |
|
97
|
assert len(results) > 0 |
|
98
|
|
|
99
|
|
|
100
|
def test_filter_by_status_done(registry: Registry) -> None: |
|
101
|
done = registry.filter_by_status("done") |
|
102
|
assert len(done) == 26 |
|
103
|
assert all(t.status == "done" for t in done) |
|
104
|
|
|
105
|
|
|
106
|
def test_all_templates_have_required_fields(registry: Registry) -> None: |
|
107
|
for t in registry.list_all(): |
|
108
|
assert t.name, f"Template missing name: {t}" |
|
109
|
assert t.repo, f"Template {t.name} missing repo" |
|
110
|
assert t.size in ("full", "micro", "edge"), f"Template {t.name} has invalid size" |
|
111
|
assert t.language, f"Template {t.name} missing language" |
|
112
|
assert t.status in ("done", "building", "planned"), f"Template {t.name} has invalid status" |
|
113
|
assert t.description, f"Template {t.name} missing description" |
|
114
|
|
|
115
|
|
|
116
|
def test_names_returns_all_names(registry: Registry) -> None: |
|
117
|
names = registry.names() |
|
118
|
assert len(names) == 26 |
|
119
|
assert "django-nextjs" in names |
|
120
|
assert "astro-site" in names |
|
121
|
|