from unittest.mock import patch from django.test import TestCase from django.urls import reverse from bookmarks.models import Bookmark from bookmarks.tests.helpers import BookmarkFactoryMixin class SettingsExportViewTestCase(TestCase, BookmarkFactoryMixin): def setUp(self) -> None: user = self.get_or_create_test_user() self.client.force_login(user) def assertFormErrorHint(self, response, text: str): self.assertContains(response, '
') self.assertContains(response, text) def test_should_export_successfully(self): self.setup_bookmark(tags=[self.setup_tag()]) self.setup_bookmark(tags=[self.setup_tag()]) self.setup_bookmark(tags=[self.setup_tag()]) self.setup_bookmark(tags=[self.setup_tag()], is_archived=True) self.setup_bookmark(tags=[self.setup_tag()], is_archived=True) self.setup_bookmark(tags=[self.setup_tag()], is_archived=True) response = self.client.get( reverse('bookmarks:settings.export'), follow=True ) self.assertEqual(response.status_code, 200) self.assertEqual(response['content-type'], 'text/plain; charset=UTF-8') self.assertEqual(response['Content-Disposition'], 'attachment; filename="bookmarks.html"') for bookmark in Bookmark.objects.all(): self.assertContains(response, bookmark.url) def test_should_only_export_user_bookmarks(self): other_user = self.setup_user() owned_bookmarks = [ self.setup_bookmark(tags=[self.setup_tag()]), self.setup_bookmark(tags=[self.setup_tag()]), self.setup_bookmark(tags=[self.setup_tag()]), ] non_owned_bookmarks = [ self.setup_bookmark(tags=[self.setup_tag()], user=other_user), self.setup_bookmark(tags=[self.setup_tag()], user=other_user), self.setup_bookmark(tags=[self.setup_tag()], user=other_user), ] response = self.client.get( reverse('bookmarks:settings.export'), follow=True ) text = response.content.decode('utf-8') for bookmark in owned_bookmarks: self.assertIn(bookmark.url, text) for bookmark in non_owned_bookmarks: self.assertNotIn(bookmark.url, text) def test_should_check_authentication(self): self.client.logout() response = self.client.get(reverse('bookmarks:settings.export'), follow=True) self.assertRedirects(response, reverse('login') + '?next=' + reverse('bookmarks:settings.export')) def test_should_show_hint_when_export_raises_error(self): with patch('bookmarks.services.exporter.export_netscape_html') as mock_export_netscape_html: mock_export_netscape_html.side_effect = Exception('Nope') response = self.client.get(reverse('bookmarks:settings.export'), follow=True) self.assertTemplateUsed(response, 'settings/general.html') self.assertFormErrorHint(response, 'An error occurred during bookmark export.')