Source code for repository.tests.test_controllers

"""Tests for :mod:`repository.controllers`."""

import io
from datetime import datetime
from http import HTTPStatus
from unittest import TestCase, mock

from pytz import UTC
from werkzeug.exceptions import NotFound

from arxiv.canonical import domain as D
from arxiv.canonical import NoSuchResource
from ..services.record import RepositoryService
from .. import controllers


[docs]class ControllerTestCase(TestCase):
[docs] def setUp(self): self.mock_pdf = lambda *a, **k: io.BytesIO(b'foocontent') identifier = D.VersionedIdentifier('2901.00345v1') created = datetime(2029, 1, 29, 20, 4, 23, tzinfo=UTC) listing_id = D.ListingIdentifier.from_parts(created.date(), 'foo') self.render = D.CanonicalFile( filename='2901.00345v1.pdf', modified=created, size_bytes=404, content_type=D.ContentType.pdf, ref=D.URI('/fake/path.pdf') ) self.version = D.Version( identifier=identifier, announced_date=created.date(), announced_date_first=created.date(), submitted_date=created, updated_date=created, is_announced=True, events=[], previous_versions=[], metadata=D.Metadata( primary_classification=D.Category('cs.DL'), secondary_classification=[D.Category('cs.IR')], title='Foo title', abstract='It is abstract', authors='Ima N. Author (FSU)', license=D.License(href="http://some.license") ), source=D.CanonicalFile( filename='2901.00345v1.tar', modified=created, size_bytes=4_304, content_type=D.ContentType.tar, ref=D.URI('/fake/path.tar'), is_gzipped=False, ), render=self.render ) self.event = D.Event( identifier=identifier, event_date=created, event_type=D.EventType.NEW, categories=[D.Category('cs.DL')], version=self.version ) self.version.events.append(self.event.summary)
[docs]class TestGetEPrintEvents(ControllerTestCase): """Tests for :func:`.controllers.get_eprint_events`."""
[docs] @mock.patch(f'{controllers.__name__}.RepositoryService') def test_request_for_nonexistant_eprint(self, mock_RepositoryService): """A request is received for a nonexistant e-print.""" mock_repo = mock.MagicMock() mock_repo.register.load_version.side_effect = NoSuchResource mock_RepositoryService.current_session.return_value = mock_repo with self.assertRaises(NotFound): controllers.get_eprint_events('1901.00123', 4)
[docs] @mock.patch(f'{controllers.__name__}.RepositoryService') def test_request_for_existant_eprint(self, mock_RepositoryService): """A request is received for an existant e-print.""" mock_repo = mock.MagicMock() mock_repo.register.load_version.return_value = self.version mock_RepositoryService.current_session.return_value = mock_repo data, code, headers = controllers.get_eprint_events('1901.00123', 4) self.assertIsInstance(data, list, 'Returns a list of objects') self.assertGreater(len(data), 0, 'Returns at least one object') for obj in data: self.assertIsInstance(obj, D.EventSummary, 'List items are EventSummary') self.assertEqual(code, HTTPStatus.OK, 'Return status is 200 OK')
[docs]class TestGetEPrintPDF(ControllerTestCase): """Tests for :func:`.controllers.get_eprint_pdf`."""
[docs] @mock.patch(f'{controllers.__name__}.RepositoryService') def test_request_for_nonexistant_eprint(self, mock_RepositoryService): """A request is received for a nonexistant e-print.""" mock_repo = mock.MagicMock() mock_repo.register.load_render.side_effect = NoSuchResource mock_RepositoryService.current_session.return_value = mock_repo with self.assertRaises(NotFound): controllers.get_eprint_pdf('1901.00123', 4)
[docs] @mock.patch(f'{controllers.__name__}.RepositoryService') def test_request_for_existant_eprint(self, mock_RepositoryService): """A request is received for an existant e-print.""" mock_repo = mock.MagicMock() mock_repo.register.load_render.return_value \ = self.render, io.BytesIO(b'foo') mock_RepositoryService.current_session.return_value = mock_repo data, code, headers = controllers.get_eprint_pdf('1901.00123', 4) self.assertIsInstance(data['metadata'], D.CanonicalFile, 'Returns a File') self.assertEqual(code, HTTPStatus.OK, 'Return status is 200 OK')