Changeset View
Changeset View
Standalone View
Standalone View
swh/deposit/tests/api/test_deposit_multipart.py
# Copyright (C) 2017-2018 The Software Heritage developers | # Copyright (C) 2017-2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
from django.core.files.uploadedfile import InMemoryUploadedFile | from django.core.files.uploadedfile import InMemoryUploadedFile | ||||
from django.core.urlresolvers import reverse | from django.core.urlresolvers import reverse | ||||
from io import BytesIO | from io import BytesIO | ||||
from nose.tools import istest | |||||
from rest_framework import status | from rest_framework import status | ||||
from rest_framework.test import APITestCase | from rest_framework.test import APITestCase | ||||
from swh.deposit.config import COL_IRI | from swh.deposit.config import COL_IRI | ||||
from swh.deposit.config import DEPOSIT_STATUS_DEPOSITED | from swh.deposit.config import DEPOSIT_STATUS_DEPOSITED | ||||
from swh.deposit.models import Deposit, DepositRequest | from swh.deposit.models import Deposit, DepositRequest | ||||
from swh.deposit.parsers import parse_xml | from swh.deposit.parsers import parse_xml | ||||
from ..common import BasicTestCase, WithAuthTestCase | from ..common import BasicTestCase, WithAuthTestCase | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | </entry>""" | ||||
self.data_atom_entry_update_in_place = """<?xml version="1.0"?> | self.data_atom_entry_update_in_place = """<?xml version="1.0"?> | ||||
<entry xmlns="http://www.w3.org/2005/Atom" | <entry xmlns="http://www.w3.org/2005/Atom" | ||||
xmlns:dcterms="http://purl.org/dc/terms/"> | xmlns:dcterms="http://purl.org/dc/terms/"> | ||||
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa7b</id> | <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa7b</id> | ||||
<dcterms:title>Title</dcterms:title> | <dcterms:title>Title</dcterms:title> | ||||
<dcterms:type>Type</dcterms:type> | <dcterms:type>Type</dcterms:type> | ||||
</entry>""" | </entry>""" | ||||
@istest | def test_post_deposit_multipart_without_slug_header_is_bad_request(self): | ||||
def post_deposit_multipart_without_slug_header_is_bad_request(self): | |||||
# given | # given | ||||
url = reverse(COL_IRI, args=[self.collection.name]) | url = reverse(COL_IRI, args=[self.collection.name]) | ||||
data_atom_entry = self.data_atom_entry_ok | data_atom_entry = self.data_atom_entry_ok | ||||
archive_content = b'some content representing archive' | archive_content = b'some content representing archive' | ||||
archive = InMemoryUploadedFile( | archive = InMemoryUploadedFile( | ||||
BytesIO(archive_content), | BytesIO(archive_content), | ||||
field_name='archive0', | field_name='archive0', | ||||
Show All 20 Lines | def test_post_deposit_multipart_without_slug_header_is_bad_request(self): | ||||
}, | }, | ||||
# + headers | # + headers | ||||
HTTP_IN_PROGRESS='false') | HTTP_IN_PROGRESS='false') | ||||
self.assertIn(b'Missing SLUG header', response.content) | self.assertIn(b'Missing SLUG header', response.content) | ||||
self.assertEqual(response.status_code, | self.assertEqual(response.status_code, | ||||
status.HTTP_400_BAD_REQUEST) | status.HTTP_400_BAD_REQUEST) | ||||
@istest | def test_post_deposit_multipart_zip(self): | ||||
def post_deposit_multipart_zip(self): | |||||
"""one multipart deposit (zip+xml) should be accepted | """one multipart deposit (zip+xml) should be accepted | ||||
""" | """ | ||||
# given | # given | ||||
url = reverse(COL_IRI, args=[self.collection.name]) | url = reverse(COL_IRI, args=[self.collection.name]) | ||||
# from django.core.files import uploadedfile | # from django.core.files import uploadedfile | ||||
data_atom_entry = self.data_atom_entry_ok | data_atom_entry = self.data_atom_entry_ok | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | def test_post_deposit_multipart_zip(self): | ||||
self.assertIsNone(deposit_request.raw_metadata) | self.assertIsNone(deposit_request.raw_metadata) | ||||
else: | else: | ||||
self.assertEquals( | self.assertEquals( | ||||
deposit_request.metadata['id'], | deposit_request.metadata['id'], | ||||
'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') | 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') | ||||
self.assertEquals(deposit_request.raw_metadata, | self.assertEquals(deposit_request.raw_metadata, | ||||
data_atom_entry.decode('utf-8')) | data_atom_entry.decode('utf-8')) | ||||
@istest | def test_post_deposit_multipart_tar(self): | ||||
def post_deposit_multipart_tar(self): | |||||
"""one multipart deposit (tar+xml) should be accepted | """one multipart deposit (tar+xml) should be accepted | ||||
""" | """ | ||||
# given | # given | ||||
url = reverse(COL_IRI, args=[self.collection.name]) | url = reverse(COL_IRI, args=[self.collection.name]) | ||||
# from django.core.files import uploadedfile | # from django.core.files import uploadedfile | ||||
data_atom_entry = self.data_atom_entry_ok | data_atom_entry = self.data_atom_entry_ok | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | def test_post_deposit_multipart_tar(self): | ||||
self.assertIsNone(deposit_request.raw_metadata) | self.assertIsNone(deposit_request.raw_metadata) | ||||
else: | else: | ||||
self.assertEquals( | self.assertEquals( | ||||
deposit_request.metadata['id'], | deposit_request.metadata['id'], | ||||
'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') | 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a') | ||||
self.assertEquals(deposit_request.raw_metadata, | self.assertEquals(deposit_request.raw_metadata, | ||||
data_atom_entry.decode('utf-8')) | data_atom_entry.decode('utf-8')) | ||||
@istest | def test_post_deposit_multipart_put_to_replace_metadata(self): | ||||
def post_deposit_multipart_put_to_replace_metadata(self): | |||||
"""One multipart deposit followed by a metadata update should be | """One multipart deposit followed by a metadata update should be | ||||
accepted | accepted | ||||
""" | """ | ||||
# given | # given | ||||
url = reverse(COL_IRI, args=[self.collection.name]) | url = reverse(COL_IRI, args=[self.collection.name]) | ||||
data_atom_entry = self.data_atom_entry_ok | data_atom_entry = self.data_atom_entry_ok | ||||
▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | def test_post_deposit_multipart_put_to_replace_metadata(self): | ||||
deposit_request.metadata['id'], | deposit_request.metadata['id'], | ||||
'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa7b') | 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa7b') | ||||
self.assertEquals( | self.assertEquals( | ||||
deposit_request.raw_metadata, | deposit_request.raw_metadata, | ||||
self.data_atom_entry_update_in_place) | self.data_atom_entry_update_in_place) | ||||
# FAILURE scenarios | # FAILURE scenarios | ||||
@istest | def test_post_deposit_multipart_only_archive_and_atom_entry(self): | ||||
def post_deposit_multipart_only_archive_and_atom_entry(self): | |||||
"""Multipart deposit only accepts one archive and one atom+xml""" | """Multipart deposit only accepts one archive and one atom+xml""" | ||||
# given | # given | ||||
url = reverse(COL_IRI, args=[self.collection.name]) | url = reverse(COL_IRI, args=[self.collection.name]) | ||||
archive_content = b'some content representing archive' | archive_content = b'some content representing archive' | ||||
archive = InMemoryUploadedFile(BytesIO(archive_content), | archive = InMemoryUploadedFile(BytesIO(archive_content), | ||||
field_name='archive0', | field_name='archive0', | ||||
name='archive0', | name='archive0', | ||||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |