def test_should_append_to_importables(self, model_specs, acspec): acspec.create_or_update_sys_module() from acspecctx import BlogModel # noqa from acspecctx import PostModel # noqa from acspecctx import AuthorModel # noqa with pytest.raises( ImportError ) as excinfo: from acspecctx import ImportErrorModel # noqa assert excinfo.typename == "ImportError" model_specs["import_error"] = { "test": { "type": { "simple": "string" } } } acspec = Acspec(model_specs) acspec.create_or_update_sys_module() from acspecctx import ImportErrorModel assert hasattr(ImportErrorModel, "test")
def test_should_sanitize_model_name(self, invalid_model_name_specs): acspec = Acspec(invalid_model_name_specs) assert "to_be_sanitized" in acspec._raw_specs model = acspec.ToBeSanitizedModel({ "field": "test" }) model.validate()
def test_should_allow_inheritance_form_other_specs( self, blog_specs, post_data ): blog_specs['extended_post'] = { ':bases': ["post"], "subtitle": { "type": "string" } } acspec = Acspec(blog_specs) assert issubclass(acspec.ExtendedPostModel, acspec.PostModel) post_data["subtitle"] = "Subtitle" model = acspec.ExtendedPostModel(post_data) model.validate()
def test_should_handle_dict_types( self, model_specs, post_data ): model_specs["blog"]["messages"] = { "type": {"dict": {"simple": "string"}} } acspec = Acspec(model_specs) model = acspec.BlogModel({ "messages": { "test_scope": "test_content" } }) assert model.to_primitive()["messages"] == { "test_scope": "test_content" }
def test_raises_on_missing_superclass(self, basic_specs): basic_specs["basic"][":bases"] = ["custom_model"] with pytest.raises(MissingBaseClassMappingError) as excinfo: Acspec(basic_specs) assert str(excinfo.value) == \ "Please provide a class_mapping for 'custom_model'"
def test_provice_custom_base(self, basic_specs): class_mapping = { ":bases": [CustomModel] } acspec = Acspec(basic_specs, class_mapping=class_mapping) assert hasattr(acspec, "BasicModel") assert issubclass(acspec.BasicModel, CustomModel)
def test_specify_superclass(self, basic_specs): class_mapping = { "custom_model": CustomModel } basic_specs["basic"][":bases"] = ["custom_model"] acspec = Acspec(basic_specs, class_mapping=class_mapping) assert hasattr(acspec, "BasicModel") assert issubclass(acspec.BasicModel, CustomModel)
def test_should_raise_on_invalid_model_name( self, invalid_model_name_specs ): with pytest.raises(ValueError) as excinfo: Acspec( invalid_model_name_specs, on_invalid_identifier="raise" ) assert str(excinfo.value) == "Invaliid identifier: $%&to-be-sanitized"
def test_should_raise_on_multiple_types(self, model_specs): model_specs['blog']['posts']['type']['simple'] = 'string' with pytest.raises( schematics.exceptions.ModelValidationError ) as excinfo: Acspec(model_specs) assert excinfo.value.messages == { 'type': {'dict': [ "Cannot have multiple types: list, simple" ]} }
def test_should_raise_on_multiple_types(self, blog_specs): # add dict, so it contains conflicting list and dict compound types blog_specs['blog']['posts']['dict'] = {'type': 'string'} with pytest.raises( schematics.exceptions.ModelConversionError ) as excinfo: Acspec(blog_specs) assert excinfo.value.messages == { 'field_descriptors': {'posts': [ 'Cannot have multiple types: dict, list' ]} }
def acspec(request): from acspec.base import Acspec return Acspec(blog_specs(request))
def test_should_skip_invalid_model_name(self, invalid_model_name_specs): acspec = Acspec(invalid_model_name_specs, on_invalid_identifier="skip") assert "to_be_sanitized" not in acspec._raw_specs
def test_should_allow_to_override_the_implicit_model_name( self, model_specs ): model_specs['post'][':name'] = "SuperPostModel" acspec = Acspec(model_specs) assert issubclass(acspec.SuperPostModel, BaseModel)
def test_should_use_dont_serialize_when_none_class(self, model_specs): model_specs['blog'][':bases'] = ["dont_serialize_when_none"] acspec = Acspec(model_specs) assert issubclass(acspec.BlogModel, DontSerializeWhenNoneModel)
def acspec(request): from acspec.base import Acspec return Acspec(model_specs(request))