Coverage for glotter/test_generator.py: 100%
41 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-12 02:25 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-12 02:25 +0000
1import os
2import shutil
4from black import format_str, Mode
6from glotter.settings import Settings
8AUTO_GEN_TEST_PATH = os.path.join("test", "generated")
11def generate_tests():
12 """
13 Generate tests for all projects
14 """
16 shutil.rmtree(AUTO_GEN_TEST_PATH, ignore_errors=True)
17 settings = Settings()
18 test_generators = {
19 project_name: TestGenerator(project_name, project)
20 for project_name, project in settings.projects.items()
21 }
22 test_codes = {}
23 for project_name, test_generator in test_generators.items():
24 test_code = test_generator.generate_tests()
25 if test_code:
26 test_codes[project_name] = test_code
28 for project_name, test_code in test_codes.items():
29 test_generators[project_name].write_tests(test_code)
32class TestGenerator:
33 __test__ = False # Indicate this is not a test
35 def __init__(self, project_name, project):
36 self.project_name = project_name
37 self.project = project
38 self.long_project_name = "_".join(self.project.words)
40 def generate_tests(self):
41 if not self.project.tests:
42 return ""
44 test_code = self._get_imports() + self._get_project_fixture()
45 for test_obj in self.project.tests.values():
46 test_code += test_obj.generate_test(self.long_project_name)
48 return format_str(test_code, mode=Mode())
50 def _get_imports(self):
51 test_code = ""
52 if self.project.requires_parameters:
53 test_code += "import pytest\n"
55 test_code += "from glotter import project_test, project_fixture\n"
56 return test_code
58 def _get_project_fixture(self):
59 return f"""\
60PROJECT_NAME="{self.project_name}"
61@project_fixture(PROJECT_NAME)
62def {self.long_project_name}(request):
63 try:
64 request.param.build()
65 yield request.param
66 finally:
67 request.param.cleanup()
68"""
70 def write_tests(self, test_code):
71 os.makedirs(AUTO_GEN_TEST_PATH, exist_ok=True)
72 with open(
73 os.path.join(AUTO_GEN_TEST_PATH, f"test_{self.long_project_name}.py"),
74 "w",
75 encoding="utf-8",
76 ) as f:
77 f.write(test_code)