diff --git a/overhave/admin/views/testing_users.py b/overhave/admin/views/testing_users.py index c32ea2da..880ba263 100644 --- a/overhave/admin/views/testing_users.py +++ b/overhave/admin/views/testing_users.py @@ -1,3 +1,4 @@ +from re import fullmatch from typing import cast from flask_admin.form import JSONField @@ -50,6 +51,8 @@ class TestUserView(ModelViewConfigured): _feature_type: FeatureTypeName | None = None + _allowed_symbols = r"[a-zA-Z_]*" + def on_form_prefill(self, form: Form, id) -> None: # type: ignore # noqa: A002 if not isinstance(form._obj, db.TestUser): return @@ -78,6 +81,8 @@ def _validate_json(model: db.TestUser) -> None: raise ValidationError(f"Could not convert specified data into {parser.__name__} model!") def on_model_change(self, form: Form, model: db.TestUser, is_created: bool) -> None: + if model.key is not None and not fullmatch(self._allowed_symbols, model.key): + raise ValidationError("Key should contain only characters, digits or underscore!") self._feature_type = cast(FeatureTypeName, model.feature_type.name) self._validate_json(model) if is_created: diff --git a/tests/unit/admin/test_testing_users.py b/tests/unit/admin/test_testing_users.py index 42315fea..75179a89 100644 --- a/tests/unit/admin/test_testing_users.py +++ b/tests/unit/admin/test_testing_users.py @@ -47,6 +47,19 @@ def test_incorrect_model_raises_error( with pytest.raises(ValidationError): test_testing_user_view.on_model_change(form=form_mock, model=db_test_user, is_created=test_is_created) + @pytest.mark.parametrize("user_role", [db.Role.user, db.Role.admin], indirect=True) + @pytest.mark.parametrize("test_is_created", [False, True]) + def test_key_with_spaces_for_model_raises_errors( + self, + test_testing_user_view: TestUserView, + current_user_mock: mock.MagicMock, + form_mock: mock.MagicMock, + test_is_created: bool, + ) -> None: + db_test_user = db.TestUser(key="kek kek") + with pytest.raises(ValidationError): + test_testing_user_view.on_model_change(form=form_mock, model=db_test_user, is_created=test_is_created) + @pytest.mark.parametrize("user_role", [db.Role.admin, db.Role.user], indirect=True) def test_on_form_prefill_set_feature_type( self,