from django.conf import settings from django.core.files.base import ContentFile from django.test import TestCase, override_settings from django.urls import reverse from wagtail.documents import models class TestCorrectDownloadUrlSerialization(TestCase): """Test asserts that in case of both `redirect` and `direct` WAGTAILDOCS_SERVE_METHOD settings `download_url` field is correctly serialized by DocumentDownloadUrlField.""" def setUp(self): self.document = models.Document(title="Test document", file_hash="123456") self.document.file.save( "serialization.doc", ContentFile("A boring example document"), ) def tearDown(self): # delete the FieldFile directly because the TestCase does not commit # transactions to trigger transaction.on_commit() in the signal handler self.document.file.delete() def get_response(self, document_id, **params): return self.client.get( reverse("wagtailapi_v2:documents:detail", args=(document_id,)), params ) @override_settings( WAGTAILDOCS_SERVE_METHOD="redirect", STORAGES={ **settings.STORAGES, "default": { "BACKEND": "wagtail.test.dummy_external_storage.DummyExternalStorage" }, }, WAGTAILAPI_BASE_URL="http://example.com/", ) def test_serializer_wagtaildocs_serve_redirect(self): response = self.get_response(self.document.id) data = response.json() self.assertIn("meta", data) meta = data["meta"] self.assertIn("download_url", meta) download_url = meta["download_url"] expected_url = ( f"http://example.com/documents/{self.document.pk}/serialization.doc" ) self.assertEqual(download_url, expected_url) @override_settings( WAGTAILDOCS_SERVE_METHOD="direct", STORAGES={ **settings.STORAGES, "default": { "BACKEND": "wagtail.test.dummy_external_storage.DummyExternalStorage" }, }, MEDIA_URL="http://remotestorage.com/media/", WAGTAILAPI_BASE_URL="http://example.com/", ) def test_serializer_wagtaildocs_serve_direct(self): response = self.get_response(self.document.id) data = response.json() self.assertIn("meta", data) meta = data["meta"] self.assertIn("download_url", meta) download_url = meta["download_url"] self.assertEqual( download_url, "http://remotestorage.com/media/documents/serialization.doc", )