Coverage for src / mesh / tests / models / test_file_models.py: 100%
101 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-08-11 09:47 +0000
1import os
2from unittest.mock import patch
4from django.core.exceptions import ValidationError
5from django.core.files.uploadedfile import SimpleUploadedFile
6from django.db import DatabaseError
8from mesh.models.orm.factories import SubmissionVersionFactory
9from mesh.models.orm.file_models import get_upload_path_from_model
10from mesh.models.orm.submission_models import Submission, SubmissionAdditionalFile
12from ..base_test_case import BaseTestCase
15class BaseFileWrapperTestCase(BaseTestCase):
16 """
17 Tests for `BaseFileWrapperModel` class.
18 We use the `SubmissionAdditionalFile` class in the tests because
19 `BaseFileWrapperModel` is an abstract model.
20 """
22 used_models = [Submission]
24 def setUp(self):
25 super().setUp()
26 self.reset_user_files_directory()
27 self.version = SubmissionVersionFactory.create()
29 def test_file_path(self):
30 file_wrapper = SubmissionAdditionalFile()
31 file_wrapper.attached_to = self.version
32 file_wrapper.file = self.dummy_file
33 file_wrapper.save()
35 # Check that the original name is saved
36 self.assertEqual(file_wrapper.name, self.dummy_file.name)
38 # Check that the upload path is the one from get_upload_path
39 self.assertEqual(
40 file_wrapper.get_upload_path(self.dummy_file.name),
41 file_wrapper.file.name,
42 )
44 # Check creating a file with the same name
45 file_wrapper_2 = SubmissionAdditionalFile()
46 file_wrapper_2.attached_to = self.version
47 file_wrapper_2.file = self.dummy_file
48 file_wrapper_2.save()
50 # Check that the original name is saved
51 self.assertEqual(file_wrapper_2.name, self.dummy_file.name)
53 # The actual file path/name should be different: the second file having the
54 # same initial path and name as the first one, it should have been renamed correctly.
55 self.assertNotEqual(
56 file_wrapper.get_upload_path(self.dummy_file.name),
57 file_wrapper_2.file.name,
58 )
60 def test_validate_file_extension(self):
61 SubmissionAdditionalFile.file_extensions = [".pdf"]
62 SubmissionAdditionalFile.validate_file_extension(self.dummy_file)
64 SubmissionAdditionalFile.file_extensions = []
65 SubmissionAdditionalFile.validate_file_extension(self.dummy_file)
67 SubmissionAdditionalFile.file_extensions = [".docx"]
68 self.assertRaises(
69 ValidationError, SubmissionAdditionalFile.validate_file_extension, self.dummy_file
70 )
72 def test_validate_file_size(self):
73 SubmissionAdditionalFile.file_max_size = 10**6
74 SubmissionAdditionalFile.validate_file_size(self.dummy_file)
76 SubmissionAdditionalFile.file_max_size = 1
77 self.assertRaises(
78 ValidationError, SubmissionAdditionalFile.validate_file_size, self.dummy_file
79 )
81 def test_validate_file_name_length(self):
82 SubmissionAdditionalFile.file_name_max_length = 100
83 SubmissionAdditionalFile.validate_file_name_length(self.dummy_file)
85 self.dummy_file.name = "".join("a" for a in range(97)) + ".pdf"
86 self.assertRaises(
87 ValidationError, SubmissionAdditionalFile.validate_file_name_length, self.dummy_file
88 )
90 def test_base_run_file_validators(self):
91 SubmissionAdditionalFile.file_extensions = [".pdf"]
92 SubmissionAdditionalFile.file_max_size = 10**6
93 SubmissionAdditionalFile.file_name_max_length = 100
94 SubmissionAdditionalFile.run_file_validators(self.dummy_file)
96 SubmissionAdditionalFile.file_extensions = [".docx"]
97 self.assertRaises(
98 ValidationError, SubmissionAdditionalFile.run_file_validators, self.dummy_file
99 )
101 SubmissionAdditionalFile.file_extensions = [".pdf"]
102 SubmissionAdditionalFile.run_file_validators(self.dummy_file)
103 SubmissionAdditionalFile.file_max_size = 1
104 self.assertRaises(
105 ValidationError, SubmissionAdditionalFile.run_file_validators, self.dummy_file
106 )
108 SubmissionAdditionalFile.file_max_size = 10**6
109 SubmissionAdditionalFile.run_file_validators(self.dummy_file)
110 SubmissionAdditionalFile.file_name_max_length = 1
111 self.assertRaises(
112 ValidationError, SubmissionAdditionalFile.run_file_validators, self.dummy_file
113 )
115 file_wrapper = SubmissionAdditionalFile()
116 file_wrapper.attached_to = self.version
117 file_wrapper.file = self.dummy_file
119 def test_file_update(self):
120 file_wrapper = SubmissionAdditionalFile()
121 file_wrapper.attached_to = self.version
122 file_wrapper.file = self.dummy_file
123 file_wrapper.save()
125 path: str = file_wrapper.file.path
126 self.assertTrue(os.path.isfile(path))
128 new_file = SimpleUploadedFile(
129 "my_new_file.pdf", b"My new contentes", content_type="application/pdf"
130 )
131 file_wrapper.file = new_file
133 # DB save fails -> the original file should not have been deleted
134 with patch("django.db.models.Model.save", side_effect=DatabaseError("Error")):
135 self.assertRaises(DatabaseError, file_wrapper.save)
136 self.assertTrue(os.path.isfile(path))
138 # DB save succeeds -> the original file should have been deleted from
139 # the filesystem.
140 file_wrapper.save()
141 self.assertFalse(os.path.exists(path))
142 self.assertTrue(os.path.isfile(file_wrapper.file.path))
144 def test_delete(self):
145 file_wrapper = SubmissionAdditionalFile()
146 file_wrapper.attached_to = self.version
147 file_wrapper.file = self.dummy_file
148 file_wrapper.save()
150 path: str = file_wrapper.file.path
151 self.assertTrue(os.path.isfile(path))
153 file_wrapper.delete()
154 self.assertFalse(os.path.exists(path))
156 # Ensure the file is not deleted if the DB deletion fails
157 with patch("django.db.models.Model.delete", side_effect=DatabaseError("Error")):
158 file_wrapper = SubmissionAdditionalFile()
159 file_wrapper.attached_to = self.version
160 file_wrapper.file = self.dummy_file
161 file_wrapper.save()
163 path: str = file_wrapper.file.path
164 self.assertTrue(os.path.isfile(path))
166 self.assertRaises(DatabaseError, file_wrapper.delete)
167 self.assertTrue(os.path.isfile(path))
169 def test_get_upload_path_from_model(self):
170 file_wrapper = SubmissionAdditionalFile()
171 file_wrapper.attached_to = self.version
172 filename = "my_file.pdf"
174 self.assertEqual(
175 get_upload_path_from_model(file_wrapper, filename),
176 file_wrapper.get_upload_path(filename),
177 )