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

1import os 

2import shutil 

3 

4from black import format_str, Mode 

5 

6from glotter.settings import Settings 

7 

8AUTO_GEN_TEST_PATH = os.path.join("test", "generated") 

9 

10 

11def generate_tests(): 

12 """ 

13 Generate tests for all projects 

14 """ 

15 

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 

27 

28 for project_name, test_code in test_codes.items(): 

29 test_generators[project_name].write_tests(test_code) 

30 

31 

32class TestGenerator: 

33 __test__ = False # Indicate this is not a test 

34 

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) 

39 

40 def generate_tests(self): 

41 if not self.project.tests: 

42 return "" 

43 

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) 

47 

48 return format_str(test_code, mode=Mode()) 

49 

50 def _get_imports(self): 

51 test_code = "" 

52 if self.project.requires_parameters: 

53 test_code += "import pytest\n" 

54 

55 test_code += "from glotter import project_test, project_fixture\n" 

56 return test_code 

57 

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

69 

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)