From 66877b46bd3a143e1d66c449ca3851be03913541 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Fri, 24 Aug 2018 13:49:39 -0400 Subject: [PATCH] Ensure that project environment names are unique --- atst/forms/new_project.py | 7 +++++-- atst/forms/validators.py | 9 +++++++++ tests/forms/test_validators.py | 17 ++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/atst/forms/new_project.py b/atst/forms/new_project.py index 65685e70..b6007364 100644 --- a/atst/forms/new_project.py +++ b/atst/forms/new_project.py @@ -1,7 +1,7 @@ from flask_wtf import Form from wtforms.fields import StringField, TextAreaField, FieldList from wtforms.validators import Required -from atst.forms.validators import ListItemRequired +from atst.forms.validators import ListItemRequired, ListItemsUnique class NewProjectForm(Form): @@ -12,7 +12,10 @@ class NewProjectForm(Form): description = TextAreaField(label="Description", validators=[Required()]) environment_names = FieldList( StringField(label="Environment Name"), - validators=[ListItemRequired(message="Provide at least one environment name.")], + validators=[ + ListItemRequired(message="Provide at least one environment name."), + ListItemsUnique(message="Environment names must be unique."), + ], ) @property diff --git a/atst/forms/validators.py b/atst/forms/validators.py index 5be056e3..1cc8bb83 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -60,3 +60,12 @@ def ListItemRequired(message="Please provide at least one.", empty_values=("", N raise ValidationError(message) return _list_item_required + + +def ListItemsUnique(message="Items must be unique"): + def _list_items_unique(form, field): + sorted_values = sorted(v for v in field.data) + if sorted_values != sorted(set(sorted_values)): + raise ValidationError(message) + + return _list_items_unique diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index 794310ac..4fc16412 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -1,7 +1,7 @@ from wtforms.validators import ValidationError import pytest -from atst.forms.validators import Alphabet, IsNumber, PhoneNumber +from atst.forms.validators import Alphabet, IsNumber, PhoneNumber, ListItemsUnique class TestIsNumber: @@ -51,3 +51,18 @@ class TestAlphabet: dummy_field.data = invalid with pytest.raises(ValidationError): validator(dummy_form, dummy_field) + + +class TestListItemsUnique: + @pytest.mark.parametrize("valid", [["a", "aa", "aaa"], ["one", "two", "three"]]) + def test_ListItemsUnique_allows_unique_items(self, valid, dummy_form, dummy_field): + validator = ListItemsUnique() + dummy_field.data = valid + validator(dummy_form, dummy_field) + + @pytest.mark.parametrize("invalid", [["a", "a", "a"], ["one", "two", "two", "three"]]) + def test_ListItemsUnique_rejects_non_letters(self, invalid, dummy_form, dummy_field): + validator = ListItemsUnique() + dummy_field.data = invalid + with pytest.raises(ValidationError): + validator(dummy_form, dummy_field)