Beispiel #1
0
    def test_was_modified_since_django(self):
        """DownloadMixin.was_modified_since() tries (2) files attributes.

        When calling file wrapper's ``was_modified_since()`` raises
        ``NotImplementedError`` or ``AttributeError``,
        :meth:`django_downloadview.views.base.DownloadMixin.was_modified_since`
        tries to pass file wrapper's ``size`` and ``modified_time`` to
        :func:`django.views.static import was_modified_since`.

        """
        file_wrapper = mock.Mock()
        file_wrapper.was_modified_since = mock.Mock(
            side_effect=AttributeError)
        file_wrapper.size = mock.sentinel.size
        file_wrapper.modified_time = datetime.now()
        was_modified_since_mock = mock.Mock(
            return_value=mock.sentinel.was_modified)
        mixin = views.DownloadMixin()
        with mock.patch('django_downloadview.views.base.was_modified_since',
                        new=was_modified_since_mock):
            self.assertIs(
                mixin.was_modified_since(file_wrapper, mock.sentinel.since),
                mock.sentinel.was_modified)
        was_modified_since_mock.assert_called_once_with(
            mock.sentinel.since,
            calendar.timegm(file_wrapper.modified_time.utctimetuple()),
            mock.sentinel.size)
Beispiel #2
0
    def test_was_modified_since_fallback(self):
        """DownloadMixin.was_modified_since() fallbacks to `True`.

        When:

        * calling file wrapper's ``was_modified_since()`` raises
          ``NotImplementedError`` or ``AttributeError``;

        * and accessing ``size`` and ``modified_time`` from file wrapper raises
          ``NotImplementedError`` or ``AttributeError``...

        ... then
        :meth:`django_downloadview.views.base.DownloadMixin.was_modified_since`
        returns ``True``.

        """
        file_wrapper = mock.Mock()
        file_wrapper.was_modified_since = mock.Mock(
            side_effect=NotImplementedError)
        type(file_wrapper).modified_time = mock.PropertyMock(
            side_effect=NotImplementedError)
        mixin = views.DownloadMixin()
        self.assertIs(
            mixin.was_modified_since(file_wrapper, 'fake since'),
            True)
Beispiel #3
0
    def test_get_file(self):
        """DownloadMixin.get_file() raise NotImplementedError.

        Subclasses must implement it!

        """
        mixin = views.DownloadMixin()
        with self.assertRaises(NotImplementedError):
            mixin.get_file()
Beispiel #4
0
 def test_was_modified_since_specific(self):
     """DownloadMixin.was_modified_since() delegates to file wrapper."""
     file_wrapper = mock.Mock()
     file_wrapper.was_modified_since = mock.Mock(
         return_value=mock.sentinel.return_value)
     mixin = views.DownloadMixin()
     since = mock.sentinel.since
     return_value = mixin.was_modified_since(file_wrapper, since)
     self.assertEqual(return_value, mock.sentinel.return_value)
     file_wrapper.was_modified_since.assert_called_once_with(since)
Beispiel #5
0
 def test_render_to_response_file_not_found(self):
     "DownloadMixin.render_to_response() calls file_not_found_response()."
     # Setup.
     mixin = views.DownloadMixin()
     mixin.request = django.test.RequestFactory().get('/dummy-url')
     mixin.get_file = mock.Mock(side_effect=exceptions.FileNotFound)
     mixin.file_not_found_response = mock.Mock()
     # Run.
     mixin.render_to_response()
     # Check.
     mixin.file_not_found_response.assert_called_once_with()
Beispiel #6
0
 def test_was_modified_since_not_implemented(self):
     """DownloadMixin.was_modified_since() returns True if file wrapper
     does not support ``modified_time`` or ``size`` attributes."""
     fields = ['modified_time', 'size']
     side_effects = [AttributeError('fake'), NotImplementedError('fake')]
     for field in fields:
         for side_effect in side_effects:
             file_wrapper = mock.Mock()
             setattr(file_wrapper, field, mock.Mock(
                 side_effect=AttributeError('fake')))
             mixin = views.DownloadMixin()
             since = mock.sentinel.since
             self.assertTrue(mixin.was_modified_since(file_wrapper, since))
Beispiel #7
0
 def test_download_response(self):
     "DownloadMixin.download_response() returns download response instance."
     mixin = views.DownloadMixin()
     mixin.file_instance = mock.sentinel.file_wrapper
     response_factory = mock.Mock(return_value=mock.sentinel.response)
     mixin.response_class = response_factory
     response_kwargs = {'dummy': 'value',
                        'file_instance': mock.sentinel.file_wrapper,
                        'attachment': True,
                        'basename': None,
                        'file_mimetype': None,
                        'file_encoding': None}
     response = mixin.download_response(**response_kwargs)
     self.assertIs(response, mock.sentinel.response)
     response_factory.assert_called_once_with(**response_kwargs)  # Not args
Beispiel #8
0
    def test_was_modified_since_file(self):
        """DownloadMixin.was_modified_since() tries (1) file's implementation.

        :meth:`django_downloadview.views.base.DownloadMixin.was_modified_since`
        first tries to delegate computations to file wrapper's implementation.

        """
        file_wrapper = mock.Mock()
        file_wrapper.was_modified_since = mock.Mock(
            return_value=mock.sentinel.was_modified)
        mixin = views.DownloadMixin()
        self.assertIs(
            mixin.was_modified_since(file_wrapper, mock.sentinel.since),
            mock.sentinel.was_modified)
        file_wrapper.was_modified_since.assert_called_once_with(
            mock.sentinel.since)
 def test_render_to_response_modified(self):
     """DownloadMixin.render_to_response() calls download_response()."""
     # Setup.
     mixin = views.DownloadMixin()
     mixin.request = django.test.RequestFactory().get(
         '/dummy-url', HTTP_IF_MODIFIED_SINCE=None)
     mixin.was_modified_since = mock.Mock()
     mixin.download_response = mock.Mock(
         return_value=mock.sentinel.download_response)
     mixin.get_file = mock.Mock(return_value=mock.sentinel.file_wrapper)
     # Run.
     response = mixin.render_to_response()
     # Check.
     self.assertIs(response, mock.sentinel.download_response)
     mixin.get_file.assert_called_once_with()
     self.assertEqual(mixin.was_modified_since.call_count, 0)
     mixin.download_response.assert_called_once_with()
Beispiel #10
0
 def test_download_response(self):
     "DownloadMixin.download_response() returns download response instance."
     mixin = views.DownloadMixin()
     mixin.file_instance = mock.sentinel.file_wrapper
     response_factory = mock.Mock(return_value=mock.sentinel.response)
     mixin.response_class = response_factory
     response_kwargs = {
         "dummy": "value",
         "file_instance": mock.sentinel.file_wrapper,
         "attachment": True,
         "basename": None,
         "file_mimetype": None,
         "file_encoding": None,
     }
     response = mixin.download_response(**response_kwargs)
     self.assertIs(response, mock.sentinel.response)
     response_factory.assert_called_once_with(**response_kwargs)  # Not args
 def test_render_to_response_not_modified(self):
     """DownloadMixin.render_to_response() respects HTTP_IF_MODIFIED_SINCE
     header (calls ``not_modified_response()``)."""
     # Setup.
     mixin = views.DownloadMixin()
     mixin.request = django.test.RequestFactory().get(
         '/dummy-url',
         HTTP_IF_MODIFIED_SINCE=mock.sentinel.http_if_modified_since)
     mixin.was_modified_since = mock.Mock(return_value=False)
     mixin.not_modified_response = mock.Mock(
         return_value=mock.sentinel.http_not_modified_response)
     mixin.get_file = mock.Mock(return_value=mock.sentinel.file_wrapper)
     # Run.
     response = mixin.render_to_response()
     # Check.
     self.assertIs(response, mock.sentinel.http_not_modified_response)
     mixin.get_file.assert_called_once_with()
     mixin.was_modified_since.assert_called_once_with(
         mock.sentinel.file_wrapper, mock.sentinel.http_if_modified_since)
     mixin.not_modified_response.assert_called_once_with()
Beispiel #12
0
 def test_get_basename(self):
     """DownloadMixin.get_basename() returns basename attribute."""
     mixin = views.DownloadMixin()
     self.assertEqual(mixin.get_basename(), None)
     mixin.basename = 'fake'
     self.assertEqual(mixin.get_basename(), 'fake')
Beispiel #13
0
 def test_file_not_found_response(self):
     """DownloadMixin.file_not_found_response() raises Http404."""
     mixin = views.DownloadMixin()
     with self.assertRaises(Http404):
         mixin.file_not_found_response()
Beispiel #14
0
 def test_not_modified_response(self):
     "DownloadMixin.not_modified_response returns HttpResponseNotModified."
     mixin = views.DownloadMixin()
     response = mixin.not_modified_response()
     self.assertTrue(isinstance(response, HttpResponseNotModified))