def test_it_raises_when_type_is_invalid(self): def schema(): required('metadata', type='unknown') document = {'metadata': {}} with pytest.raises(SchemaError): validate(schema, document)
def test_it_raises_when_required_field_is_already_optional(self): def schema(): optional('accommodation', type='object') required('accommodation', type='object') document = {'accommodation': {}} with pytest.raises(SchemaError): validate(schema, document)
def test_it_raises_when_list_is_required_and_elements_are_optional(self): def schema(): required('scores', type='list') optional('scores[]') document = {'scores': []} with pytest.raises(SchemaError): validate(schema, document)
def test_it_raises_when_optional_field_is_already_required(self): def schema(): required('metadata', type='object') optional('metadata', type='object') document = {'metadata': {}} with pytest.raises(SchemaError): validate(schema, document)
def test_it_raises_schemaerror_when_schema_raises(self): def schema(): raise RuntimeError() document = {} with pytest.raises(SchemaError) as exception_info: validate(schema, document) assert type(exception_info.value.__cause__) == RuntimeError
def test_it_doesnt_wrap_schemaerror(self): def schema(): def validator(field, name): raise RuntimeError() optional('accommodation', type='custom', validator=validator) document = {'accommodation': {}} with pytest.raises(SchemaError) as exception_info: validate(schema, document) assert type(exception_info.value.__cause__) == RuntimeError
def test_it_rejects_invalid_objects_in_a_list(self): def schema(): required('accommodation.ratings[].score', type='number', max=5) document = { 'accommodation': { 'ratings': [{ 'score': 3 }, { 'score': 'excellent' }, { 'score': 6 }] } } messages = validate(schema, document) assert len(messages) == 2 message = messages[0] assert message.type == 'invalid_type' assert message.field == 'accommodation.ratings[1].score' assert message.expected == 'number' message = messages[1] assert message.type == 'number_too_large' assert message.field == 'accommodation.ratings[2].score' assert message.expected == 5
def test_it_accepts_an_optional_object_with_the_correct_type(self): def schema(): optional('trace', type='object') document = {'trace': {}} messages = validate(schema, document) assert messages == []
def test_it_reports_an_extra_top_level_field(self): document = {'metadata': True} messages = validate(empty_schema, document) assert len(messages) == 1 message = messages[0] assert message.type == 'extra_field' assert message.field == 'metadata'
def test_it_accepts_a_list_of_objects_inside_a_list_objects(self): def schema(): required('rooms[].facilities[].type') document = {'rooms': [{'facilities': [{'type': 'pool'}]}]} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_list_of_scalars_inside_a_list_of_objects(self): def schema(): required('facilities[].subtype[]', type='string') document = {'facilities': [{'subtype': ['indoor']}]} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_value_with_bool_type(self): def schema(): required('has_bathroom', type='bool') document = {'has_bathroom': False} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_required_top_level_field(self): def schema(): required('metadata') document = {'metadata': True} messages = validate(schema, document) assert messages == []
def test_it_accepts_valid_objects_in_a_list(self): def schema(): required('accommodation.ratings[].aspect', type='string') document = {'accommodation': {'ratings': [{'aspect': 'cleanliness'}]}} messages = validate(schema, document) assert messages == []
def test_it_accepts_list_of_valid_scalars(self): def schema(): required('scores[]', type='number') document = {'scores': [1, 2, 3]} messages = validate(schema, document) assert messages == []
def test_it_accepts_value_with_list_type(self): def schema(): required('rooms', type='list') document = {'rooms': []} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_value_with_int_type(self): def schema(): required('stars', type='int', min=0, max=5) document = {'stars': 4} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_parameterless_schema(self): def schema(): pass document = {} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_present_optional_top_level_field(self): def schema(): optional('trace') document = {'trace': True} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_value_with_string_type(self): def schema(): required('unit', type='string', options=['sqm', 'sqft']) document = {'unit': 'sqft'} messages = validate(schema, document) assert messages == []
def test_it_rejects_multiple_objects_with_missing_fields_in_a_list(self): def schema(): required('accommodation.ratings[].score', type='number') document = {'accommodation': {'ratings': [{}, {}]}} messages = validate(schema, document) assert len(messages) == 2
def test_it_accepts_a_nested_list_of_scalars(self): def schema(): required('matrix[][]', 'number') document = {'matrix': [[1, 2, 3], [4, 5, 6]]} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_required_object_with_the_correct_type(self): def schema(): required('accommodation', type='object') document = {'accommodation': {}} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_nested_required_field(self): def schema(): required('accommodation.geo.latitude') document = {'accommodation': {'geo': {'latitude': '12.5345'}}} messages = validate(schema, document) assert messages == []
def test_it_ignores_an_extra_top_level_field(self): def schema(): ignore_extra_fields() document = {'trace': True} messages = validate(schema, document) assert messages == []
def test_it_accepts_a_missing_required_field_if_its_parent_is_missing( self): def schema(): required('accommodation.name') document = {} messages = validate(schema, document) assert messages == []
def test_it_makes_ignore_extra_fields_available_to_schema_outside_of_validator_instance( self): def schema(): ignore_extra_fields() document = {'metadata': {}} messages = validate(schema, document) assert messages == []
def test_it_reports_a_missing_required_field(self): def schema(): required('accommodation.name') document = {'accommodation': {}} messages = validate(schema, document) assert len(messages) == 1 message = messages[0] assert message.type == 'missing_field' assert message.field == 'accommodation.name'
def test_it_rejects_object_with_missing_fields_in_a_list(self): def schema(): required('accommodation.ratings[].score', type='number') document = {'accommodation': {'ratings': [{}]}} messages = validate(schema, document) assert len(messages) == 1 message = messages[0] assert message.type == 'missing_field' assert message.field == 'accommodation.ratings[0].score'
def test_it_reports_an_extra_nested_field(self): def schema(): optional('accommodation') document = {'accommodation': {'name': 'Hotel'}} messages = validate(schema, document) assert len(messages) == 1 message = messages[0] assert message.type == 'extra_field' assert message.field == 'accommodation.name'