diff --git a/app/main/forms.py b/app/main/forms.py index 6b8a224a2..eb82e9be6 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -238,4 +238,14 @@ class ConfirmMobileNumberForm(Form): class CreateKeyForm(Form): - key_name = StringField(u'Description of key') + def __init__(self, existing_key_names=[], *args, **kwargs): + self.existing_key_names = existing_key_names + super(CreateKeyForm, self).__init__(*args, **kwargs) + + key_name = StringField(u'Description of key', validators=[ + DataRequired(message='You need to give the key a name') + ]) + + def validate_key_name(self, key_name): + if key_name.data in self.existing_key_names: + raise ValidationError('A key with this name already exists') diff --git a/app/main/views/api_keys.py b/app/main/views/api_keys.py index f3790d174..e2d77bf31 100644 --- a/app/main/views/api_keys.py +++ b/app/main/views/api_keys.py @@ -24,7 +24,10 @@ def api_keys(service_id): @main.route("/services//api-keys/create", methods=['GET', 'POST']) @login_required def create_api_key(service_id): - form = CreateKeyForm() + key_names = [ + key['name'] for key in api_key_api_client.get_api_keys(service_id=service_id)['apiKeys'] + ] + form = CreateKeyForm(key_names) if form.validate_on_submit(): secret = api_key_api_client.create_api_key(service_id=service_id, key_name=form.key_name.data) return render_template('views/api-keys/show.html', service_id=service_id, secret=secret, diff --git a/tests/app/main/test_create_api_key_form.py b/tests/app/main/test_create_api_key_form.py new file mode 100644 index 000000000..54608da6f --- /dev/null +++ b/tests/app/main/test_create_api_key_form.py @@ -0,0 +1,16 @@ +from werkzeug.datastructures import MultiDict + +from app.main.forms import CreateKeyForm + + +def test_return_validation_error_when_key_name_exists(app_, + db_, + db_session): + def _get_names(): + return ['some key', 'another key'] + + with app_.test_request_context(): + form = CreateKeyForm(_get_names(), + formdata=MultiDict([('key_name', 'some key')])) + form.validate() + assert {'key_name': ['A key with this name already exists']} == form.errors diff --git a/tests/app/main/views/test_api_keys.py b/tests/app/main/views/test_api_keys.py index fbd2054ea..e1b114398 100644 --- a/tests/app/main/views/test_api_keys.py +++ b/tests/app/main/views/test_api_keys.py @@ -62,7 +62,8 @@ def test_should_show_name_api_key_page(app_, active_user, mock_get_service, mock_get_services, - mock_user_loader): + mock_user_loader, + mock_get_api_keys): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user) @@ -78,7 +79,8 @@ def test_should_render_show_api_key(app_, mock_get_service, mock_get_services, mock_user_loader, - mock_create_api_key): + mock_create_api_key, + mock_get_api_keys): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user)