Coverage for src/mesh/tests/base_test_case.py: 98%

49 statements  

« prev     ^ index     » next       coverage.py v7.9.0, created at 2026-02-04 09:42 +0000

1import os 

2import shutil 

3 

4from django.contrib.messages.middleware import MessageMiddleware 

5from django.contrib.sessions.middleware import SessionMiddleware 

6from django.core.files.uploadedfile import SimpleUploadedFile 

7from django.db.models import Model 

8from django.http import HttpRequest, HttpResponse 

9from django.test import RequestFactory, TestCase 

10 

11from ..app_settings import app_settings 

12 

13 

14def reset_user_files_directory(): 

15 """ 

16 Removes everything in the (test !!!) directory used to store MESH user files. 

17 """ 

18 base = app_settings.FILES_DIRECTORY 

19 for filename in os.listdir(base): 

20 file_path = os.path.join(base, filename) 

21 if os.path.isfile(file_path) or os.path.islink(file_path): 

22 os.unlink(file_path) 

23 elif os.path.isdir(file_path): 

24 shutil.rmtree(file_path) 

25 

26 

27class BaseTestCase(TestCase): 

28 """ 

29 Base test case offering basic commodities such has: 

30 - WSGI request forgery with session & message 

31 - Automatic clean up of tables used by the whole test case or individual test functions 

32 ... 

33 """ 

34 

35 dummy_file = SimpleUploadedFile( 

36 "my_submission.pdf", b"My submission", content_type="application/pdf" 

37 ) 

38 # List of used models to be deleted after each test function. 

39 used_models: list[type[Model]] = [] 

40 # List of used models to be deleted after the full test case. 

41 class_used_models: list[type[Model]] = [] 

42 

43 request_factory = RequestFactory() 

44 session_middleware = SessionMiddleware(lambda x: HttpResponse()) 

45 message_middleware = MessageMiddleware(lambda x: HttpResponse()) 

46 

47 @classmethod 

48 def dummy_request(cls, route: str = "/", *args, **kwargs) -> HttpRequest: 

49 request = cls.request_factory.get(route, *args, **kwargs) 

50 cls.session_middleware.process_request(request) 

51 cls.message_middleware.process_request(request) 

52 return request 

53 

54 @classmethod 

55 def setUpClass(cls) -> None: 

56 super().setUpClass() 

57 cls.clear_tables(*cls.used_models) 

58 cls.clear_tables(*cls.class_used_models) 

59 

60 @classmethod 

61 def tearDownClass(cls) -> None: 

62 cls.reset_user_files_directory() 

63 cls.clear_tables(*cls.class_used_models) 

64 

65 @classmethod 

66 def clear_tables(cls, *args: type[Model]): 

67 """ 

68 Empty the given tables. 

69 """ 

70 for model in args: 

71 model.objects.all().delete() 

72 

73 def tearDown(self): 

74 """Clear all the model tables listed in `self.used_models`""" 

75 super().tearDown() 

76 self.clear_tables(*self.used_models) 

77 

78 @classmethod 

79 def reset_user_files_directory(cls): 

80 """ 

81 Removes everything in the (test !!!) directory used to store MESH user files. 

82 """ 

83 reset_user_files_directory()