diff --git a/swh/deposit/api/private/deposit_check.py b/swh/deposit/api/private/deposit_check.py
--- a/swh/deposit/api/private/deposit_check.py
+++ b/swh/deposit/api/private/deposit_check.py
@@ -11,7 +11,7 @@
from ..common import SWHGetDepositAPI, SWHPrivateAPIView
from ...config import DEPOSIT_STATUS_READY, DEPOSIT_STATUS_REJECTED
-from ...config import ARCHIVE_TYPE
+from ...config import ARCHIVE_TYPE, METADATA_TYPE
from ...models import Deposit, DepositRequest
@@ -21,6 +21,7 @@
Only GET is supported.
"""
+
def deposit_requests(self, deposit):
"""Given a deposit, yields its associated deposit_request
@@ -62,7 +63,21 @@
True if metadata is ok, False otherwise.
"""
- # FIXME: Define checks to implement
+ must_meta = ['url', 'external_identifier', ['name', 'title'], 'author']
+ # checks only for must metadata on all metadata requests
+ for mm in must_meta:
+ found = False
+ for k in metadata:
+ if isinstance(mm, list):
+ for p in mm:
+ if p in k:
+ found = True
+ break
+ elif mm in k:
+ found = True
+ break
+ if not found:
+ return False
return True
def process_get(self, req, collection_name, deposit_id):
@@ -79,16 +94,18 @@
"""
deposit = Deposit.objects.get(pk=deposit_id)
+ all_metadata = {}
# will check each deposit request for the deposit
for dr in self.deposit_requests(deposit):
if dr.type.name == ARCHIVE_TYPE:
deposit_status = self._check_archive(dr.archive)
- else:
- deposit_status = self._check_metadata(dr.metadata)
-
+ elif dr.type.name == METADATA_TYPE:
+ # aggregating all metadata requests for check on complete set
+ all_metadata.update(dr.metadata)
if not deposit_status:
break
+ deposit_status = self._check_metadata(all_metadata)
# if problem in any deposit requests, the deposit is rejected
if not deposit_status:
deposit.status = DEPOSIT_STATUS_REJECTED
diff --git a/swh/deposit/tests/api/test_deposit_check.py b/swh/deposit/tests/api/test_deposit_check.py
--- a/swh/deposit/tests/api/test_deposit_check.py
+++ b/swh/deposit/tests/api/test_deposit_check.py
@@ -33,7 +33,9 @@
"""Proper deposit should succeed the checks (-> status ready)
"""
- deposit_id = self.create_simple_binary_deposit(status_partial=False)
+ deposit_id = self.create_simple_binary_deposit(status_partial=True)
+ deposit_id = self.update_binary_deposit(deposit_id,
+ status_partial=False)
deposit = Deposit.objects.get(pk=deposit_id)
self.assertEquals(deposit.status, DEPOSIT_STATUS_READY_FOR_CHECKS)
@@ -69,3 +71,28 @@
self.assertEqual(data['status'], DEPOSIT_STATUS_REJECTED)
deposit = Deposit.objects.get(pk=deposit.id)
self.assertEquals(deposit.status, DEPOSIT_STATUS_REJECTED)
+
+ @istest
+ def check_deposit_metadata_ok(self):
+ """Proper deposit should succeed the checks (-> status ready)
+ with all **MUST** metadata
+
+ using the codemeta metadata test set
+ """
+ deposit_id = self.create_simple_binary_deposit(status_partial=True)
+ deposit_id_metadata = self.add_metadata_to_deposit(deposit_id)
+ self.assertEquals(deposit_id, deposit_id_metadata)
+
+ deposit = Deposit.objects.get(pk=deposit_id)
+ self.assertEquals(deposit.status, DEPOSIT_STATUS_READY_FOR_CHECKS)
+
+ url = reverse(PRIVATE_CHECK_DEPOSIT,
+ args=[self.collection.name, deposit.id])
+
+ response = self.client.get(url)
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ data = json.loads(response.content.decode('utf-8'))
+ self.assertEqual(data['status'], DEPOSIT_STATUS_READY)
+ deposit = Deposit.objects.get(pk=deposit.id)
+ self.assertEquals(deposit.status, DEPOSIT_STATUS_READY)
diff --git a/swh/deposit/tests/common.py b/swh/deposit/tests/common.py
--- a/swh/deposit/tests/common.py
+++ b/swh/deposit/tests/common.py
@@ -95,6 +95,16 @@
self.archive = create_arborescence_zip(
self.root_path, 'archive1', 'file1', b'some content in file')
+ self.atom_entry = b"""
+
+ Awesome Compiler
+ urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
+ 1785io25c695
+ 2017-10-07T15:17:08Z
+ some awesome author
+ http://test.test.fr
+ """
+
def tearDown(self):
super().tearDown()
shutil.rmtree(self.root_path)
@@ -141,6 +151,22 @@
'{http://www.w3.org/2005/Atom}deposit_id']
return deposit_id
+ def update_binary_deposit(self, deposit_id, status_partial=False):
+ # update existing deposit with atom entry metadata
+ response = self.client.post(
+ reverse(EDIT_SE_IRI, args=[self.collection.name, deposit_id]),
+ content_type='application/atom+xml;type=entry',
+ data=self.codemeta_entry_data1,
+ HTTP_SLUG='external-id',
+ HTTP_IN_PROGRESS=status_partial)
+
+ # then
+ # assert response.status_code == status.HTTP_201_CREATED
+ response_content = parse_xml(BytesIO(response.content))
+ deposit_id = response_content[
+ '{http://www.w3.org/2005/Atom}deposit_id']
+ return deposit_id
+
@attr('fs')
class BasicTestCase(TestCase):
@@ -220,14 +246,14 @@
super().setUp()
self.atom_entry_data0 = b"""
-
- some-external-id
-"""
+
+ some-external-id
+ """
self.atom_entry_data1 = b"""
-
- anotherthing
-"""
+
+ anotherthing
+ """
self.atom_entry_data2 = b"""
@@ -236,12 +262,14 @@
1785io25c695
2017-10-07T15:17:08Z
some awesome author
+ http://test.test.fr
"""
self.codemeta_entry_data0 = b"""
Awesome Compiler
+ http://test.test.fr
urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
1785io25c695
2017-10-07T15:17:08Z
@@ -278,6 +306,9 @@
HAL
hal@ccsd.cnrs.fr
+
+ Morane Gruenpeter
+
"""
def create_invalid_deposit(self):
diff --git a/swh/deposit/tests/loader/test_checker.py b/swh/deposit/tests/loader/test_checker.py
--- a/swh/deposit/tests/loader/test_checker.py
+++ b/swh/deposit/tests/loader/test_checker.py
@@ -38,6 +38,8 @@
"""
# 1. create a deposit with archive and metadata
deposit_id = self.create_simple_binary_deposit()
+ deposit_id = self.update_binary_deposit(deposit_id,
+ status_partial=False)
args = [self.collection.name, deposit_id]
deposit_check_url = reverse(PRIVATE_CHECK_DEPOSIT, args=args)
diff --git a/swh/deposit/tests/loader/test_loader.py b/swh/deposit/tests/loader/test_loader.py
--- a/swh/deposit/tests/loader/test_loader.py
+++ b/swh/deposit/tests/loader/test_loader.py
@@ -268,6 +268,9 @@
codemeta + 'name':
'CeCILL Free Software License Agreement v1.1'
},
+ codemeta + 'author': {
+ codemeta + 'name': 'Morane Gruenpeter'
+ },
codemeta + 'programmingLanguage': 'C',
codemeta + 'applicationCategory': 'test',
codemeta + 'dateCreated': '2017-05-03T16:08:47+02:00',