diff --git a/swh/deposit/tests/api/data/atom/codemeta-sample.xml b/swh/deposit/tests/api/data/atom/codemeta-sample.xml index 98c3e06d..d804eff5 100644 --- a/swh/deposit/tests/api/data/atom/codemeta-sample.xml +++ b/swh/deposit/tests/api/data/atom/codemeta-sample.xml @@ -1,53 +1,51 @@ - - %s hal-01587361 https://hal.inria.fr/hal-01587361 https://hal.inria.fr/hal-01587361/document https://hal.inria.fr/hal-01587361/file/AffectationRO-v1.0.0.zip doi:10.5281/zenodo.438684 The assignment problem AffectationRO Gruenpeter, Morane [INFO] Computer Science [cs] [INFO.INFO-RO] Computer Science [cs]/Operations Research [cs.RO] SOFTWARE Project in OR: The assignment problemA java implementation for the assignment problem first release description fr 2015-06-01 2017-10-19 en url stable Version sur hal Version entre par lutilisateur Mots-cls Commentaire Rfrence interne Collaboration/Projet nom du projet id Voir aussi Financement Projet ANR Projet Europen Platform/OS Dpendances Etat du dveloppement license url spdx Outils de dveloppement- outil no1 Outils de dveloppement- outil no2 http://code.com language 1 language 2 diff --git a/swh/deposit/tests/api/data/atom/entry-data2.xml b/swh/deposit/tests/api/data/atom/entry-data2.xml new file mode 100644 index 00000000..73cfafeb --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data2.xml @@ -0,0 +1,6 @@ + + + some-external-id + https://hal-test.archives-ouvertes.fr/some-external-id + some awesome author + diff --git a/swh/deposit/tests/api/data/atom/entry-data3.xml b/swh/deposit/tests/api/data/atom/entry-data3.xml new file mode 100644 index 00000000..c75d9739 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data3.xml @@ -0,0 +1,6 @@ + + + another one + no one + 2017-10-07T15:17:08Z + diff --git a/swh/deposit/tests/api/data/atom/metadata.xml b/swh/deposit/tests/api/data/atom/metadata.xml new file mode 100644 index 00000000..65f58543 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/metadata.xml @@ -0,0 +1,32 @@ + + + Composing a Web of Audio Applications + hal + hal-01243065 + hal-01243065 + https://hal-test.archives-ouvertes.fr/hal-01243065 + test + DSP programming + this is the description + 1 + phpstorm + stable + php + python + C + + GNU General Public License v3.0 only + + + CeCILL Free Software License Agreement v1.1 + + + HAL + hal@ccsd.cnrs.fr + + + Morane Gruenpeter + +%s + diff --git a/swh/deposit/tests/api/test_deposit_private_read_metadata.py b/swh/deposit/tests/api/test_deposit_private_read_metadata.py index 2ccc10f9..c1e4ae02 100644 --- a/swh/deposit/tests/api/test_deposit_private_read_metadata.py +++ b/swh/deposit/tests/api/test_deposit_private_read_metadata.py @@ -1,646 +1,601 @@ # Copyright (C) 2017-2019 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information - from django.urls import reverse from rest_framework import status -from rest_framework.test import APITestCase from swh.deposit.models import Deposit -from swh.deposit.config import PRIVATE_GET_DEPOSIT_METADATA -from swh.deposit.config import DEPOSIT_STATUS_LOAD_SUCCESS -from swh.deposit.config import DEPOSIT_STATUS_PARTIAL +from swh.deposit.config import ( + PRIVATE_GET_DEPOSIT_METADATA, SWH_PERSON, EDIT_SE_IRI +) -from swh.deposit.config import SWH_PERSON -from swh.deposit.tests.common import ( - BasicTestCase, WithAuthTestCase, CommonCreationRoutine -) +PRIVATE_GET_DEPOSIT_METADATA_NC = PRIVATE_GET_DEPOSIT_METADATA + '-nc' -class DepositReadMetadataTest(APITestCase, WithAuthTestCase, BasicTestCase, - CommonCreationRoutine): - """Deposit access to read metadata information on deposit. +def private_get_raw_url_endpoints(collection, deposit): + """There are 2 endpoints to check (one with collection, one without)""" + deposit_id = deposit if isinstance(deposit, int) else deposit.id + return [ + reverse(PRIVATE_GET_DEPOSIT_METADATA, + args=[collection.name, deposit_id]), + reverse(PRIVATE_GET_DEPOSIT_METADATA_NC, + args=[deposit_id]) + ] + + +def update_deposit(authenticated_client, collection, deposit, atom_dataset): + for atom_data in ['entry-data2', 'entry-data3']: + update_deposit_with_metadata( + authenticated_client, collection, deposit, atom_dataset[atom_data] + ) + return deposit - """ - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self.template_metadata = """ - - Composing a Web of Audio Applications - hal - hal-01243065 - hal-01243065 - https://hal-test.archives-ouvertes.fr/hal-01243065 - test - DSP programming - this is the description - 1 - phpstorm - stable - php - python - C - - GNU General Public License v3.0 only - - - CeCILL Free Software License Agreement v1.1 - - - HAL - hal@ccsd.cnrs.fr - - - Morane Gruenpeter - -%s -""" - - def private_deposit_url(self, deposit_id): - return reverse(PRIVATE_GET_DEPOSIT_METADATA, - args=[self.collection.name, deposit_id]) - - def test_read_metadata(self): - """Private metadata read api to existing deposit should return metadata - - """ - deposit_id = self.create_deposit_partial() - - url = self.private_deposit_url(deposit_id) - - response = self.client.get(url) - - self.assertEqual(response.status_code, - status.HTTP_200_OK) - self.assertEqual(response._headers['content-type'][1], - 'application/json') +def update_deposit_with_metadata(authenticated_client, collection, deposit, + metadata): + # update deposit's metadata + response = authenticated_client.post( + reverse(EDIT_SE_IRI, args=[collection.name, deposit.id]), + content_type='application/atom+xml;type=entry', + data=metadata, + HTTP_SLUG=deposit.external_id, + HTTP_IN_PROGRESS=True) + assert response.status_code == status.HTTP_201_CREATED + return deposit + + +def test_read_metadata( + authenticated_client, deposit_collection, partial_deposit, + atom_dataset): + """Private metadata read api to existing deposit should return metadata + + """ + deposit = partial_deposit + deposit.external_id = 'some-external-id' + deposit.save() + deposit = update_deposit(authenticated_client, deposit_collection, deposit, + atom_dataset) + + for url in private_get_raw_url_endpoints(deposit_collection, deposit): + response = authenticated_client.get(url) + assert response.status_code == status.HTTP_200_OK + assert response._headers['content-type'][1] == 'application/json' data = response.json() expected_meta = { + 'branch_name': 'master', 'origin': { - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id', - 'type': 'deposit' + 'type': 'deposit', + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' }, 'origin_metadata': { 'metadata': { '@xmlns': ['http://www.w3.org/2005/Atom'], - 'author': ['some awesome author', 'another one', 'no one'], + 'author': [ + 'some awesome author', + 'another one', + 'no one' + ], 'codemeta:dateCreated': '2017-10-07T15:17:08Z', 'external_identifier': 'some-external-id', - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' # noqa }, 'provider': { - 'provider_name': 'hal', + 'metadata': {}, + 'provider_name': '', 'provider_type': 'deposit_client', - 'provider_url': 'https://hal-test.archives-ouvertes.fr/', - 'metadata': {} + 'provider_url': 'https://hal-test.archives-ouvertes.fr/' }, 'tool': { + 'configuration': {'sword_version': '2'}, 'name': 'swh-deposit', - 'version': '0.0.1', - 'configuration': { - 'sword_version': '2' - } + 'version': '0.0.1' } }, 'revision': { - 'synthetic': True, + 'author': SWH_PERSON, + 'committer': SWH_PERSON, 'committer_date': { - 'timestamp': { - 'seconds': 1507389428, - 'microseconds': 0 - }, + 'negative_utc': False, 'offset': 0, - 'negative_utc': False + 'timestamp': { + 'microseconds': 0, + 'seconds': 1507389428 + } }, - 'message': 'hal: Deposit %s in collection hal' % deposit_id, - 'author': SWH_PERSON, - 'committer': SWH_PERSON, 'date': { - 'timestamp': { - 'seconds': 1507389428, - 'microseconds': 0 - }, + 'negative_utc': False, 'offset': 0, - 'negative_utc': False + 'timestamp': {'microseconds': 0, 'seconds': 1507389428} }, + 'message': 'test: Deposit %s in collection test' % deposit.id, 'metadata': { '@xmlns': ['http://www.w3.org/2005/Atom'], - 'author': ['some awesome author', 'another one', 'no one'], - 'external_identifier': 'some-external-id', + 'author': ['some awesome author', + 'another one', + 'no one'], 'codemeta:dateCreated': '2017-10-07T15:17:08Z', - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + 'external_identifier': 'some-external-id', + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' # noqa }, + 'synthetic': True, 'type': 'tar' - }, - 'branch_name': 'master', + } } - self.assertEqual(data, expected_meta) - - def test_read_metadata_revision_with_parent(self): - """Private read metadata to a deposit (with parent) returns metadata + assert data == expected_meta - """ - swh_id = 'da78a9d4cf1d5d29873693fd496142e3a18c20fa' - swh_persistent_id = 'swh:1:rev:%s' % swh_id - deposit_id1 = self.create_deposit_with_status( - status=DEPOSIT_STATUS_LOAD_SUCCESS, - external_id='some-external-id', - swh_id=swh_persistent_id) - deposit_parent = Deposit.objects.get(pk=deposit_id1) - self.assertEqual(deposit_parent.swh_id, swh_persistent_id) - self.assertEqual(deposit_parent.external_id, 'some-external-id') - self.assertEqual(deposit_parent.status, DEPOSIT_STATUS_LOAD_SUCCESS) +def test_read_metadata_revision_with_parent( + authenticated_client, deposit_collection, partial_deposit, + atom_dataset): + """Private read metadata to a deposit (with parent) returns metadata - deposit_id = self.create_deposit_partial( - external_id='some-external-id') - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.external_id, 'some-external-id') - self.assertEqual(deposit.swh_id, None) - self.assertEqual(deposit.parent, deposit_parent) - self.assertEqual(deposit.status, DEPOSIT_STATUS_PARTIAL) - - url = self.private_deposit_url(deposit_id) - - response = self.client.get(url) - - self.assertEqual(response.status_code, - status.HTTP_200_OK) - self.assertEqual(response._headers['content-type'][1], - 'application/json') + """ + deposit = partial_deposit + deposit.external_id = 'some-external-id' + deposit.save() + deposit = update_deposit(authenticated_client, deposit_collection, deposit, + atom_dataset) + rev_id = 'da78a9d4cf1d5d29873693fd496142e3a18c20fa' + swh_id = 'swh:1:rev:%s' % rev_id + fake_parent = Deposit(swh_id=swh_id, + client=deposit.client, collection=deposit.collection) + fake_parent.save() + deposit.parent = fake_parent + deposit.save() + + for url in private_get_raw_url_endpoints(deposit_collection, deposit): + response = authenticated_client.get(url) + + assert response.status_code == status.HTTP_200_OK + assert response._headers['content-type'][1] == 'application/json' data = response.json() expected_meta = { + 'branch_name': 'master', 'origin': { - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id', - 'type': 'deposit' + 'type': 'deposit', + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' }, 'origin_metadata': { 'metadata': { '@xmlns': ['http://www.w3.org/2005/Atom'], - 'author': ['some awesome author', 'another one', 'no one'], + 'author': [ + 'some awesome author', + 'another one', + 'no one' + ], 'codemeta:dateCreated': '2017-10-07T15:17:08Z', 'external_identifier': 'some-external-id', - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' # noqa }, 'provider': { - 'provider_name': 'hal', + 'metadata': {}, + 'provider_name': '', 'provider_type': 'deposit_client', - 'provider_url': 'https://hal-test.archives-ouvertes.fr/', - 'metadata': {} + 'provider_url': 'https://hal-test.archives-ouvertes.fr/' }, 'tool': { + 'configuration': {'sword_version': '2'}, 'name': 'swh-deposit', - 'version': '0.0.1', - 'configuration': { - 'sword_version': '2' - } + 'version': '0.0.1' } }, 'revision': { - 'synthetic': True, - 'date': { - 'timestamp': { - 'seconds': 1507389428, - 'microseconds': 0 - }, - 'offset': 0, - 'negative_utc': False - }, + 'author': SWH_PERSON, + 'committer': SWH_PERSON, 'committer_date': { + 'negative_utc': False, + 'offset': 0, 'timestamp': { - 'seconds': 1507389428, - 'microseconds': 0 - }, + 'microseconds': 0, + 'seconds': 1507389428 + } + }, + 'date': { + 'negative_utc': False, 'offset': 0, - 'negative_utc': False + 'timestamp': {'microseconds': 0, 'seconds': 1507389428} }, - 'author': SWH_PERSON, - 'committer': SWH_PERSON, - 'type': 'tar', - 'message': 'hal: Deposit %s in collection hal' % deposit_id, + 'message': 'test: Deposit %s in collection test' % deposit.id, 'metadata': { '@xmlns': ['http://www.w3.org/2005/Atom'], - 'author': ['some awesome author', 'another one', 'no one'], + 'author': ['some awesome author', + 'another one', + 'no one'], 'codemeta:dateCreated': '2017-10-07T15:17:08Z', 'external_identifier': 'some-external-id', - 'url': 'https://hal-test.archives-ouvertes.fr/' + - 'some-external-id' + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' # noqa }, - 'parents': [swh_id] - }, - 'branch_name': 'master', + 'synthetic': True, + 'type': 'tar', + 'parents': [rev_id], + } } - self.assertEqual(data, expected_meta) + assert data == expected_meta + - def test_read_metadata_3(self): - """date(Created|Published) provided, uses author/committer date +def test_read_metadata_3( + authenticated_client, deposit_collection, partial_deposit, + atom_dataset): + """date(Created|Published) provided, uses author/committer date - """ - # add metadata to the deposit with datePublished and dateCreated - codemeta_entry_data = self.template_metadata % """ + """ + deposit = partial_deposit + deposit.external_id = 'hal-01243065' + deposit.save() + deposit = update_deposit( + authenticated_client, deposit_collection, deposit, + atom_dataset) + # add metadata to the deposit with datePublished and dateCreated + codemeta_entry_data = atom_dataset['metadata'] % b""" 2015-04-06T17:08:47+02:00 2017-05-03T16:08:47+02:00 """ + update_deposit_with_metadata( + authenticated_client, deposit_collection, deposit, + codemeta_entry_data + ) - deposit_id = self.create_deposit_partial_with_data_in_args( - codemeta_entry_data) - url = self.private_deposit_url(deposit_id) - response = self.client.get(url) + for url in private_get_raw_url_endpoints(deposit_collection, deposit): + response = authenticated_client.get(url) - self.assertEqual(response.status_code, - status.HTTP_200_OK) - self.assertEqual(response._headers['content-type'][1], - 'application/json') + assert response.status_code == status.HTTP_200_OK + assert response._headers['content-type'][1] == 'application/json' data = response.json() - expected_origin = { - 'type': 'deposit', - 'url': 'https://hal-test.archives-ouvertes.fr/hal-01243065' - } - expected_metadata = { - '@xmlns': 'http://www.w3.org/2005/Atom', - '@xmlns:codemeta': - 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', - 'author': { - 'email': 'hal@ccsd.cnrs.fr', - 'name': 'HAL' - }, + metadata = { + '@xmlns': ['http://www.w3.org/2005/Atom'], + '@xmlns:codemeta': 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', + 'author': [ + 'some awesome author', + 'another one', + 'no one', + { + 'email': 'hal@ccsd.cnrs.fr', + 'name': 'HAL' + } + ], 'client': 'hal', 'codemeta:applicationCategory': 'test', 'codemeta:author': { 'codemeta:name': 'Morane Gruenpeter' }, - 'codemeta:dateCreated': '2015-04-06T17:08:47+02:00', + 'codemeta:dateCreated': ['2017-10-07T15:17:08Z', + '2015-04-06T17:08:47+02:00'], 'codemeta:datePublished': '2017-05-03T16:08:47+02:00', 'codemeta:description': 'this is the description', 'codemeta:developmentStatus': 'stable', 'codemeta:keywords': 'DSP programming', 'codemeta:license': [ - { - 'codemeta:name': 'GNU General Public License v3.0 only' - }, - { - 'codemeta:name': - 'CeCILL Free Software License Agreement v1.1' - } - ], + {'codemeta:name': 'GNU General Public License v3.0 only'}, + {'codemeta:name': 'CeCILL ' + 'Free ' + 'Software ' + 'License ' + 'Agreement ' + 'v1.1'}], 'codemeta:programmingLanguage': [ - 'php', 'python', 'C' + 'php', + 'python', + 'C' ], 'codemeta:runtimePlatform': 'phpstorm', 'codemeta:url': 'https://hal-test.archives-ouvertes.fr/hal-01243065', # noqa 'codemeta:version': '1', - 'external_identifier': 'hal-01243065', + 'external_identifier': [ + 'some-external-id', + 'hal-01243065' + ], 'id': 'hal-01243065', - 'title': 'Composing a Web of Audio Applications' + 'title': 'Composing a Web of Audio ' + 'Applications', + 'url': 'https://hal-test.archives-ouvertes.fr/some-external-id' } - - expected_origin_metadata = { - 'metadata': expected_metadata, - 'provider': { - 'metadata': {}, - 'provider_name': 'hal', - 'provider_type': 'deposit_client', - 'provider_url': 'https://hal-test.archives-ouvertes.fr/' + expected_meta = { + 'branch_name': 'master', + 'origin': { + 'type': 'deposit', + 'url': 'https://hal-test.archives-ouvertes.fr/hal-01243065' }, - 'tool': { - 'configuration': { - 'sword_version': '2' + 'origin_metadata': { + 'metadata': metadata, + 'provider': { + 'metadata': {}, + 'provider_name': '', + 'provider_type': 'deposit_client', + 'provider_url': 'https://hal-test.archives-ouvertes.fr/' }, - 'name': 'swh-deposit', - 'version': '0.0.1' - } - } - - expected_revision = { - 'author': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer_date': { - 'negative_utc': False, - 'offset': 120, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1493820527 - } - }, - 'date': { - 'negative_utc': False, - 'offset': 120, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1428332927 + 'tool': { + 'configuration': {'sword_version': '2'}, + 'name': 'swh-deposit', + 'version': '0.0.1' } }, - 'message': 'hal: Deposit %s in collection hal' % deposit_id, - 'metadata': expected_metadata, - 'synthetic': True, - 'type': 'tar' - } - - expected_meta = { - 'branch_name': 'master', - 'origin': expected_origin, - 'origin_metadata': expected_origin_metadata, - 'revision': expected_revision, + 'revision': { + 'author': SWH_PERSON, + 'committer': SWH_PERSON, + 'committer_date': {'negative_utc': False, + 'offset': 120, + 'timestamp': {'microseconds': 0, + 'seconds': 1493820527}}, + 'date': { + 'negative_utc': False, + 'offset': 0, + 'timestamp': {'microseconds': 0, 'seconds': 1507389428} + }, + 'message': '%s: Deposit %s in collection %s' % ( + deposit_collection.name, + deposit.id, + deposit_collection.name + ), + 'metadata': metadata, + 'synthetic': True, + 'type': 'tar' + } } + assert data == expected_meta - self.assertEqual(data, expected_meta) - - def test_read_metadata_4(self): - """dateCreated/datePublished not provided, revision uses complete_date - """ - codemeta_entry_data = self.template_metadata % '' +def test_read_metadata_4( + authenticated_client, deposit_collection, atom_dataset, + partial_deposit): + """dateCreated/datePublished not provided, revision uses complete_date - deposit_id = self.create_deposit_partial_with_data_in_args( - codemeta_entry_data) + """ + deposit = partial_deposit + codemeta_entry_data = atom_dataset['metadata'] % b'' + deposit = update_deposit_with_metadata( + authenticated_client, deposit_collection, deposit, + codemeta_entry_data) - # will use the deposit completed date as fallback date - deposit = Deposit.objects.get(pk=deposit_id) - deposit.complete_date = '2016-04-06' - deposit.save() + # will use the deposit completed date as fallback date + deposit.complete_date = '2016-04-06' + deposit.save() - url = self.private_deposit_url(deposit_id) - response = self.client.get(url) + for url in private_get_raw_url_endpoints(deposit_collection, deposit): + response = authenticated_client.get(url) - self.assertEqual(response.status_code, - status.HTTP_200_OK) - self.assertEqual(response._headers['content-type'][1], - 'application/json') + assert response.status_code == status.HTTP_200_OK + assert response._headers['content-type'][1] == 'application/json' data = response.json() - expected_origin = { - 'type': 'deposit', - 'url': 'https://hal-test.archives-ouvertes.fr/hal-01243065' - } - expected_metadata = { + metadata = { '@xmlns': 'http://www.w3.org/2005/Atom', - '@xmlns:codemeta': - 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', - 'author': { - 'email': 'hal@ccsd.cnrs.fr', - 'name': 'HAL' - }, + '@xmlns:codemeta': 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', + 'author': {'email': 'hal@ccsd.cnrs.fr', + 'name': 'HAL'}, 'client': 'hal', 'codemeta:applicationCategory': 'test', - 'codemeta:author': { - 'codemeta:name': 'Morane Gruenpeter' - }, - 'codemeta:description': 'this is the description', + 'codemeta:author': {'codemeta:name': 'Morane ' + 'Gruenpeter'}, + 'codemeta:description': 'this is the ' + 'description', 'codemeta:developmentStatus': 'stable', 'codemeta:keywords': 'DSP programming', - 'codemeta:license': [ - { - 'codemeta:name': 'GNU General Public License v3.0 only' - }, - { - 'codemeta:name': - 'CeCILL Free Software License Agreement v1.1' - } - ], - 'codemeta:programmingLanguage': [ - 'php', 'python', 'C' - ], + 'codemeta:license': [{'codemeta:name': 'GNU ' + 'General ' + 'Public ' + 'License ' + 'v3.0 ' + 'only'}, + {'codemeta:name': 'CeCILL ' + 'Free ' + 'Software ' + 'License ' + 'Agreement ' + 'v1.1'}], + 'codemeta:programmingLanguage': ['php', + 'python', + 'C'], 'codemeta:runtimePlatform': 'phpstorm', - 'codemeta:url': 'https://hal-test.archives-ouvertes.fr/hal-01243065', # noqa + 'codemeta:url': + 'https://hal-test.archives-ouvertes.fr/hal-01243065', 'codemeta:version': '1', 'external_identifier': 'hal-01243065', 'id': 'hal-01243065', - 'title': 'Composing a Web of Audio Applications' + 'title': 'Composing a Web of Audio ' + 'Applications' + } + + expected_origin = { + 'type': 'deposit', + 'url': 'https://hal-test.archives-ouvertes.fr/%s' % ( + deposit.external_id) } expected_origin_metadata = { - 'metadata': expected_metadata, + 'metadata': metadata, 'provider': { 'metadata': {}, - 'provider_name': 'hal', + 'provider_name': '', 'provider_type': 'deposit_client', 'provider_url': 'https://hal-test.archives-ouvertes.fr/' }, 'tool': { - 'configuration': { - 'sword_version': '2' - }, + 'configuration': {'sword_version': '2'}, 'name': 'swh-deposit', 'version': '0.0.1' } } expected_revision = { - 'author': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer_date': { - 'negative_utc': False, - 'offset': 0, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1459900800 - } - }, + 'author': {'email': 'robot@softwareheritage.org', + 'fullname': 'Software Heritage', + 'name': 'Software Heritage'}, + 'committer': {'email': 'robot@softwareheritage.org', + 'fullname': 'Software Heritage', + 'name': 'Software Heritage'}, + 'committer_date': {'negative_utc': False, + 'offset': 0, + 'timestamp': {'microseconds': 0, + 'seconds': 1459900800}}, 'date': { 'negative_utc': False, 'offset': 0, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1459900800 - } - }, - 'message': 'hal: Deposit %s in collection hal' % deposit_id, - 'metadata': expected_metadata, + 'timestamp': {'microseconds': 0, 'seconds': 1459900800}}, + 'message': '%s: Deposit %s in collection %s' % ( + deposit_collection.name, deposit.id, deposit_collection.name + ), + 'metadata': metadata, 'synthetic': True, 'type': 'tar' } expected_meta = { 'branch_name': 'master', 'origin': expected_origin, 'origin_metadata': expected_origin_metadata, 'revision': expected_revision, } - self.assertEqual(data, expected_meta) + assert data == expected_meta - def test_read_metadata_5(self): - """dateCreated/datePublished provided, revision uses author/committer - date - If multiple dateCreated provided, the first occurrence (of - dateCreated) is selected. If multiple datePublished provided, - the first occurrence (of datePublished) is selected. +def test_read_metadata_5( + authenticated_client, deposit_collection, partial_deposit, + atom_dataset): + """dateCreated/datePublished provided, revision uses author/committer + date - """ - # add metadata to the deposit with multiple datePublished/dateCreated - codemeta_entry_data = self.template_metadata % """ + If multiple dateCreated provided, the first occurrence (of + dateCreated) is selected. If multiple datePublished provided, + the first occurrence (of datePublished) is selected. + + """ + deposit = partial_deposit + # add metadata to the deposit with multiple datePublished/dateCreated + codemeta_entry_data = atom_dataset['metadata'] % b""" 2015-04-06T17:08:47+02:00 2017-05-03T16:08:47+02:00 2016-04-06T17:08:47+02:00 2018-05-03T16:08:47+02:00 """ + deposit = update_deposit_with_metadata( + authenticated_client, deposit_collection, deposit, + codemeta_entry_data) - deposit_id = self.create_deposit_partial_with_data_in_args( - codemeta_entry_data) - url = self.private_deposit_url(deposit_id) - response = self.client.get(url) + for url in private_get_raw_url_endpoints(deposit_collection, deposit): + response = authenticated_client.get(url) - self.assertEqual(response.status_code, - status.HTTP_200_OK) - self.assertEqual(response._headers['content-type'][1], - 'application/json') + assert response.status_code == status.HTTP_200_OK + assert response._headers['content-type'][1] == 'application/json' data = response.json() expected_origin = { 'type': 'deposit', - 'url': 'https://hal-test.archives-ouvertes.fr/hal-01243065' + 'url': 'https://hal-test.archives-ouvertes.fr/external-id-partial' } - expected_metadata = { + + metadata = { '@xmlns': 'http://www.w3.org/2005/Atom', - '@xmlns:codemeta': - 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', - 'author': { - 'email': 'hal@ccsd.cnrs.fr', - 'name': 'HAL' - }, + '@xmlns:codemeta': 'https://doi.org/10.5063/SCHEMA/CODEMETA-2.0', + 'author': {'email': 'hal@ccsd.cnrs.fr', + 'name': 'HAL'}, 'client': 'hal', 'codemeta:applicationCategory': 'test', - 'codemeta:author': { - 'codemeta:name': 'Morane Gruenpeter' - }, - 'codemeta:dateCreated': [ - '2015-04-06T17:08:47+02:00', - '2016-04-06T17:08:47+02:00', - ], - 'codemeta:datePublished': [ - '2017-05-03T16:08:47+02:00', - '2018-05-03T16:08:47+02:00', - ], + 'codemeta:author': {'codemeta:name': 'Morane ' + 'Gruenpeter'}, + 'codemeta:dateCreated': ['2015-04-06T17:08:47+02:00', + '2016-04-06T17:08:47+02:00'], + 'codemeta:datePublished': ['2017-05-03T16:08:47+02:00', + '2018-05-03T16:08:47+02:00'], 'codemeta:description': 'this is the description', 'codemeta:developmentStatus': 'stable', 'codemeta:keywords': 'DSP programming', 'codemeta:license': [ { - 'codemeta:name': 'GNU General Public License v3.0 only' - }, + 'codemeta:name': 'GNU ' + 'General ' + 'Public ' + 'License ' + 'v3.0 ' + 'only'}, { - 'codemeta:name': - 'CeCILL Free Software License Agreement v1.1' + 'codemeta:name': 'CeCILL ' + 'Free ' + 'Software ' + 'License ' + 'Agreement ' + 'v1.1' } ], - 'codemeta:programmingLanguage': [ - 'php', 'python', 'C' - ], + 'codemeta:programmingLanguage': ['php', + 'python', + 'C'], 'codemeta:runtimePlatform': 'phpstorm', 'codemeta:url': 'https://hal-test.archives-ouvertes.fr/hal-01243065', # noqa 'codemeta:version': '1', 'external_identifier': 'hal-01243065', 'id': 'hal-01243065', - 'title': 'Composing a Web of Audio Applications' + 'title': 'Composing a Web of Audio ' + 'Applications' } expected_origin_metadata = { - 'metadata': expected_metadata, + 'metadata': metadata, 'provider': { 'metadata': {}, - 'provider_name': 'hal', + 'provider_name': '', 'provider_type': 'deposit_client', - 'provider_url': 'https://hal-test.archives-ouvertes.fr/' - }, + 'provider_url': 'https://hal-test.archives-ouvertes.fr/'}, 'tool': { - 'configuration': { - 'sword_version': '2' - }, + 'configuration': {'sword_version': '2'}, 'name': 'swh-deposit', 'version': '0.0.1' } } expected_revision = { - 'author': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer': { - 'email': 'robot@softwareheritage.org', - 'fullname': 'Software Heritage', - 'name': 'Software Heritage' - }, - 'committer_date': { - 'negative_utc': False, - 'offset': 120, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1493820527 - } - }, - 'date': { - 'negative_utc': False, - 'offset': 120, - 'timestamp': { - 'microseconds': 0, - 'seconds': 1428332927 - } - }, - 'message': 'hal: Deposit %s in collection hal' % deposit_id, - 'metadata': expected_metadata, + 'author': {'email': 'robot@softwareheritage.org', + 'fullname': 'Software Heritage', + 'name': 'Software Heritage'}, + 'committer': {'email': 'robot@softwareheritage.org', + 'fullname': 'Software Heritage', + 'name': 'Software Heritage'}, + 'committer_date': {'negative_utc': False, + 'offset': 120, + 'timestamp': {'microseconds': 0, + 'seconds': 1493820527}}, + 'date': {'negative_utc': False, + 'offset': 120, + 'timestamp': {'microseconds': 0, 'seconds': 1428332927}}, + 'message': '%s: Deposit %s in collection %s' % ( + deposit_collection.name, deposit.id, deposit_collection.name + ), + 'metadata': metadata, 'synthetic': True, 'type': 'tar' } expected_meta = { 'branch_name': 'master', 'origin': expected_origin, 'origin_metadata': expected_origin_metadata, - 'revision': expected_revision, + 'revision': expected_revision } - self.assertEqual(data, expected_meta) + assert data == expected_meta - def test_access_to_nonexisting_deposit_returns_404_response(self): - """Read unknown collection should return a 404 response - """ - unknown_id = '999' - url = self.private_deposit_url(unknown_id) - response = self.client.get(url) - self.assertEqual(response.status_code, - status.HTTP_404_NOT_FOUND) - self.assertIn('Deposit with id %s does not exist' % unknown_id, - response.content.decode('utf-8')) +def test_access_to_nonexisting_deposit_returns_404_response( + authenticated_client, deposit_collection, ): + """Read unknown collection should return a 404 response - -class DepositReadMetadataTest2(DepositReadMetadataTest): - def private_deposit_url(self, deposit_id): - return reverse(PRIVATE_GET_DEPOSIT_METADATA+'-nc', - args=[deposit_id]) + """ + unknown_id = 999 + try: + Deposit.objects.get(pk=unknown_id) + except Deposit.DoesNotExist: + assert True + + for url in private_get_raw_url_endpoints(deposit_collection, unknown_id): + response = authenticated_client.get(url) + assert response.status_code == status.HTTP_404_NOT_FOUND + msg = 'Deposit with id %s does not exist' % unknown_id + assert msg in response.content.decode('utf-8')