def test_uses_first_schema_that_returns_true_for_condition_that_uses_data():
    class BaseMetadataSchema(Schema):
        metadata = fields.Method("get_metadata")

    class Schema1(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field1": data["metadata"]["field1"]}

    class Schema2(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field2": data["metadata"]["field2"]}

    class Schema3(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field3": data["metadata"]["field3"]}

    data = {
        "field1": "value1",
        "field2": "value2",
        "field3": "value3",
        "types": [2, 3]
    }
    serializer = ConditionalMultiSchemaJSONSerializer([
        (lambda data: 1 in data["metadata"]["types"], Schema1),
        (lambda data: 2 in data["metadata"]["types"], Schema2),
        (lambda data: 3 in data["metadata"]["types"], Schema3),
    ])
    serialized = json.loads(
        serializer.serialize(
            PersistentIdentifier(pid_type="recid", pid_value="1"),
            InspireRecord(data)))

    assert serialized["metadata"] == {"field2": "value2"}
def test_first_conditionless_schema_if_others_do_not_return_true():
    class BaseMetadataSchema(Schema):
        metadata = fields.Method("get_metadata")

    class Schema1(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field1": data["metadata"]["field1"]}

    class Schema2(BaseMetadataSchema):
        def get_metadata(self, data):
            return {"field2": data["metadata"]["field2"]}

    data = {"field1": "value1", "field2": "value2"}
    serializer = ConditionalMultiSchemaJSONSerializer([(lambda _: False,
                                                        Schema1),
                                                       (None, Schema2)])
    serialized = json.loads(
        serializer.serialize(
            PersistentIdentifier(pid_type="recid", pid_value="1"),
            InspireRecord(data)))

    assert serialized["metadata"] == {"field2": "value2"}