X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/864d45abe5ec985836baf52de168943d25a03be6..18948ce1d84878c6307f2d0b732a9dbd03778cfb:/src/cover/tests.py?ds=sidebyside diff --git a/src/cover/tests.py b/src/cover/tests.py index a4f5a5e3..4755991e 100644 --- a/src/cover/tests.py +++ b/src/cover/tests.py @@ -1,19 +1,224 @@ -# -*- coding: utf-8 -*- -# # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # -from django.test import TestCase -from cover.forms import FlickrForm +import re +from django.core.files.uploadedfile import SimpleUploadedFile +from django.conf import settings +from django.contrib.auth.models import User +from django.test import TestCase, override_settings +from unittest import skipUnless +from unittest.mock import patch +from documents.models import Book +from cover.forms import ImportForm +from cover.models import Image + + +IMAGE_PATH = __file__.rsplit('/', 1)[0] + '/tests/angelus-novus.jpeg' + +with open(__file__.rsplit('/', 1)[0] + '/tests/book.xml') as f: + SAMPLE_XML = f.read() +@skipUnless(settings.TEST_INTEGRATION, 'Skip integration tests') class FlickrTests(TestCase): + def assertEqualWithRe(self, dict1, dict2): + self.assertEqual(len(dict1), len(dict2)) + for k, v in dict2.items(): + if isinstance(v, re.Pattern): + self.assertRegex(dict1[k], v) + else: + self.assertEqual(dict1[k], v) + def test_flickr(self): - form = FlickrForm({"source_url": "https://www.flickr.com/photos/rczajka/6941928577/in/photostream"}) + form = ImportForm({ + "source_url": "https://www.flickr.com/photos/rczajka/6941928577/in/photostream" + }) + self.assertTrue(form.is_valid()) + self.assertEqualWithRe( + form.cleaned_data, + { + 'source_url': "https://www.flickr.com/photos/rczajka/6941928577/", + 'author': "Radek Czajka@Flickr", + 'title': "Pirate Stańczyk", + 'license_name': "CC BY 2.0", + 'license_url': "https://creativecommons.org/licenses/by/2.0/", + 'download_url': re.compile(r'\.staticflickr\.com'), + } + ) + + def test_wikimedia_fal(self): + form = ImportForm({ + "source_url": "https://commons.wikimedia.org/wiki/File:Valdai_IverskyMon_asv2018_img47.jpg" + }) self.assertTrue(form.is_valid()) - self.assertEqual(form.cleaned_data['source_url'], "https://www.flickr.com/photos/rczajka/6941928577/") - self.assertEqual(form.cleaned_data['author'], "Radek Czajka@Flickr") - self.assertEqual(form.cleaned_data['title'], u"Pirate Stańczyk") - self.assertEqual(form.cleaned_data['license_name'], "CC BY 2.0") - self.assertEqual(form.cleaned_data['license_url'], "https://creativecommons.org/licenses/by/2.0/") - self.assertTrue('.staticflickr.com' in form.cleaned_data['download_url']) + self.assertEqual( + form.cleaned_data, + { + 'title': 'Valdai IverskyMon asv2018 img47', + 'author': 'A.Savin', + 'source_url': 'https://commons.wikimedia.org/wiki/File:Valdai_IverskyMon_asv2018_img47.jpg', + 'download_url': 'https://upload.wikimedia.org/wikipedia/commons/4/43/Valdai_IverskyMon_asv2018_img47.jpg', + 'license_url': 'http://artlibre.org/licence/lal/en', + 'license_name': 'FAL' + } + ) + + def test_wikimedia_public_domain(self): + form = ImportForm({ + "source_url": 'https://commons.wikimedia.org/wiki/File:Pymonenko_A_boy_in_a_straw_hat.jpg' + }) + self.assertTrue(form.is_valid()) + self.assertEqual( + form.cleaned_data, + { + 'title': 'Chłopiec w słomkowym kapeluszu', + 'author': 'Mykola Pymonenko', + 'source_url': 'https://commons.wikimedia.org/wiki/File:Pymonenko_A_boy_in_a_straw_hat.jpg', + 'download_url': 'https://upload.wikimedia.org/wikipedia/commons/9/9b/Pymonenko_A_boy_in_a_straw_hat.jpg', + 'license_url': 'https://pl.wikipedia.org/wiki/Domena_publiczna', + 'license_name': 'domena publiczna' + } + ) + + def test_mnw(self): + form = ImportForm({ + "source_url": 'https://cyfrowe.mnw.art.pl/pl/katalog/511078' + }) + self.assertTrue(form.is_valid()) + self.assertEqualWithRe( + form.cleaned_data, + { + 'title': 'Chłopka (Baba ukraińska)', + 'author': 'Krzyżanowski, Konrad (1872-1922)', + 'source_url': 'https://cyfrowe.mnw.art.pl/pl/katalog/511078', + 'download_url': re.compile(r'https://cyfrowe-cdn\.mnw\.art\.pl/.*\.jpg'), + 'license_url': 'https://pl.wikipedia.org/wiki/Domena_publiczna', + 'license_name': 'domena publiczna' + } + ) + + def test_quick_import(self): + user = User.objects.create(username='test', is_superuser=True) + self.client.force_login(user) + + book = Book.create(slug='test', text=SAMPLE_XML, creator=user) + + self.client.post( + '/cover/quick-import/1/', + { + 'url': 'https://cyfrowe.mnw.art.pl/pl/katalog/511078' + } + ) + + self.assertEqual(Image.objects.all().count(), 1) + self.assertEqual(book[0].history().count(), 2) + self.assertIn( + 'Chłopka (Baba ukraińska), Krzyżanowski, Konrad (1872-1922), domena publiczna', + book.materialize() + ) + + +class CoverPreviewTest(TestCase): + @classmethod + def setUpTestData(cls): + cls.book = Book.create(slug='test', text='', creator=None) + + def test_preview_from_bad_xml(self): + response = self.client.post('/cover/preview/', data={"xml": ''}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.content, b'/media/static/img/sample_cover.png') + + @patch('cover.views.make_cover') + def test_preview_from_minimal_xml(self, make_cover): + response = self.client.post('/cover/preview/', data={"xml": SAMPLE_XML}) + self.assertEqual(response.status_code, 200) + self.assertIn(b'/media/dynamic/cover/preview/', response.content) + + def test_bad_book(self): + response = self.client.get('/cover/preview/test/') + self.assertEqual(response.status_code, 302) + + @patch('cover.views.make_cover') + def test_good_book(self, make_cover): + self.book[0].commit(text=SAMPLE_XML) + + response = self.client.get('/cover/preview/test/1/3/') + self.assertEqual(response.status_code, 404) + + response = self.client.get('/cover/preview/test/1/') + self.assertEqual(response.status_code, 200) + self.assertNotIn('Content-Disposition', response) + + response = self.client.get('/cover/preview/test/1/2/?download&width=100') + self.assertEqual(response.status_code, 200) + self.assertIn('attachment', response['Content-Disposition']) + + +class TestAddCover(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = User.objects.create(username='test', is_superuser=True) + + def test_add_image(self): + self.client.force_login(self.user) + + response = self.client.get('/cover/add_image/') + self.assertEqual(response.status_code, 200) + + with open(IMAGE_PATH, 'rb') as image_file: + response = self.client.post( + '/cover/add_image/', + data={ + 'title': 'Angelus Novus', + 'author': 'Paul Klee', + 'license_name': 'domena publiczna', + 'license_url': '', + 'file': image_file, + } + ) + self.assertEqual(Image.objects.all().count(), 1) + +class TestCover(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = User.objects.create(username='test', is_superuser=True) + with open(IMAGE_PATH, 'rb') as f: + cls.img = Image.objects.create( + title='Angelus Novus', + author='Paul Klee', + license_name='domena publiczna', + license_url='', + file=SimpleUploadedFile( + 'angelus-novus.jpg', + f.read(), + content_type='image/jpeg' + ) + ) + + def test_image_list(self): + response = self.client.get('/cover/image/') + self.assertEqual(len(response.context['object_list']), 1) + + def test_image(self): + response = self.client.get('/cover/image/1/') + self.assertEqual(response.context['object'].title, 'Angelus Novus') + + def test_edit_image(self): + self.client.force_login(self.user) + response = self.client.post('/cover/image/1/', { + 'author': 'author', + 'title': 'changed title', + 'license_name': 'domena', + 'cut_top': 1, + 'cut_bottom': 1, + 'cut_left': 1, + 'cut_right': 1, + }) + + response = self.client.get('/cover/image/1/') + self.assertEqual(response.context['object'].title, 'changed title') + + + def test_image_file(self): + response = self.client.get('/cover/image/1/file/') + self.assertRegex(response['Location'], r'^/media/dynamic/cover/image/')