Coverage for tests/test_kubernetes.py: 100%
14 statements
« prev ^ index » next coverage.py v7.15.3, created at 2026-08-03 00:00 +0000
« prev ^ index » next coverage.py v7.15.3, created at 2026-08-03 00:00 +0000
1import types
2import typing
4import pytest
6from archdocs.main import SettingsForArchdocs
7from tests.rendered_diagram import (
8 FASTAPI_ROOT,
9 KUBERNETES_VARIANTS_ROOT,
10 LITESTAR_ROOT,
11 TESTS_ROOT,
12 render_example_diagram,
13)
16_FIXTURE_ANNOTATIONS: typing.Final = "replicas 3, HPA 2-10, target CPU 70%, cpu 100m-500m, RAM 128Mi-512Mi, GPU 1"
17_ALL_MANIFEST_CASES: typing.Final = types.MappingProxyType(
18 {
19 "chart of the project": (
20 SettingsForArchdocs(root_dir=TESTS_ROOT / "kubernetes_fixtures", service_name="kubernetes-svc"),
21 (
22 f'kubernetes_svc{{"kubernetes-svc ({_FIXTURE_ANNOTATIONS})"}}',
23 'external_client --> |"HTTPS api.example.com"| kubernetes_svc',
24 ),
25 (),
26 ),
27 "manifests and code on one node": (
28 SettingsForArchdocs(
29 root_dir=LITESTAR_ROOT,
30 service_name="merged-svc",
31 kubernetes_dir=TESTS_ROOT / "kubernetes_fixtures" / "chart",
32 ),
33 (
34 f'merged_svc{{"merged-svc ({_FIXTURE_ANNOTATIONS})"}}',
35 'external_client --> |"HTTPS api.example.com"| merged_svc',
36 'ConfigMap_app_config --> |"env"| merged_svc',
37 'Secret_app_secrets --> |"env"| merged_svc',
38 'ConfigMap_app_tuning --> |"volume"| merged_svc',
39 'merged_svc --> |"volume 10Gi"| PersistentVolume',
40 'redisdb["redis"]',
41 ),
42 (),
43 ),
44 "disabled toggles": (
45 SettingsForArchdocs(
46 root_dir=FASTAPI_ROOT,
47 service_name="disabled-svc",
48 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "disabled",
49 ),
50 ('disabled_svc{"disabled-svc (replicas 2)"}',),
51 ("never.example.com", "Ingress", "HPA"),
52 ),
53 "ingress without its own tls": (
54 SettingsForArchdocs(
55 root_dir=FASTAPI_ROOT,
56 service_name="plain-svc",
57 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "plain_ingress",
58 ),
59 ('external_client --> |"HTTP plain.example.com"| plain_svc',),
60 ("HTTPS",),
61 ),
62 "load balancer entrypoint": (
63 SettingsForArchdocs(
64 root_dir=FASTAPI_ROOT,
65 service_name="entry-svc",
66 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "loadbalancer",
67 ),
68 ('external_client --> |"LoadBalancer, port 8080"| entry_svc',),
69 (),
70 ),
71 "node port entrypoint": (
72 SettingsForArchdocs(
73 root_dir=FASTAPI_ROOT,
74 service_name="entry-svc",
75 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "nodeport",
76 ),
77 ('external_client --> |"NodePort"| entry_svc',),
78 (),
79 ),
80 "ingress entrypoint": (
81 SettingsForArchdocs(
82 root_dir=FASTAPI_ROOT,
83 service_name="entry-svc",
84 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "bare_ingress",
85 ),
86 ('external_client --> |"Ingress"| entry_svc',),
87 (),
88 ),
89 "plain manifests without a chart": (
90 SettingsForArchdocs(
91 root_dir=FASTAPI_ROOT,
92 service_name="stateful-svc",
93 kubernetes_dir=KUBERNETES_VARIANTS_ROOT / "statefulset",
94 ),
95 (
96 'stateful_svc{"stateful-svc (StatefulSet, replicas 2, cpu 250m-1, RAM 256Mi-1Gi)"}',
97 'external_client --> |"NodePort, port 8080"| stateful_svc',
98 'Secret_stateful_secrets --> |"env"| stateful_svc',
99 'stateful_svc --> |"volume 20Gi"| PersistentVolume',
100 ),
101 (),
102 ),
103 },
104)
107@pytest.mark.parametrize(
108 ("arch_settings", "expected_parts", "forbidden_parts"),
109 _ALL_MANIFEST_CASES.values(),
110 ids=_ALL_MANIFEST_CASES,
111)
112def test_manifests_reach_the_diagram(
113 arch_settings: SettingsForArchdocs,
114 expected_parts: tuple[str, ...],
115 forbidden_parts: tuple[str, ...],
116) -> None:
117 rendered_diagram: typing.Final = render_example_diagram(arch_settings)
119 for one_expected_part in expected_parts:
120 assert one_expected_part in rendered_diagram, one_expected_part
121 for one_forbidden_part in forbidden_parts:
122 assert one_forbidden_part not in rendered_diagram, one_forbidden_part