From 981d1fa90000d59f4c8363305f7262fdb785ff82 Mon Sep 17 00:00:00 2001 From: "Antoine R. Dumont (@ardumont)" <antoine.romain.dumont@gmail.com> Date: Sun, 20 Oct 2019 10:23:15 +0200 Subject: [PATCH] test_deposit_atom: Migrate to pytest --- MANIFEST.in | 1 + swh/deposit/tests/api/conftest.py | 32 + .../tests/api/data/atom/codemeta-sample.xml | 53 ++ .../data/atom/entry-data-badly-formatted.xml | 2 + .../api/data/atom/entry-data-empty-body.xml | 2 + .../api/data/atom/entry-data-minimal.xml | 4 + .../atom/entry-data-parsing-error-prone.xml | 5 + .../tests/api/data/atom/entry-data0.xml | 26 + .../tests/api/data/atom/entry-data1.xml | 24 + .../api/data/atom/error-with-decimal.xml | 38 + .../tests/api/data/atom/tei-sample.xml | 1 + swh/deposit/tests/api/test_deposit_atom.py | 754 +++++++----------- 12 files changed, 485 insertions(+), 457 deletions(-) create mode 100644 swh/deposit/tests/api/conftest.py create mode 100644 swh/deposit/tests/api/data/atom/codemeta-sample.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data-badly-formatted.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data-empty-body.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data-minimal.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data-parsing-error-prone.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data0.xml create mode 100644 swh/deposit/tests/api/data/atom/entry-data1.xml create mode 100644 swh/deposit/tests/api/data/atom/error-with-decimal.xml create mode 100644 swh/deposit/tests/api/data/atom/tei-sample.xml diff --git a/MANIFEST.in b/MANIFEST.in index 3f5831b7..6c3de5d3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -8,3 +8,4 @@ include version.txt recursive-include swh/deposit/static * recursive-include swh/deposit/fixtures * recursive-include swh/deposit/templates * +recursive-include swh/deposit/tests/*/data * diff --git a/swh/deposit/tests/api/conftest.py b/swh/deposit/tests/api/conftest.py new file mode 100644 index 00000000..c6c57749 --- /dev/null +++ b/swh/deposit/tests/api/conftest.py @@ -0,0 +1,32 @@ +# Copyright (C) 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 + +import pytest + +from os import path, listdir +from typing import Mapping + + +@pytest.fixture +def atom_dataset(datadir) -> Mapping[str, bytes]: + """Compute the paths to atom files. + + Returns: + Dict of atom name per content (bytes) + + """ + atom_path = path.join(datadir, 'atom') + + data = {} + for filename in listdir(atom_path): + filepath = path.join(atom_path, filename) + with open(filepath, 'rb') as f: + raw_content = f.read() + + # Keep the filename without extension + atom_name = filename.split('.')[0] + data[atom_name] = raw_content + + return data diff --git a/swh/deposit/tests/api/data/atom/codemeta-sample.xml b/swh/deposit/tests/api/data/atom/codemeta-sample.xml new file mode 100644 index 00000000..98c3e06d --- /dev/null +++ b/swh/deposit/tests/api/data/atom/codemeta-sample.xml @@ -0,0 +1,53 @@ +<?xml version="1.0"?> + <entry xmlns="http://www.w3.org/2005/Atom" + xmlns:dcterms="http://purl.org/dc/terms/" + xmlns:codemeta="https://doi.org/10.5063/SCHEMA/CODEMETA-2.0"> + + + <external_identifier>%s</external_identifier> + <dcterms:identifier>hal-01587361</dcterms:identifier> + <dcterms:identifier>https://hal.inria.fr/hal-01587361</dcterms:identifier> + <dcterms:identifier>https://hal.inria.fr/hal-01587361/document</dcterms:identifier> + <dcterms:identifier>https://hal.inria.fr/hal-01587361/file/AffectationRO-v1.0.0.zip</dcterms:identifier> + <dcterms:identifier>doi:10.5281/zenodo.438684</dcterms:identifier> + <dcterms:title xml:lang="en">The assignment problem</dcterms:title> + <dcterms:title xml:lang="fr">AffectationRO</dcterms:title> + <dcterms:creator>Gruenpeter, Morane</dcterms:creator> + <dcterms:subject>[INFO] Computer Science [cs]</dcterms:subject> + <dcterms:subject>[INFO.INFO-RO] Computer Science [cs]/Operations Research [cs.RO]</dcterms:subject> + <dcterms:type>SOFTWARE</dcterms:type> + <dcterms:abstract xml:lang="en">Project in OR: The assignment problemA java implementation for the assignment problem first release</dcterms:abstract> + <dcterms:abstract xml:lang="fr">description fr</dcterms:abstract> + <dcterms:created>2015-06-01</dcterms:created> + <dcterms:available>2017-10-19</dcterms:available> + <dcterms:language>en</dcterms:language> + + + <codemeta:url>url stable</codemeta:url> + <codemeta:version>Version sur hal </codemeta:version> + <codemeta:softwareVersion>Version entre par lutilisateur</codemeta:softwareVersion> + <codemeta:keywords>Mots-cls</codemeta:keywords> + <codemeta:releaseNotes>Commentaire</codemeta:releaseNotes> + <codemeta:referencePublication>Rfrence interne </codemeta:referencePublication> + <codemeta:isPartOf> + <codemeta:type> Collaboration/Projet </codemeta:type> + <codemeta:name> nom du projet</codemeta:name> + <codemeta:identifier> id </codemeta:identifier> + </codemeta:isPartOf> + <codemeta:relatedLink>Voir aussi </codemeta:relatedLink> + <codemeta:funding>Financement </codemeta:funding> + <codemeta:funding>Projet ANR </codemeta:funding> + <codemeta:funding>Projet Europen </codemeta:funding> + <codemeta:operatingSystem>Platform/OS </codemeta:operatingSystem> + <codemeta:softwareRequirements>Dpendances </codemeta:softwareRequirements> + <codemeta:developmentStatus>Etat du dveloppement </codemeta:developmentStatus> + <codemeta:license> + <codemeta:name>license</codemeta:name> + <codemeta:url>url spdx</codemeta:url> + </codemeta:license> + <codemeta:runtimePlatform>Outils de dveloppement- outil no1 </codemeta:runtimePlatform> + <codemeta:runtimePlatform>Outils de dveloppement- outil no2 </codemeta:runtimePlatform> + <codemeta:codeRepository>http://code.com</codemeta:codeRepository> + <codemeta:programmingLanguage>language 1</codemeta:programmingLanguage> + <codemeta:programmingLanguage>language 2</codemeta:programmingLanguage> + </entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data-badly-formatted.xml b/swh/deposit/tests/api/data/atom/entry-data-badly-formatted.xml new file mode 100644 index 00000000..25a417fb --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data-badly-formatted.xml @@ -0,0 +1,2 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"</entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data-empty-body.xml b/swh/deposit/tests/api/data/atom/entry-data-empty-body.xml new file mode 100644 index 00000000..e4caf44f --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data-empty-body.xml @@ -0,0 +1,2 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"></entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data-minimal.xml b/swh/deposit/tests/api/data/atom/entry-data-minimal.xml new file mode 100644 index 00000000..9432ac0e --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data-minimal.xml @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"> + <external_identifier>%s</external_identifier> +</entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data-parsing-error-prone.xml b/swh/deposit/tests/api/data/atom/entry-data-parsing-error-prone.xml new file mode 100644 index 00000000..34710195 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data-parsing-error-prone.xml @@ -0,0 +1,5 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"</entry> + <title>Composing a Web of Audio Applications</title> + <clienhal</client> +</entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data0.xml b/swh/deposit/tests/api/data/atom/entry-data0.xml new file mode 100644 index 00000000..2b0ccc00 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data0.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"> + <title>Awesome Compiler</title> + <client>hal</client> + <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> + <external_identifier>%s</external_identifier> + <updated>2017-10-07T15:17:08Z</updated> + <author>some awesome author</author> + <applicationCategory>something</applicationCategory> + <name>awesome-compiler</name> + <description>This is an awesome compiler destined to +awesomely compile stuff +and other stuff</description> + <keywords>compiler,programming,language</keywords> + <dateCreated>2005-10-07T17:17:08Z</dateCreated> + <datePublished>2005-10-07T17:17:08Z</datePublished> + <releaseNotes>release note</releaseNotes> + <relatedLink>related link</relatedLink> + <sponsor></sponsor> + <programmingLanguage>Awesome</programmingLanguage> + <codeRepository>https://hoster.org/awesome-compiler</codeRepository> + <operatingSystem>GNU/Linux</operatingSystem> + <version>0.0.1</version> + <developmentStatus>running</developmentStatus> + <runtimePlatform>all</runtimePlatform> +</entry> diff --git a/swh/deposit/tests/api/data/atom/entry-data1.xml b/swh/deposit/tests/api/data/atom/entry-data1.xml new file mode 100644 index 00000000..e4f415c7 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/entry-data1.xml @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<entry xmlns="http://www.w3.org/2005/Atom"> + <client>hal</client> + <id>urn:uuid:2225c695-cfb8-4ebb-aaaa-80da344efa6a</id> + <updated>2017-10-07T15:17:08Z</updated> + <author>some awesome author</author> + <applicationCategory>something</applicationCategory> + <name>awesome-compiler</name> + <description>This is an awesome compiler destined to +awesomely compile stuff +and other stuff</description> + <keywords>compiler,programming,language</keywords> + <dateCreated>2005-10-07T17:17:08Z</dateCreated> + <datePublished>2005-10-07T17:17:08Z</datePublished> + <releaseNotes>release note</releaseNotes> + <relatedLink>related link</relatedLink> + <sponsor></sponsor> + <programmingLanguage>Awesome</programmingLanguage> + <codeRepository>https://hoster.org/awesome-compiler</codeRepository> + <operatingSystem>GNU/Linux</operatingSystem> + <version>0.0.1</version> + <developmentStatus>running</developmentStatus> + <runtimePlatform>all</runtimePlatform> +</entry> diff --git a/swh/deposit/tests/api/data/atom/error-with-decimal.xml b/swh/deposit/tests/api/data/atom/error-with-decimal.xml new file mode 100644 index 00000000..be002442 --- /dev/null +++ b/swh/deposit/tests/api/data/atom/error-with-decimal.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<entry xmlns="http://www.w3.org/2005/Atom" xmlns:codemeta="https://doi.org/10.5063/SCHEMA/CODEMETA-2.0"> + <title>Composing a Web of Audio Applications</title> + <client>hal</client> + <id>hal-01243065</id> + <external_identifier>hal-01243065</external_identifier> + <codemeta:url>https://hal-test.archives-ouvertes.fr/hal-01243065</codemeta:url> + <codemeta:applicationCategory>test</codemeta:applicationCategory> + <codemeta:name/> + <description/> + <codemeta:keywords>DSP programming,Web,Composability,Faust</codemeta:keywords> + <codemeta:dateCreated>2017-05-03T16:08:47+02:00</codemeta:dateCreated> + <codemeta:description>The Web offers a great opportunity to share, deploy and use programs without installation difficulties. In this article we explore the idea of freely combining/composing real-time audio applications deployed on the Web using Faust audio DSP language.</codemeta:description> + <codemeta:version>1</codemeta:version> + <codemeta:softwareVersion>10.4</codemeta:softwareVersion> + <codemeta:runtimePlatform>phpstorm</codemeta:runtimePlatform> + <codemeta:developmentStatus>stable</codemeta:developmentStatus> + <codeRepository/> + <platform>linux</platform> + <codemeta:programmingLanguage>php</codemeta:programmingLanguage> + <codemeta:programmingLanguage>python</codemeta:programmingLanguage> + <codemeta:programmingLanguage>C</codemeta:programmingLanguage> + <codemeta:license> + <codemeta:name>GNU General Public License v3.0 only</codemeta:name> + </codemeta:license> + <codemeta:license> + <codemeta:name>CeCILL Free Software License Agreement v1.1</codemeta:name> + </codemeta:license> + <author> + <name>HAL</name> + <email>hal@ccsd.cnrs.fr</email> + </author> + <contributor> + <name>Someone Nice</name> + <email>someone@nice.fr</email> + <codemeta:affiliation>FFJ</codemeta:affiliation> + </contributor> +</entry> diff --git a/swh/deposit/tests/api/data/atom/tei-sample.xml b/swh/deposit/tests/api/data/atom/tei-sample.xml new file mode 100644 index 00000000..cf2266af --- /dev/null +++ b/swh/deposit/tests/api/data/atom/tei-sample.xml @@ -0,0 +1 @@ +<TEI><teiHeader><fileDesc><titleStmt><title>HAL TEI export of hal-01587083</title></titleStmt><publicationStmt><distributor>CCSD</distributor><availability status="restricted"><licence target="http://creativecommons.org/licenses/by/4.0/">Distributed under a Creative Commons Attribution 4.0 International License</licence></availability><date when="2017-10-03T17:21:03+02:00"/></publicationStmt><sourceDesc><p part="N">HAL API platform</p></sourceDesc></fileDesc></teiHeader><text><body><listBibl><biblFull><titleStmt><title xml:lang="en">questionnaire software metadata</title><author role="aut"><persName><forename type="first">Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">7de56c632362954fa84172cad80afe4e</email><email type="domain">inria.fr</email><ptr type="url" target="moranegg.github.io"/><idno type="halauthorid">1556733</idno><affiliation ref="#struct-474639"/></author><editor role="depositor"><persName><forename>Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">f85a43a5fb4a2e0778a77e017f28c8fd</email><email type="domain">gmail.com</email></editor></titleStmt><editionStmt><edition n="v1" type="current"><date type="whenSubmitted">2017-09-29 11:21:32</date><date type="whenModified">2017-10-03 17:20:13</date><date type="whenReleased">2017-10-03 17:20:13</date><date type="whenProduced">2017-09-29</date><date type="whenEndEmbargoed">2017-09-29</date><ref type="file" target="https://hal.inria.fr/hal-01587083/document"><date notBefore="2017-09-29"/></ref><ref type="file" subtype="author" n="1" target="https://hal.inria.fr/hal-01587083/file/questionnaire.zip"><date notBefore="2017-09-29"/></ref></edition><respStmt><resp>contributor</resp><name key="442239"><persName><forename>Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">f85a43a5fb4a2e0778a77e017f28c8fd</email><email type="domain">gmail.com</email></name></respStmt></editionStmt><publicationStmt><distributor>CCSD</distributor><idno type="halId">hal-01587083</idno><idno type="halUri">https://hal.inria.fr/hal-01587083</idno><idno type="halBibtex">gruenpeter:hal-01587083</idno><idno type="halRefHtml">2017</idno><idno type="halRef">2017</idno></publicationStmt><seriesStmt/><notesStmt/><sourceDesc><biblStruct><analytic><title xml:lang="en">questionnaire software metadata</title><author role="aut"><persName><forename type="first">Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">7de56c632362954fa84172cad80afe4e</email><email type="domain">inria.fr</email><ptr type="url" target="moranegg.github.io"/><idno type="halauthorid">1556733</idno><affiliation ref="#struct-474639"/></author></analytic><monogr><imprint/></monogr></biblStruct></sourceDesc><profileDesc><langUsage><language ident="en">English</language></langUsage><textClass><classCode scheme="halDomain" n="info">Computer Science [cs]</classCode><classCode scheme="halTypology" n="SOFTWARE">Software</classCode></textClass></profileDesc></biblFull></listBibl></body><back><listOrg type="structures"><org type="laboratory" xml:id="struct-474639" status="VALID"><orgName>IRILL</orgName><orgName type="acronym">Initiative pour la Recherche et l'Innovation sur le Logiciel Libre</orgName><desc><address><country key="FR"/></address><ref type="url">https://www.irill.org/</ref></desc><listRelation><relation active="#struct-93591" type="direct"/><relation active="#struct-300009" type="direct"/><relation active="#struct-300301" type="direct"/></listRelation></org><org type="institution" xml:id="struct-93591" status="VALID"><orgName>Universite Pierre et Marie Curie - Paris 6</orgName><orgName type="acronym">UPMC</orgName><desc><address><addrLine>4 place Jussieu - 75005 Paris</addrLine><country key="FR"/></address><ref type="url">http://www.upmc.fr/</ref></desc></org><org type="institution" xml:id="struct-300009" status="VALID"><orgName>Institut National de Recherche en Informatique et en Automatique</orgName><orgName type="acronym">Inria</orgName><desc><address><addrLine>Domaine de VoluceauRocquencourt - BP 10578153 Le Chesnay Cedex</addrLine><country key="FR"/></address><ref type="url">http://www.inria.fr/en/</ref></desc></org><org type="institution" xml:id="struct-300301" status="VALID"><orgName>Universite Paris Diderot - Paris 7</orgName><orgName type="acronym">UPD7</orgName><desc><address><addrLine>5 rue Thomas-Mann - 75205 Paris cedex 13</addrLine><country key="FR"/></address><ref type="url">http://www.univ-paris-diderot.fr</ref></desc></org></listOrg></back></text></TEI> diff --git a/swh/deposit/tests/api/test_deposit_atom.py b/swh/deposit/tests/api/test_deposit_atom.py index b04da6d6..a8fcc532 100644 --- a/swh/deposit/tests/api/test_deposit_atom.py +++ b/swh/deposit/tests/api/test_deposit_atom.py @@ -3,471 +3,311 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +import pytest + from django.urls import reverse from io import BytesIO from rest_framework import status -from rest_framework.test import APITestCase from swh.deposit.config import COL_IRI, DEPOSIT_STATUS_DEPOSITED -from swh.deposit.models import Deposit, DepositRequest +from swh.deposit.models import Deposit, DepositRequest, DepositCollection from swh.deposit.parsers import parse_xml -from ..common import BasicTestCase, WithAuthTestCase + +def test_post_deposit_atom_201_even_with_decimal( + authenticated_client, deposit_collection, atom_dataset): + """Posting an initial atom entry should return 201 with deposit receipt + + """ + atom_error_with_decimal = atom_dataset['error-with-decimal'] + + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_error_with_decimal, + HTTP_SLUG='external-id', + HTTP_IN_PROGRESS='false') + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + deposit_id = response_content['deposit_id'] + + deposit = Deposit.objects.get(pk=deposit_id) + dr = DepositRequest.objects.get(deposit=deposit) + + assert dr.metadata is not None + sw_version = dr.metadata.get('codemeta:softwareVersion') + assert sw_version == '10.4' + + +def test_post_deposit_atom_400_with_empty_body( + authenticated_client, deposit_collection, atom_dataset): + """Posting empty body request should return a 400 response + + """ + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data-empty-body']) + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_post_deposit_atom_400_badly_formatted_atom( + authenticated_client, deposit_collection, atom_dataset): + """Posting a badly formatted atom should return a 400 response + + """ + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data-badly-formatted']) + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_post_deposit_atom_parsing_error( + authenticated_client, deposit_collection, atom_dataset): + """Posting parsing error prone atom should return 400 + + """ + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data-parsing-error-prone']) + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_post_deposit_atom_no_slug_header( + authenticated_client, deposit_collection, atom_dataset): + """Posting an atom entry without a slug header should return a 400 + + """ + url = reverse(COL_IRI, args=[deposit_collection.name]) + + # when + response = authenticated_client.post( + url, + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data0'], + # + headers + HTTP_IN_PROGRESS='false') + + assert b'Missing SLUG header' in response.content + assert response.status_code == status.HTTP_400_BAD_REQUEST + + +def test_post_deposit_atom_unknown_collection( + authenticated_client, atom_dataset): + """Posting an atom entry to an unknown collection should return a 404 + + """ + unknown_collection = 'unknown-one' + with pytest.raises(DepositCollection.DoesNotExist): + DepositCollection.objects.get(name=unknown_collection) + + response = authenticated_client.post( + reverse(COL_IRI, args=[unknown_collection]), # <- unknown collection + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data0'], + HTTP_SLUG='something') + assert response.status_code == status.HTTP_404_NOT_FOUND + + +def test_post_deposit_atom_entry_initial( + authenticated_client, deposit_collection, atom_dataset): + """Posting an initial atom entry should return 201 with deposit receipt + + """ + # given + external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' + + with pytest.raises(Deposit.DoesNotExist): + Deposit.objects.get(external_id=external_id) + + atom_entry_data = atom_dataset['entry-data0'] % external_id.encode('utf-8') + + # when + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_entry_data, + HTTP_SLUG=external_id, + HTTP_IN_PROGRESS='false') + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + deposit_id = response_content['deposit_id'] + + deposit = Deposit.objects.get(pk=deposit_id) + assert deposit.collection == deposit_collection + assert deposit.external_id == external_id + assert deposit.status == DEPOSIT_STATUS_DEPOSITED + + # one associated request to a deposit + deposit_request = DepositRequest.objects.get(deposit=deposit) + assert deposit_request.metadata is not None + assert deposit_request.raw_metadata == atom_entry_data.decode('utf-8') + assert bool(deposit_request.archive) is False + + +def test_post_deposit_atom_entry_with_codemeta( + authenticated_client, deposit_collection, atom_dataset): + """Posting an initial atom entry should return 201 with deposit receipt + + """ + # given + external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' + + with pytest.raises(Deposit.DoesNotExist): + Deposit.objects.get(external_id=external_id) + + atom_entry_data = atom_dataset['codemeta-sample'] % external_id.encode('utf-8') # noqa + + # when + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_entry_data, + HTTP_SLUG=external_id, + HTTP_IN_PROGRESS='false') + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + + deposit_id = response_content['deposit_id'] + + deposit = Deposit.objects.get(pk=deposit_id) + assert deposit.collection == deposit_collection + assert deposit.external_id == external_id + assert deposit.status == DEPOSIT_STATUS_DEPOSITED + + # one associated request to a deposit + deposit_request = DepositRequest.objects.get(deposit=deposit) + assert deposit_request.metadata is not None + assert deposit_request.raw_metadata == atom_entry_data.decode('utf-8') + assert bool(deposit_request.archive) is False + + +def test_post_deposit_atom_entry_tei( + authenticated_client, deposit_collection, atom_dataset): + """Posting initial atom entry as TEI should return 201 with receipt + + """ + # given + external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' + with pytest.raises(Deposit.DoesNotExist): + Deposit.objects.get(external_id=external_id) + + atom_entry_data = atom_dataset['tei-sample'] + + # when + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_entry_data, + HTTP_SLUG=external_id, + HTTP_IN_PROGRESS='false') + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + deposit_id = response_content['deposit_id'] + + deposit = Deposit.objects.get(pk=deposit_id) + assert deposit.collection == deposit_collection + assert deposit.external_id == external_id + assert deposit.status == DEPOSIT_STATUS_DEPOSITED + + # one associated request to a deposit + deposit_request = DepositRequest.objects.get(deposit=deposit) + assert deposit_request.metadata is not None + assert deposit_request.raw_metadata == atom_entry_data.decode('utf-8') + assert bool(deposit_request.archive) is False -class DepositAtomEntryTestCase(APITestCase, WithAuthTestCase, BasicTestCase): - """Try and post atom entry deposit. +def test_post_deposit_atom_entry_multiple_steps( + authenticated_client, deposit_collection, atom_dataset): + """After initial deposit, updating a deposit should return a 201 """ - def setUp(self): - super().setUp() - - self.atom_entry_data0 = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"> - <title>Awesome Compiler</title> - <client>hal</client> - <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> - <external_identifier>%s</external_identifier> - <updated>2017-10-07T15:17:08Z</updated> - <author>some awesome author</author> - <applicationCategory>something</applicationCategory> - <name>awesome-compiler</name> - <description>This is an awesome compiler destined to -awesomely compile stuff -and other stuff</description> - <keywords>compiler,programming,language</keywords> - <dateCreated>2005-10-07T17:17:08Z</dateCreated> - <datePublished>2005-10-07T17:17:08Z</datePublished> - <releaseNotes>release note</releaseNotes> - <relatedLink>related link</relatedLink> - <sponsor></sponsor> - <programmingLanguage>Awesome</programmingLanguage> - <codeRepository>https://hoster.org/awesome-compiler</codeRepository> - <operatingSystem>GNU/Linux</operatingSystem> - <version>0.0.1</version> - <developmentStatus>running</developmentStatus> - <runtimePlatform>all</runtimePlatform> -</entry>""" - - self.atom_entry_data1 = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"> - <client>hal</client> - <id>urn:uuid:2225c695-cfb8-4ebb-aaaa-80da344efa6a</id> - <updated>2017-10-07T15:17:08Z</updated> - <author>some awesome author</author> - <applicationCategory>something</applicationCategory> - <name>awesome-compiler</name> - <description>This is an awesome compiler destined to -awesomely compile stuff -and other stuff</description> - <keywords>compiler,programming,language</keywords> - <dateCreated>2005-10-07T17:17:08Z</dateCreated> - <datePublished>2005-10-07T17:17:08Z</datePublished> - <releaseNotes>release note</releaseNotes> - <relatedLink>related link</relatedLink> - <sponsor></sponsor> - <programmingLanguage>Awesome</programmingLanguage> - <codeRepository>https://hoster.org/awesome-compiler</codeRepository> - <operatingSystem>GNU/Linux</operatingSystem> - <version>0.0.1</version> - <developmentStatus>running</developmentStatus> - <runtimePlatform>all</runtimePlatform> -</entry>""" - - self.atom_entry_data_badly_formatted = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"</entry>""" - - self.atom_error_with_decimal = b"""<?xml version="1.0" encoding="utf-8"?> -<entry xmlns="http://www.w3.org/2005/Atom" xmlns:codemeta="https://doi.org/10.5063/SCHEMA/CODEMETA-2.0"> - <title>Composing a Web of Audio Applications</title> - <client>hal</client> - <id>hal-01243065</id> - <external_identifier>hal-01243065</external_identifier> - <codemeta:url>https://hal-test.archives-ouvertes.fr/hal-01243065</codemeta:url> - <codemeta:applicationCategory>test</codemeta:applicationCategory> - <codemeta:name/> - <description/> - <codemeta:keywords>DSP programming,Web,Composability,Faust</codemeta:keywords> - <codemeta:dateCreated>2017-05-03T16:08:47+02:00</codemeta:dateCreated> - <codemeta:description>The Web offers a great opportunity to share, deploy and use programs without installation difficulties. In this article we explore the idea of freely combining/composing real-time audio applications deployed on the Web using Faust audio DSP language.</codemeta:description> - <codemeta:version>1</codemeta:version> - <codemeta:softwareVersion>10.4</codemeta:softwareVersion> - <codemeta:runtimePlatform>phpstorm</codemeta:runtimePlatform> - <codemeta:developmentStatus>stable</codemeta:developmentStatus> - <codeRepository/> - <platform>linux</platform> - <codemeta:programmingLanguage>php</codemeta:programmingLanguage> - <codemeta:programmingLanguage>python</codemeta:programmingLanguage> - <codemeta:programmingLanguage>C</codemeta:programmingLanguage> - <codemeta:license> - <codemeta:name>GNU General Public License v3.0 only</codemeta:name> - </codemeta:license> - <codemeta:license> - <codemeta:name>CeCILL Free Software License Agreement v1.1</codemeta:name> - </codemeta:license> - <author> - <name>HAL</name> - <email>hal@ccsd.cnrs.fr</email> - </author> - <contributor> - <name>Someone Nice</name> - <email>someone@nice.fr</email> - <codemeta:affiliation>FFJ</codemeta:affiliation> - </contributor> -</entry> -""" # noqa - - def test_post_deposit_atom_201_even_with_decimal(self): - """Posting an initial atom entry should return 201 with deposit receipt - - """ - # given - # when - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=self.atom_error_with_decimal, - HTTP_SLUG='external-id', - HTTP_IN_PROGRESS='false') - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content['deposit_id'] - - deposit = Deposit.objects.get(pk=deposit_id) - dr = DepositRequest.objects.get(deposit=deposit) - - self.assertIsNotNone(dr.metadata) - sw_version = dr.metadata.get('codemeta:softwareVersion') - self.assertEqual(sw_version, '10.4') - - def test_post_deposit_atom_400_with_empty_body(self): - """Posting empty body request should return a 400 response - - """ - atom_entry_data_empty_body = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"></entry>""" - - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=atom_entry_data_empty_body) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_post_deposit_atom_400_badly_formatted_atom(self): - """Posting a badly formatted atom should return a 400 response - - """ - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=self.atom_entry_data_badly_formatted) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_post_deposit_atom_400_with_parsing_error(self): - """Posting parsing error prone atom should return 400 - - """ - atom_entry_data_parsing_error_prone = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"</entry> - <title>Composing a Web of Audio Applications</title> - <clienhal</client> -</entry> -""" - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=atom_entry_data_parsing_error_prone) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - def test_post_deposit_atom_400_without_slug_header(self): - """Posting an atom entry without a slug header should return a 400 - - """ - url = reverse(COL_IRI, args=[self.collection.name]) - - # when - response = self.client.post( - url, - content_type='application/atom+xml;type=entry', - data=self.atom_entry_data0, - # + headers - HTTP_IN_PROGRESS='false') - - self.assertIn(b'Missing SLUG header', response.content) - self.assertEqual(response.status_code, - status.HTTP_400_BAD_REQUEST) - - def test_post_deposit_atom_404_unknown_collection(self): - """Posting an atom entry to an unknown collection should return a 404 - - """ - atom_entry_data3 = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"> - <something>something</something> -</entry>""" - - response = self.client.post( - reverse(COL_IRI, args=['unknown-one']), - content_type='application/atom+xml;type=entry', - data=atom_entry_data3, - HTTP_SLUG='something') - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - def test_post_deposit_atom_entry_initial(self): - """Posting an initial atom entry should return 201 with deposit receipt - - """ - # given - external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' - - with self.assertRaises(Deposit.DoesNotExist): - Deposit.objects.get(external_id=external_id) - - atom_entry_data = self.atom_entry_data0 % external_id.encode('utf-8') - - # when - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=atom_entry_data, - HTTP_SLUG='external-id', - HTTP_IN_PROGRESS='false') - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content['deposit_id'] - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.collection, self.collection) - self.assertEqual(deposit.external_id, external_id) - self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) - self.assertEqual(deposit.client, self.user) - - # one associated request to a deposit - deposit_request = DepositRequest.objects.get(deposit=deposit) - self.assertIsNotNone(deposit_request.metadata) - self.assertEqual( - deposit_request.raw_metadata, atom_entry_data.decode('utf-8')) - self.assertFalse(bool(deposit_request.archive)) - - def test_post_deposit_atom_entry_with_codemeta(self): - """Posting an initial atom entry should return 201 with deposit receipt - - """ - # given - external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' - - with self.assertRaises(Deposit.DoesNotExist): - Deposit.objects.get(external_id=external_id) - - atom_entry_data = b"""<?xml version="1.0"?> - <entry xmlns="http://www.w3.org/2005/Atom" - xmlns:dcterms="http://purl.org/dc/terms/" - xmlns:codemeta="https://doi.org/10.5063/SCHEMA/CODEMETA-2.0"> - - - <external_identifier>%s</external_identifier> - <dcterms:identifier>hal-01587361</dcterms:identifier> - <dcterms:identifier>https://hal.inria.fr/hal-01587361</dcterms:identifier> - <dcterms:identifier>https://hal.inria.fr/hal-01587361/document</dcterms:identifier> - <dcterms:identifier>https://hal.inria.fr/hal-01587361/file/AffectationRO-v1.0.0.zip</dcterms:identifier> - <dcterms:identifier>doi:10.5281/zenodo.438684</dcterms:identifier> - <dcterms:title xml:lang="en">The assignment problem</dcterms:title> - <dcterms:title xml:lang="fr">AffectationRO</dcterms:title> - <dcterms:creator>Gruenpeter, Morane</dcterms:creator> - <dcterms:subject>[INFO] Computer Science [cs]</dcterms:subject> - <dcterms:subject>[INFO.INFO-RO] Computer Science [cs]/Operations Research [cs.RO]</dcterms:subject> - <dcterms:type>SOFTWARE</dcterms:type> - <dcterms:abstract xml:lang="en">Project in OR: The assignment problemA java implementation for the assignment problem first release</dcterms:abstract> - <dcterms:abstract xml:lang="fr">description fr</dcterms:abstract> - <dcterms:created>2015-06-01</dcterms:created> - <dcterms:available>2017-10-19</dcterms:available> - <dcterms:language>en</dcterms:language> - - - <codemeta:url>url stable</codemeta:url> - <codemeta:version>Version sur hal </codemeta:version> - <codemeta:softwareVersion>Version entre par lutilisateur</codemeta:softwareVersion> - <codemeta:keywords>Mots-cls</codemeta:keywords> - <codemeta:releaseNotes>Commentaire</codemeta:releaseNotes> - <codemeta:referencePublication>Rfrence interne </codemeta:referencePublication> - <codemeta:isPartOf> - <codemeta:type> Collaboration/Projet </codemeta:type> - <codemeta:name> nom du projet</codemeta:name> - <codemeta:identifier> id </codemeta:identifier> - </codemeta:isPartOf> - <codemeta:relatedLink>Voir aussi </codemeta:relatedLink> - <codemeta:funding>Financement </codemeta:funding> - <codemeta:funding>Projet ANR </codemeta:funding> - <codemeta:funding>Projet Europen </codemeta:funding> - <codemeta:operatingSystem>Platform/OS </codemeta:operatingSystem> - <codemeta:softwareRequirements>Dpendances </codemeta:softwareRequirements> - <codemeta:developmentStatus>Etat du dveloppement </codemeta:developmentStatus> - <codemeta:license> - <codemeta:name>license</codemeta:name> - <codemeta:url>url spdx</codemeta:url> - </codemeta:license> - <codemeta:runtimePlatform>Outils de dveloppement- outil no1 </codemeta:runtimePlatform> - <codemeta:runtimePlatform>Outils de dveloppement- outil no2 </codemeta:runtimePlatform> - <codemeta:codeRepository>http://code.com</codemeta:codeRepository> - <codemeta:programmingLanguage>language 1</codemeta:programmingLanguage> - <codemeta:programmingLanguage>language 2</codemeta:programmingLanguage> - </entry>""" % external_id.encode('utf-8') # noqa - - # when - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=atom_entry_data, - HTTP_SLUG='external-id', - HTTP_IN_PROGRESS='false') - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - - deposit_id = response_content['deposit_id'] - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.collection, self.collection) - self.assertEqual(deposit.external_id, external_id) - self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) - self.assertEqual(deposit.client, self.user) - - # one associated request to a deposit - deposit_request = DepositRequest.objects.get(deposit=deposit) - self.assertIsNotNone(deposit_request.metadata) - self.assertEqual( - deposit_request.raw_metadata, atom_entry_data.decode('utf-8')) - - self.assertFalse(bool(deposit_request.archive)) - - def test_post_deposit_atom_entry_tei(self): - """Posting initial atom entry as TEI should return 201 with receipt - - """ - # given - external_id = 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a' - with self.assertRaises(Deposit.DoesNotExist): - Deposit.objects.get(external_id=external_id) - - atom_entry_data = b"""<TEI><teiHeader><fileDesc><titleStmt><title>HAL TEI export of hal-01587083</title></titleStmt><publicationStmt><distributor>CCSD</distributor><availability status="restricted"><licence target="http://creativecommons.org/licenses/by/4.0/">Distributed under a Creative Commons Attribution 4.0 International License</licence></availability><date when="2017-10-03T17:21:03+02:00"/></publicationStmt><sourceDesc><p part="N">HAL API platform</p></sourceDesc></fileDesc></teiHeader><text><body><listBibl><biblFull><titleStmt><title xml:lang="en">questionnaire software metadata</title><author role="aut"><persName><forename type="first">Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">7de56c632362954fa84172cad80afe4e</email><email type="domain">inria.fr</email><ptr type="url" target="moranegg.github.io"/><idno type="halauthorid">1556733</idno><affiliation ref="#struct-474639"/></author><editor role="depositor"><persName><forename>Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">f85a43a5fb4a2e0778a77e017f28c8fd</email><email type="domain">gmail.com</email></editor></titleStmt><editionStmt><edition n="v1" type="current"><date type="whenSubmitted">2017-09-29 11:21:32</date><date type="whenModified">2017-10-03 17:20:13</date><date type="whenReleased">2017-10-03 17:20:13</date><date type="whenProduced">2017-09-29</date><date type="whenEndEmbargoed">2017-09-29</date><ref type="file" target="https://hal.inria.fr/hal-01587083/document"><date notBefore="2017-09-29"/></ref><ref type="file" subtype="author" n="1" target="https://hal.inria.fr/hal-01587083/file/questionnaire.zip"><date notBefore="2017-09-29"/></ref></edition><respStmt><resp>contributor</resp><name key="442239"><persName><forename>Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">f85a43a5fb4a2e0778a77e017f28c8fd</email><email type="domain">gmail.com</email></name></respStmt></editionStmt><publicationStmt><distributor>CCSD</distributor><idno type="halId">hal-01587083</idno><idno type="halUri">https://hal.inria.fr/hal-01587083</idno><idno type="halBibtex">gruenpeter:hal-01587083</idno><idno type="halRefHtml">2017</idno><idno type="halRef">2017</idno></publicationStmt><seriesStmt/><notesStmt/><sourceDesc><biblStruct><analytic><title xml:lang="en">questionnaire software metadata</title><author role="aut"><persName><forename type="first">Morane</forename><surname>Gruenpeter</surname></persName><email type="md5">7de56c632362954fa84172cad80afe4e</email><email type="domain">inria.fr</email><ptr type="url" target="moranegg.github.io"/><idno type="halauthorid">1556733</idno><affiliation ref="#struct-474639"/></author></analytic><monogr><imprint/></monogr></biblStruct></sourceDesc><profileDesc><langUsage><language ident="en">English</language></langUsage><textClass><classCode scheme="halDomain" n="info">Computer Science [cs]</classCode><classCode scheme="halTypology" n="SOFTWARE">Software</classCode></textClass></profileDesc></biblFull></listBibl></body><back><listOrg type="structures"><org type="laboratory" xml:id="struct-474639" status="VALID"><orgName>IRILL</orgName><orgName type="acronym">Initiative pour la Recherche et l'Innovation sur le Logiciel Libre</orgName><desc><address><country key="FR"/></address><ref type="url">https://www.irill.org/</ref></desc><listRelation><relation active="#struct-93591" type="direct"/><relation active="#struct-300009" type="direct"/><relation active="#struct-300301" type="direct"/></listRelation></org><org type="institution" xml:id="struct-93591" status="VALID"><orgName>Universite Pierre et Marie Curie - Paris 6</orgName><orgName type="acronym">UPMC</orgName><desc><address><addrLine>4 place Jussieu - 75005 Paris</addrLine><country key="FR"/></address><ref type="url">http://www.upmc.fr/</ref></desc></org><org type="institution" xml:id="struct-300009" status="VALID"><orgName>Institut National de Recherche en Informatique et en Automatique</orgName><orgName type="acronym">Inria</orgName><desc><address><addrLine>Domaine de VoluceauRocquencourt - BP 10578153 Le Chesnay Cedex</addrLine><country key="FR"/></address><ref type="url">http://www.inria.fr/en/</ref></desc></org><org type="institution" xml:id="struct-300301" status="VALID"><orgName>Universite Paris Diderot - Paris 7</orgName><orgName type="acronym">UPD7</orgName><desc><address><addrLine>5 rue Thomas-Mann - 75205 Paris cedex 13</addrLine><country key="FR"/></address><ref type="url">http://www.univ-paris-diderot.fr</ref></desc></org></listOrg></back></text></TEI>""" # noqa - - # when - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=atom_entry_data, - HTTP_SLUG=external_id, - HTTP_IN_PROGRESS='false') - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - deposit_id = response_content['deposit_id'] - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.collection, self.collection) - self.assertEqual(deposit.external_id, external_id) - self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) - self.assertEqual(deposit.client, self.user) - - # one associated request to a deposit - deposit_request = DepositRequest.objects.get(deposit=deposit) - self.assertIsNotNone(deposit_request.metadata) - self.assertEqual( - deposit_request.raw_metadata, atom_entry_data.decode('utf-8')) - self.assertFalse(bool(deposit_request.archive)) - - def test_post_deposit_atom_entry_multiple_steps(self): - """After initial deposit, updating a deposit should return a 201 - - """ - # given - external_id = 'urn:uuid:2225c695-cfb8-4ebb-aaaa-80da344efa6a' - - with self.assertRaises(Deposit.DoesNotExist): - deposit = Deposit.objects.get(external_id=external_id) - - # when - response = self.client.post( - reverse(COL_IRI, args=[self.collection.name]), - content_type='application/atom+xml;type=entry', - data=self.atom_entry_data1, - HTTP_IN_PROGRESS='True', - HTTP_SLUG=external_id) - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - deposit_id = int(response_content['deposit_id']) - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.collection, self.collection) - self.assertEqual(deposit.external_id, external_id) - self.assertEqual(deposit.status, 'partial') - self.assertEqual(deposit.client, self.user) - - # one associated request to a deposit - deposit_requests = DepositRequest.objects.filter(deposit=deposit) - self.assertEqual(len(deposit_requests), 1) - - atom_entry_data = b"""<?xml version="1.0"?> -<entry xmlns="http://www.w3.org/2005/Atom"> - <external_identifier>%s</external_identifier> -</entry>""" % external_id.encode('utf-8') - - update_uri = response._headers['location'][1] - - # when updating the first deposit post - response = self.client.post( - update_uri, - content_type='application/atom+xml;type=entry', - data=atom_entry_data, - HTTP_IN_PROGRESS='False') - - # then - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - - response_content = parse_xml(BytesIO(response.content)) - deposit_id = int(response_content['deposit_id']) - - deposit = Deposit.objects.get(pk=deposit_id) - self.assertEqual(deposit.collection, self.collection) - self.assertEqual(deposit.external_id, external_id) - self.assertEqual(deposit.status, DEPOSIT_STATUS_DEPOSITED) - self.assertEqual(deposit.client, self.user) - - self.assertEqual(len(Deposit.objects.all()), 1) - - # now 2 associated requests to a same deposit - deposit_requests = DepositRequest.objects.filter( - deposit=deposit).order_by('id') - self.assertEqual(len(deposit_requests), 2) - - expected_meta = [ - { - 'metadata': parse_xml(self.atom_entry_data1), - 'raw_metadata': self.atom_entry_data1.decode('utf-8'), - }, - { - 'metadata': parse_xml(atom_entry_data), - 'raw_metadata': atom_entry_data.decode('utf-8'), - } - ] - - for i, deposit_request in enumerate(deposit_requests): - actual_metadata = deposit_request.metadata - self.assertEqual(actual_metadata, - expected_meta[i]['metadata']) - self.assertEqual(deposit_request.raw_metadata, - expected_meta[i]['raw_metadata']) - self.assertFalse(bool(deposit_request.archive)) + # given + external_id = 'urn:uuid:2225c695-cfb8-4ebb-aaaa-80da344efa6a' + + with pytest.raises(Deposit.DoesNotExist): + deposit = Deposit.objects.get(external_id=external_id) + + # when + response = authenticated_client.post( + reverse(COL_IRI, args=[deposit_collection.name]), + content_type='application/atom+xml;type=entry', + data=atom_dataset['entry-data1'], + HTTP_IN_PROGRESS='True', + HTTP_SLUG=external_id) + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + deposit_id = int(response_content['deposit_id']) + + deposit = Deposit.objects.get(pk=deposit_id) + assert deposit.collection == deposit_collection + assert deposit.external_id == external_id + assert deposit.status == 'partial' + + # one associated request to a deposit + deposit_requests = DepositRequest.objects.filter(deposit=deposit) + assert len(deposit_requests) == 1 + + atom_entry_data = atom_dataset['entry-data-minimal'] % external_id.encode('utf-8') # noqa + + update_uri = response._headers['location'][1] + + # when updating the first deposit post + response = authenticated_client.post( + update_uri, + content_type='application/atom+xml;type=entry', + data=atom_entry_data, + HTTP_IN_PROGRESS='False') + + # then + assert response.status_code == status.HTTP_201_CREATED + + response_content = parse_xml(BytesIO(response.content)) + deposit_id = int(response_content['deposit_id']) + + deposit = Deposit.objects.get(pk=deposit_id) + assert deposit.collection == deposit_collection + assert deposit.external_id == external_id + assert deposit.status == DEPOSIT_STATUS_DEPOSITED + + assert len(Deposit.objects.all()) == 1 + + # now 2 associated requests to a same deposit + deposit_requests = DepositRequest.objects.filter( + deposit=deposit).order_by('id') + assert len(deposit_requests) == 2 + + atom_entry_data1 = atom_dataset['entry-data1'] + expected_meta = [ + { + 'metadata': parse_xml(atom_entry_data1), + 'raw_metadata': atom_entry_data1.decode('utf-8'), + }, + { + 'metadata': parse_xml(atom_entry_data), + 'raw_metadata': atom_entry_data.decode('utf-8'), + } + ] + + for i, deposit_request in enumerate(deposit_requests): + actual_metadata = deposit_request.metadata + assert actual_metadata == expected_meta[i]['metadata'] + assert deposit_request.raw_metadata == expected_meta[i]['raw_metadata'] + assert bool(deposit_request.archive) is False -- GitLab