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
« prev ^ index » next coverage.py v7.9.0, created at 2026-02-04 09:42 +0000
1import os
2import shutil
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
11from ..app_settings import app_settings
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)
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 """
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]] = []
43 request_factory = RequestFactory()
44 session_middleware = SessionMiddleware(lambda x: HttpResponse())
45 message_middleware = MessageMiddleware(lambda x: HttpResponse())
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
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)
60 @classmethod
61 def tearDownClass(cls) -> None:
62 cls.reset_user_files_directory()
63 cls.clear_tables(*cls.class_used_models)
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()
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)
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()