import datetime from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.test import TestCase, override_settings from bookmarks.models import BookmarkForm, Bookmark User = get_user_model() ENABLED_URL_VALIDATION_TEST_CASES = [ ('thisisnotavalidurl', False), ('http://domain', False), ('unknownscheme://domain.com', False), ('http://domain.com', True), ('http://www.domain.com', True), ('https://domain.com', True), ('https://www.domain.com', True), ] DISABLED_URL_VALIDATION_TEST_CASES = [ ('thisisnotavalidurl', True), ('http://domain', True), ('unknownscheme://domain.com', True), ('http://domain.com', True), ('http://www.domain.com', True), ('https://domain.com', True), ('https://www.domain.com', True), ] class BookmarkValidationTestCase(TestCase): def setUp(self) -> None: self.user = User.objects.create_user('testuser', 'test@example.com', 'password123') @override_settings(LD_DISABLE_URL_VALIDATION=False) def test_bookmark_model_should_validate_url_if_not_disabled_in_settings(self): self._run_bookmark_model_url_validity_checks(ENABLED_URL_VALIDATION_TEST_CASES) @override_settings(LD_DISABLE_URL_VALIDATION=True) def test_bookmark_model_should_not_validate_url_if_disabled_in_settings(self): self._run_bookmark_model_url_validity_checks(DISABLED_URL_VALIDATION_TEST_CASES) def test_bookmark_form_should_validate_required_fields(self): form = BookmarkForm(data={'url': ''}) self.assertEqual(len(form.errors), 1) self.assertIn('required', str(form.errors)) form = BookmarkForm(data={'url': None}) self.assertEqual(len(form.errors), 1) self.assertIn('required', str(form.errors)) @override_settings(LD_DISABLE_URL_VALIDATION=False) def test_bookmark_form_should_validate_url_if_not_disabled_in_settings(self): self._run_bookmark_form_url_validity_checks(ENABLED_URL_VALIDATION_TEST_CASES) @override_settings(LD_DISABLE_URL_VALIDATION=True) def test_bookmark_form_should_not_validate_url_if_disabled_in_settings(self): self._run_bookmark_form_url_validity_checks(DISABLED_URL_VALIDATION_TEST_CASES) def _run_bookmark_model_url_validity_checks(self, cases): for case in cases: url, expectation = case bookmark = Bookmark( url=url, date_added=datetime.datetime.now(), date_modified=datetime.datetime.now(), owner=self.user ) try: bookmark.full_clean() self.assertTrue(expectation, 'Did not expect validation error') except ValidationError as e: self.assertFalse(expectation, 'Expected validation error') self.assertTrue('url' in e.message_dict, 'Expected URL validation to fail') def _run_bookmark_form_url_validity_checks(self, cases): for case in cases: url, expectation = case form = BookmarkForm(data={'url': url}) if expectation: self.assertEqual(len(form.errors), 0) else: self.assertEqual(len(form.errors), 1) self.assertIn('Enter a valid URL', str(form.errors))