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

1import types 

2import typing 

3 

4import pytest 

5 

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) 

14 

15 

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) 

105 

106 

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) 

118 

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