|
11 | 11 | from django.contrib.auth.models import Permission |
12 | 12 | from django.contrib.contenttypes.models import ContentType |
13 | 13 |
|
| 14 | +from addons.osfstorage.models import OsfStorageFile |
14 | 15 | from osf.models import ( |
15 | 16 | AdminLogEntry, |
16 | 17 | NodeLog, |
|
21 | 22 | DraftRegistration, |
22 | 23 | ) |
23 | 24 | from admin.nodes.views import ( |
| 25 | + NodeAddOsfStorageFileView, |
24 | 26 | NodeConfirmSpamView, |
25 | 27 | NodeDeleteView, |
26 | 28 | NodeRemoveContributorView, |
| 29 | + NodeRemoveOsfStorageFileView, |
27 | 30 | NodeView, |
28 | 31 | NodeReindexShare, |
29 | 32 | NodeReindexElastic, |
|
40 | 43 | ) |
41 | 44 | from admin_tests.utilities import setup_log_view, setup_view, handle_post_view_request |
42 | 45 | from api_tests.share._utils import mock_update_share |
| 46 | +from osf.models.files import Folder |
43 | 47 | from tests.utils import capture_notifications |
44 | 48 | from website import settings |
45 | 49 | from framework.auth.core import Auth |
@@ -905,3 +909,163 @@ def test_embargo_is_reset_after_reversion(self): |
905 | 909 | self.registration = self.no_moderation_draft.registered_node |
906 | 910 |
|
907 | 911 | assert self.registration.sanction is None |
| 912 | + |
| 913 | + |
| 914 | +class TestOsfStorageRegistrationFileAdd(AdminTestCase): |
| 915 | + |
| 916 | + def _create_file(self, instance, filename): |
| 917 | + return OsfStorageFile.create( |
| 918 | + target_object_id=instance.id, |
| 919 | + target_content_type=ContentType.objects.get_for_model(instance), |
| 920 | + path=f'/{filename}', |
| 921 | + name=filename, |
| 922 | + materialized_path=f'/{filename}' |
| 923 | + ) |
| 924 | + |
| 925 | + @property |
| 926 | + def _view(self): |
| 927 | + return NodeAddOsfStorageFileView() |
| 928 | + |
| 929 | + def check_message(self, expected_message): |
| 930 | + assert expected_message == self.request._messages._queued_messages[0].message |
| 931 | + |
| 932 | + def setUp(self): |
| 933 | + super().setUp() |
| 934 | + self.project = ProjectFactory() |
| 935 | + self.project2 = ProjectFactory() |
| 936 | + self.registration_registered_from = RegistrationFactory(project=self.project) |
| 937 | + self.registration_without_registered_from = RegistrationFactory() |
| 938 | + self.registration_without_registered_from.registered_from = None |
| 939 | + self.registration_without_registered_from.save() |
| 940 | + |
| 941 | + self.request = RequestFactory().get('/fake_path') |
| 942 | + patch_messages(self.request) |
| 943 | + |
| 944 | + def test_no_guid_found(self): |
| 945 | + self.request.POST = {'file-guid': '1234'} |
| 946 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 947 | + view.post(self.request) |
| 948 | + self.check_message('No file found with the provided guid.') |
| 949 | + |
| 950 | + def test_guid_is_not_file(self): |
| 951 | + project = ProjectFactory() |
| 952 | + self.request.POST = {'file-guid': project._id} |
| 953 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 954 | + view.post(self.request) |
| 955 | + self.check_message('The guid provided does not correspond to a file.') |
| 956 | + |
| 957 | + def test_no_parent_registration(self): |
| 958 | + file = self._create_file(self.project, 'file.txt') |
| 959 | + file.save() |
| 960 | + file_guid = file.get_guid(create=True) |
| 961 | + self.request.POST = {'file-guid': file_guid._id} |
| 962 | + view = setup_log_view(self._view, self.request, guid=self.registration_without_registered_from._id) |
| 963 | + view.post(self.request) |
| 964 | + self.check_message('The registration does not have the parent node.') |
| 965 | + |
| 966 | + def test_file_is_not_attached_to_parent(self): |
| 967 | + file = self._create_file(self.project2, 'file.txt') |
| 968 | + file.save() |
| 969 | + file_guid = file.get_guid(create=True) |
| 970 | + self.request.POST = {'file-guid': file_guid._id} |
| 971 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 972 | + view.post(self.request) |
| 973 | + self.check_message('The file with the provided guid is not part of the parent node.') |
| 974 | + |
| 975 | + def test_file_is_added_to_registration_osfstorage(self): |
| 976 | + file = self._create_file(self.project, 'file.txt') |
| 977 | + file.save() |
| 978 | + file_guid = file.get_guid(create=True) |
| 979 | + self.request.POST = {'file-guid': file_guid._id} |
| 980 | + registration_osfstorage = self.registration_registered_from.get_addon('osfstorage') |
| 981 | + # create archive folder for a registration |
| 982 | + registration_osfstorage.get_root()._create_child(name=registration_osfstorage.archive_folder_name, kind=Folder) |
| 983 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 984 | + view.post(self.request) |
| 985 | + |
| 986 | + # check that file is added to registration osfstorage under archive folder |
| 987 | + assert registration_osfstorage.get_root().children.get( |
| 988 | + name=registration_osfstorage.archive_folder_name |
| 989 | + ).children.filter(name=file.name).exists() |
| 990 | + |
| 991 | + |
| 992 | +class TestOsfStorageRegistrationFileRemove(AdminTestCase): |
| 993 | + |
| 994 | + def _create_file(self, instance, filename): |
| 995 | + return OsfStorageFile.create( |
| 996 | + target_object_id=instance.id, |
| 997 | + target_content_type=ContentType.objects.get_for_model(instance), |
| 998 | + path=f'/{filename}', |
| 999 | + name=filename, |
| 1000 | + materialized_path=f'/{filename}' |
| 1001 | + ) |
| 1002 | + |
| 1003 | + @property |
| 1004 | + def _view(self): |
| 1005 | + return NodeRemoveOsfStorageFileView() |
| 1006 | + |
| 1007 | + def check_message(self, expected_message): |
| 1008 | + assert expected_message == self.request._messages._queued_messages[0].message |
| 1009 | + |
| 1010 | + def setUp(self): |
| 1011 | + super().setUp() |
| 1012 | + self.project = ProjectFactory() |
| 1013 | + self.registration_registered_from = RegistrationFactory(project=self.project) |
| 1014 | + |
| 1015 | + self.request = RequestFactory().get('/fake_path') |
| 1016 | + patch_messages(self.request) |
| 1017 | + |
| 1018 | + def test_no_guid_found(self): |
| 1019 | + self.request.POST = {'file-guid': '1234'} |
| 1020 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 1021 | + view.post(self.request) |
| 1022 | + self.check_message('No file found with the provided guid.') |
| 1023 | + |
| 1024 | + def test_guid_is_not_file(self): |
| 1025 | + project = ProjectFactory() |
| 1026 | + self.request.POST = {'file-guid': project._id} |
| 1027 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 1028 | + view.post(self.request) |
| 1029 | + self.check_message('The guid provided does not correspond to a file.') |
| 1030 | + |
| 1031 | + def test_file_not_attached_to_registration(self): |
| 1032 | + file = self._create_file(self.project, 'file2.txt') |
| 1033 | + file.save() |
| 1034 | + file_guid = file.get_guid(create=True) |
| 1035 | + |
| 1036 | + self.request.POST = {'file-guid': file_guid._id} |
| 1037 | + view = setup_log_view(self._view, self.request, guid=self.registration_registered_from._id) |
| 1038 | + view.post(self.request) |
| 1039 | + self.check_message('The file with the provided guid is not part of the registration.') |
| 1040 | + |
| 1041 | + def test_file_is_removed_from_registration_osfstorage(self): |
| 1042 | + file = self._create_file(self.project, 'file2.txt') |
| 1043 | + file.save() |
| 1044 | + file_guid = file.get_guid(create=True) |
| 1045 | + |
| 1046 | + # create archive folder for a registration |
| 1047 | + registration_osfstorage = self.registration_registered_from.get_addon('osfstorage') |
| 1048 | + registration_osfstorage.get_root()._create_child(name=registration_osfstorage.archive_folder_name, kind=Folder) |
| 1049 | + |
| 1050 | + # add file to osfstorage |
| 1051 | + self.request.POST = {'file-guid': file_guid._id} |
| 1052 | + view = setup_log_view(NodeAddOsfStorageFileView(), self.request, guid=self.registration_registered_from._id) |
| 1053 | + view.post(self.request) |
| 1054 | + |
| 1055 | + # file exists in archive folder |
| 1056 | + assert registration_osfstorage.get_root().children.get( |
| 1057 | + name=registration_osfstorage.archive_folder_name |
| 1058 | + ).children.filter(name=file.name).exists() |
| 1059 | + # file exists but with different guid |
| 1060 | + registration_file = self.registration_registered_from.files.get(name=file.name) |
| 1061 | + registration_file.get_guid(create=True) |
| 1062 | + |
| 1063 | + # delete this file with different guid |
| 1064 | + self.request.POST = {'file-guid': registration_file.guids.first()._id} |
| 1065 | + view = setup_log_view(NodeRemoveOsfStorageFileView(), self.request, guid=self.registration_registered_from._id) |
| 1066 | + view.post(self.request) |
| 1067 | + # check that file is removed from registration osfstorage |
| 1068 | + assert not registration_osfstorage.get_root().children.get( |
| 1069 | + name=registration_osfstorage.archive_folder_name |
| 1070 | + ).children.exists() |
| 1071 | + assert not self.registration_registered_from.files.exists() |
0 commit comments