class MuseumNumberSchema(Schema): prefix = fields.String(required=True, validate=validate.Length(min=1)) number = fields.String(required=True, validate=(validate.Length(min=1), validate.ContainsNoneOf("."))) suffix = fields.String(required=True, validate=validate.ContainsNoneOf(".")) @post_load def create_museum_number(self, data, **kwargs) -> MuseumNumber: return MuseumNumber(**data)
def test_containsnoneof_mixing_types(): with pytest.raises(ValidationError): validate.ContainsNoneOf("abc")(["a"]) with pytest.raises(ValidationError): validate.ContainsNoneOf(["a", "b", "c"])("a") with pytest.raises(ValidationError): validate.ContainsNoneOf((1, 2, 3))([1]) with pytest.raises(ValidationError): validate.ContainsNoneOf([1, 2, 3])((1, ))
class UserSchema(Schema): id = fields.Str(dump_only=True) email = fields.Str( required=True, validate=[validate.Email(error="Not a valid email address")]) username = fields.Str( required=True, validate=[ validate.Length( min=4, max=50, error="username must have between {min} and {max} characters." ), validate.Regexp( r"[a-zA-Z0-9_\-]*$", error= "username must not contain special characters (except _ und -)" ), validate.ContainsNoneOf([" "], error="username must not contain spaces") ]) password = fields.Str( required=True, load_only=True, validate=[ validate.Length( min=8, max=30, error="password must have a length between {min} and {max}") ]) mqtt_topics = fields.List(fields.Str, dump_only=True)
def test_containsnoneof_custom_message(): validator = validate.ContainsNoneOf( [1, 2, 3], error="{input} was in the banned list: {values}" ) expected = "1 was in the banned list: 1, 2, 3" with pytest.raises(ValidationError, match=expected): validator([1])
def test_containsnoneof_in_string(): validate.ContainsNoneOf("")("") == "" validate.ContainsNoneOf("")("abc") == "abc" validate.ContainsNoneOf("d")("abc") == "abc" validate.ContainsNoneOf("b")("acd") == "acd" validate.ContainsNoneOf("abc")("d") == "d" validate.ContainsNoneOf("d")("aaaa") == "a" with pytest.raises(ValidationError): validate.ContainsNoneOf("a")("abc") with pytest.raises(ValidationError): validate.ContainsNoneOf("aaa")("abc") with pytest.raises(ValidationError): validate.ContainsNoneOf("ab")("ab") with pytest.raises(ValidationError): validate.ContainsNoneOf("a")("aaaa")
def test_containsnoneof_in_tuple(): validate.ContainsNoneOf(())(()) == () validate.ContainsNoneOf(())((1, 2, 3)) == (1, 2, 3) validate.ContainsNoneOf((4, ))((1, 2, 3)) == (1, 2, 3) validate.ContainsNoneOf((2, ))((1, 3, 4)) == (1, 3, 4) validate.ContainsNoneOf((1, 2, 3))((4, )) == (4, ) validate.ContainsNoneOf((4, ))((1, 1, 1, 1)) == (1, ) with pytest.raises(ValidationError): validate.ContainsNoneOf((1, ))((1, 2, 3)) with pytest.raises(ValidationError): validate.ContainsNoneOf((1, 1, 1))((1, 2, 3)) with pytest.raises(ValidationError): validate.ContainsNoneOf((1, 2))((1, 2)) with pytest.raises(ValidationError): validate.ContainsNoneOf((1, ))((1, 1, 1, 1))
def test_containsnoneof_in_list(): validate.ContainsNoneOf([])([]) == [] validate.ContainsNoneOf([])([1, 2, 3]) == [1, 2, 3] validate.ContainsNoneOf([4])([1, 2, 3]) == [1, 2, 3] validate.ContainsNoneOf([2])([1, 3, 4]) == [1, 3, 4] validate.ContainsNoneOf([1, 2, 3])([4]) == [4] validate.ContainsNoneOf([4])([1, 1, 1, 1]) == [1] with pytest.raises(ValidationError): validate.ContainsNoneOf([1])([1, 2, 3]) with pytest.raises(ValidationError): validate.ContainsNoneOf([1, 1, 1])([1, 2, 3]) with pytest.raises(ValidationError): validate.ContainsNoneOf([1, 2])([1, 2]) with pytest.raises(ValidationError): validate.ContainsNoneOf([1])([1, 1, 1, 1])
def test_containsnoneof_error_message(): with pytest.raises(ValidationError, match="One or more of the choices you made was in: 1"): validate.ContainsNoneOf([1])([1]) with pytest.raises( ValidationError, match="One or more of the choices you made was in: 1, 2, 3"): validate.ContainsNoneOf([1, 2, 3])([1]) with pytest.raises( ValidationError, match="One or more of the choices you made was in: one, two"): validate.ContainsNoneOf(["one", "two"])(["one"]) with pytest.raises( ValidationError, match="One or more of the choices you made was in: @, !, &, ?"): validate.ContainsNoneOf("@!&?")("@")
def test_containsnoneof_unhashable_types(): assert validate.ContainsNoneOf([[1], [2], [3]])([]) == [] assert validate.ContainsNoneOf([[1], [2], [3]])([[4]]) == [[4]] assert validate.ContainsNoneOf([[1], [2], [3]])([[4], [4]]) == [[4], [4]] assert validate.ContainsNoneOf([[1], [2], [3]])([[4], [5]]) == [[4], [5]] with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[1]]) with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[1], [2]]) with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[2], [1]]) with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[1], [2], [3]]) with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[3], [2], [1]]) with pytest.raises(ValidationError): validate.ContainsNoneOf([[1], [2], [3]])([[2], [3], [1]])
class DeviceSchema(Schema): key = fields.Str() name = fields.Str(required=True, validate=validate.Length(min=2)) place = fields.Str(required=True, validate=validate.Length(min=2)) port = fields.Int(required=True, validate=[validate.Range(min=0)]) d_type = fields.Str(data_key="type", required=True, validate=[validate.OneOf(["switch", "sensor"])]) topic = fields.Str(validate=[ validate.ContainsNoneOf( ["+", "#", " ", "*"], error= "Invalid MQTT topic structure. Follow the standards defined by MQTT specifications." ), lambda val: val.count("/") > 1 ])
class PageSchema(Schema): """ Class to validate the attributes of a page """ sort_column = fields.Str(allow_none=True) sort_direction = fields.Str(allow_none=True, validate=validate.OneOf(["asc", "desc"])) size = fields.Int(missing=None, validate=validate.Range(min=1, max=1000)) offset = fields.Int(missing=0) selected_actors = fields.List(fields.String, allow_none=True) selected_statuses = fields.List( fields.String(validate=validate.ContainsNoneOf( [status.name for status in StateStatusesEnum])), allow_none=True, ) selected_ids = fields.List(fields.String, allow_none=True) start_datetime = fields.DateTime(allow_none=True) end_datetime = fields.DateTime(allow_none=True) @validates_schema def validate_sort(self, data, **kwargs): if data.get("sort_direction") and data.get("sort_column") is None: raise ValidationError("sort_column is not defined")