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

1import os 

2from unittest.mock import patch 

3 

4from django.core.exceptions import ValidationError 

5from django.core.files.uploadedfile import SimpleUploadedFile 

6from django.db import DatabaseError 

7 

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 

11 

12from ..base_test_case import BaseTestCase 

13 

14 

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

21 

22 used_models = [Submission] 

23 

24 def setUp(self): 

25 super().setUp() 

26 self.reset_user_files_directory() 

27 self.version = SubmissionVersionFactory.create() 

28 

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() 

34 

35 # Check that the original name is saved 

36 self.assertEqual(file_wrapper.name, self.dummy_file.name) 

37 

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 ) 

43 

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() 

49 

50 # Check that the original name is saved 

51 self.assertEqual(file_wrapper_2.name, self.dummy_file.name) 

52 

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 ) 

59 

60 def test_validate_file_extension(self): 

61 SubmissionAdditionalFile.file_extensions = [".pdf"] 

62 SubmissionAdditionalFile.validate_file_extension(self.dummy_file) 

63 

64 SubmissionAdditionalFile.file_extensions = [] 

65 SubmissionAdditionalFile.validate_file_extension(self.dummy_file) 

66 

67 SubmissionAdditionalFile.file_extensions = [".docx"] 

68 self.assertRaises( 

69 ValidationError, SubmissionAdditionalFile.validate_file_extension, self.dummy_file 

70 ) 

71 

72 def test_validate_file_size(self): 

73 SubmissionAdditionalFile.file_max_size = 10**6 

74 SubmissionAdditionalFile.validate_file_size(self.dummy_file) 

75 

76 SubmissionAdditionalFile.file_max_size = 1 

77 self.assertRaises( 

78 ValidationError, SubmissionAdditionalFile.validate_file_size, self.dummy_file 

79 ) 

80 

81 def test_validate_file_name_length(self): 

82 SubmissionAdditionalFile.file_name_max_length = 100 

83 SubmissionAdditionalFile.validate_file_name_length(self.dummy_file) 

84 

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 ) 

89 

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) 

95 

96 SubmissionAdditionalFile.file_extensions = [".docx"] 

97 self.assertRaises( 

98 ValidationError, SubmissionAdditionalFile.run_file_validators, self.dummy_file 

99 ) 

100 

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 ) 

107 

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 ) 

114 

115 file_wrapper = SubmissionAdditionalFile() 

116 file_wrapper.attached_to = self.version 

117 file_wrapper.file = self.dummy_file 

118 

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() 

124 

125 path: str = file_wrapper.file.path 

126 self.assertTrue(os.path.isfile(path)) 

127 

128 new_file = SimpleUploadedFile( 

129 "my_new_file.pdf", b"My new contentes", content_type="application/pdf" 

130 ) 

131 file_wrapper.file = new_file 

132 

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

137 

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

143 

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() 

149 

150 path: str = file_wrapper.file.path 

151 self.assertTrue(os.path.isfile(path)) 

152 

153 file_wrapper.delete() 

154 self.assertFalse(os.path.exists(path)) 

155 

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() 

162 

163 path: str = file_wrapper.file.path 

164 self.assertTrue(os.path.isfile(path)) 

165 

166 self.assertRaises(DatabaseError, file_wrapper.delete) 

167 self.assertTrue(os.path.isfile(path)) 

168 

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" 

173 

174 self.assertEqual( 

175 get_upload_path_from_model(file_wrapper, filename), 

176 file_wrapper.get_upload_path(filename), 

177 )