aboutsummaryrefslogtreecommitdiffstats
path: root/api/tests/test_validators.py
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2018-09-23 13:30:56 +0200
committerGravatar Johannes Christ <[email protected]>2018-09-23 13:30:56 +0200
commit5fd256e5e6e4a30ca979f9bd4edc8daf55034699 (patch)
tree440440cf6de3cc957caaaf53ae94df1d0c1551dc /api/tests/test_validators.py
parentAdd the `Tag` model. (diff)
Add embed validation.
Diffstat (limited to 'api/tests/test_validators.py')
-rw-r--r--api/tests/test_validators.py143
1 files changed, 143 insertions, 0 deletions
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': ""
+ }
+ })