def test_merge_semantics(data, s1, s2): assume(canonicalish(s1) != FALSEY and canonicalish(s2) != FALSEY) combined = merged([s1, s2]) assume(combined is not None) assert combined == merged([s2, s1]) # union is commutative assume(combined != FALSEY) _merge_semantics_helper(data, s1, s2, combined)
def test_merge_should_notice_required_disallowed_properties(): # The required "name" property is banned by the additionalProperties: False # See https://github.com/Zac-HD/hypothesis-jsonschema/issues/30 for details. schemas = [ {"type": "object", "properties": {"name": True}, "required": ["name"]}, {"type": "object", "properties": {"id": True}, "additionalProperties": False}, ] assert merged(schemas) == FALSEY
def test_can_almost_always_merge_numeric_schemas(data, s1, s2): assume(canonicalish(s1) != FALSEY and canonicalish(s2) != FALSEY) combined = merged([s1, s2]) if combined is None: # The ONLY case in which we can't merge numeric schemas is when # they both contain multipleOf keys with distinct non-integer values. mul1, mul2 = s1["multipleOf"], s2["multipleOf"] assert isinstance(mul1, float) or isinstance(mul2, float) assert mul1 != mul2 elif combined != FALSEY: _merge_semantics_helper(data, s1, s2, combined)
def test_merge_semantics(data, s1, s2): assume(canonicalish(s1) != FALSEY and canonicalish(s2) != FALSEY) combined = merged([s1, s2]) assume(combined is not None) assume(combined != FALSEY) note(combined) ic = data.draw(from_schema(combined), label="combined") i1 = data.draw(from_schema(s1), label="s1") i2 = data.draw(from_schema(s2), label="s2") assert is_valid(ic, s1) and is_valid(ic, s2) assert is_valid(i1, s2) == is_valid(i1, combined) assert is_valid(i2, s1) == is_valid(i2, combined)
def test_merge_semantics_regressions(): # TODO: broken because of missing interaction between # properties and additionalProperties - merged should return None for this. s1 = { "properties": { "": { "type": "string" } }, "required": [""], "type": "object" } s2 = {"additionalProperties": {"type": "null"}, "type": "object"} instance = {"": ""} combined = merged([s1, s2]) assert is_valid(instance, combined) == (is_valid(instance, s1) and is_valid(instance, s2))
def test_self_merge_eq_canonicalish(schema): m = merged([schema, schema]) assert m == canonicalish(schema)
def test_unable_to_merge(group): assert merged(group) is None
def test_merged(group, result): assert merged(group) == result