From 5fd256e5e6e4a30ca979f9bd4edc8daf55034699 Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Sun, 23 Sep 2018 13:30:56 +0200 Subject: Add embed validation. --- api/tests/test_validators.py | 143 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 api/tests/test_validators.py (limited to 'api/tests/test_validators.py') diff --git a/api/tests/test_validators.py b/api/tests/test_validators.py new file mode 100644 index 00000000..ce197dec --- /dev/null +++ b/api/tests/test_validators.py @@ -0,0 +1,143 @@ +from django.core.exceptions import ValidationError +from hypothesis import given, settings +from hypothesis.extra.django import TestCase +from hypothesis.strategies import dictionaries, just, lists, one_of, randoms, text + +from ..validators import validate_tag_embed + + +REQUIRED_KEYS = ( + 'content', 'fields', 'image', 'title', 'video' +) + + +class TagEmbedValidatorTests(TestCase): + @given( + dictionaries( + text().filter(lambda key: key not in REQUIRED_KEYS), + text() + ) + ) + def test_rejects_missing_required_keys(self, embed): + with self.assertRaises(ValidationError): + validate_tag_embed(embed) + + def test_rejects_empty_required_key(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': '' + }) + + @given(lists(randoms())) + def test_rejects_list_as_embed(self, embed): + with self.assertRaises(ValidationError): + validate_tag_embed(embed) + + def test_rejects_required_keys_and_unknown_keys(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "the duck walked up to the lemonade stand", + 'and': "he said to the man running the stand" + }) + + def test_rejects_too_long_title(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': 'a' * 257 + }) + + @given( + dictionaries( + just('fields'), + one_of( + lists(randoms(), min_size=25), + text(min_size=25) + ) + ) + ) + @settings(max_examples=10) + def test_rejects_too_many_fields(self, embed): + with self.assertRaises(ValidationError): + validate_tag_embed(embed) + + def test_rejects_too_long_description(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'description': 'd' * 2049 + }) + + def test_rejects_fields_as_list_of_non_mappings(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'fields': ['abc'] + }) + + def test_rejects_fields_with_unknown_fields(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'fields': [ + { + 'what': "is this field" + } + ] + }) + + def test_rejects_fields_with_too_long_name(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'fields': [ + { + 'name': "a" * 257 + } + ] + }) + + def test_rejects_footer_as_non_mapping(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'footer': [] + }) + + def test_rejects_footer_with_unknown_fields(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'footer': { + 'duck': "quack" + } + }) + + def test_rejects_footer_with_empty_text(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'footer': { + 'text': "" + } + }) + + def test_rejects_author_as_non_mapping(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'author': [] + }) + + def test_rejects_author_with_unknown_field(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'author': { + 'field': "that is unknown" + } + }) + + def test_rejects_author_with_empty_name(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'title': "whatever", + 'author': { + 'name': "" + } + }) -- cgit v1.2.3 From 34f954ab98dba0644801f5a23f9da9ca7a68dcef Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Sun, 23 Sep 2018 13:40:35 +0200 Subject: Remove `hypothesis`. --- api/tests/test_validators.py | 39 ++++++++++++--------------------------- setup.py | 3 +-- 2 files changed, 13 insertions(+), 29 deletions(-) (limited to 'api/tests/test_validators.py') diff --git a/api/tests/test_validators.py b/api/tests/test_validators.py index ce197dec..c2bb412b 100644 --- a/api/tests/test_validators.py +++ b/api/tests/test_validators.py @@ -1,7 +1,5 @@ from django.core.exceptions import ValidationError -from hypothesis import given, settings -from hypothesis.extra.django import TestCase -from hypothesis.strategies import dictionaries, just, lists, one_of, randoms, text +from django.test import TestCase from ..validators import validate_tag_embed @@ -12,15 +10,11 @@ REQUIRED_KEYS = ( class TagEmbedValidatorTests(TestCase): - @given( - dictionaries( - text().filter(lambda key: key not in REQUIRED_KEYS), - text() - ) - ) - def test_rejects_missing_required_keys(self, embed): + def test_rejects_missing_required_keys(self): with self.assertRaises(ValidationError): - validate_tag_embed(embed) + validate_tag_embed({ + 'unknown': "key" + }) def test_rejects_empty_required_key(self): with self.assertRaises(ValidationError): @@ -28,10 +22,9 @@ class TagEmbedValidatorTests(TestCase): 'title': '' }) - @given(lists(randoms())) - def test_rejects_list_as_embed(self, embed): + def test_rejects_list_as_embed(self): with self.assertRaises(ValidationError): - validate_tag_embed(embed) + validate_tag_embed([]) def test_rejects_required_keys_and_unknown_keys(self): with self.assertRaises(ValidationError): @@ -46,19 +39,11 @@ class TagEmbedValidatorTests(TestCase): 'title': 'a' * 257 }) - @given( - dictionaries( - just('fields'), - one_of( - lists(randoms(), min_size=25), - text(min_size=25) - ) - ) - ) - @settings(max_examples=10) - def test_rejects_too_many_fields(self, embed): - with self.assertRaises(ValidationError): - validate_tag_embed(embed) + def test_rejects_too_many_fields(self): + with self.assertRaises(ValidationError): + validate_tag_embed({ + 'fields': [{} for _ in range(26)] + }) def test_rejects_too_long_description(self): with self.assertRaises(ValidationError): diff --git a/setup.py b/setup.py index 068e3c0e..ab4a61a2 100644 --- a/setup.py +++ b/setup.py @@ -36,8 +36,7 @@ setup( 'mccabe>=0.6.1' ], 'test': [ - 'coverage>=4.5.1', - 'hypothesis[django]>=3.71.10' + 'coverage>=4.5.1' ] }, entry_points={ -- cgit v1.2.3 From 13eeb4c9f4e86b9e1959212a1f9ba06164c7f4af Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Sun, 23 Sep 2018 15:08:55 +0200 Subject: Exclude `admin.py` modules. --- .coveragerc | 1 + api/tests/test_validators.py | 4 ++++ 2 files changed, 5 insertions(+) (limited to 'api/tests/test_validators.py') diff --git a/.coveragerc b/.coveragerc index 74dbec20..806e2cfe 100644 --- a/.coveragerc +++ b/.coveragerc @@ -7,6 +7,7 @@ source = wiki omit = + */admin.py */apps.py pysite/wsgi.py pysite/settings.py diff --git a/api/tests/test_validators.py b/api/tests/test_validators.py index c2bb412b..51f02412 100644 --- a/api/tests/test_validators.py +++ b/api/tests/test_validators.py @@ -10,6 +10,10 @@ REQUIRED_KEYS = ( class TagEmbedValidatorTests(TestCase): + def test_rejects_non_mapping(self): + with self.assertRaises(ValidationError): + validate_tag_embed('non-empty non-mapping') + def test_rejects_missing_required_keys(self): with self.assertRaises(ValidationError): validate_tag_embed({ -- cgit v1.2.3