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