kojiromike commented on a change in pull request #979:
URL: https://github.com/apache/avro/pull/979#discussion_r526946672



##########
File path: lang/py/avro/test/test_compatibility.py
##########
@@ -0,0 +1,665 @@
+import json
+
+from avro.compatibility import ReaderWriterCompatibilityChecker, 
SchemaCompatibilityType, SchemaType
+from avro.schema import ArraySchema, MapSchema, Names, PrimitiveSchema, 
Schema, UnionSchema, parse
+
+#  
================================================================================================
+#            These tests are more or less directly lifted from the java avro 
codebase
+#            There's one test per Java file, so expect the first one to be a 
mammoth
+#  
================================================================================================
+BOOLEAN_SCHEMA = PrimitiveSchema(SchemaType.BOOLEAN)
+NULL_SCHEMA = PrimitiveSchema(SchemaType.NULL)
+INT_SCHEMA = PrimitiveSchema(SchemaType.INT)
+LONG_SCHEMA = PrimitiveSchema(SchemaType.LONG)
+STRING_SCHEMA = PrimitiveSchema(SchemaType.STRING)
+BYTES_SCHEMA = PrimitiveSchema(SchemaType.BYTES)
+FLOAT_SCHEMA = PrimitiveSchema(SchemaType.FLOAT)
+DOUBLE_SCHEMA = PrimitiveSchema(SchemaType.DOUBLE)
+INT_ARRAY_SCHEMA = ArraySchema(SchemaType.INT, names=Names())
+LONG_ARRAY_SCHEMA = ArraySchema(SchemaType.LONG, names=Names())
+STRING_ARRAY_SCHEMA = ArraySchema(SchemaType.STRING, names=Names())
+INT_MAP_SCHEMA = MapSchema(SchemaType.INT, names=Names())
+LONG_MAP_SCHEMA = MapSchema(SchemaType.LONG, names=Names())
+STRING_MAP_SCHEMA = MapSchema(SchemaType.STRING, names=Names())
+ENUM1_AB_SCHEMA = parse(json.dumps({"type": SchemaType.ENUM, "name": "Enum1", 
"symbols": ["A", "B"]}))
+ENUM1_ABC_SCHEMA = parse(json.dumps({"type": SchemaType.ENUM, "name": "Enum1", 
"symbols": ["A", "B", "C"]}))
+ENUM1_BC_SCHEMA = parse(json.dumps({"type": SchemaType.ENUM, "name": "Enum1", 
"symbols": ["B", "C"]}))
+ENUM2_AB_SCHEMA = parse(json.dumps({"type": SchemaType.ENUM, "name": "Enum2", 
"symbols": ["A", "B"]}))
+ENUM_ABC_ENUM_DEFAULT_A_SCHEMA = parse(
+    json.dumps({
+        "type": "enum",
+        "name": "Enum",
+        "symbols": ["A", "B", "C"],
+        "default": "A"
+    })
+)
+ENUM_AB_ENUM_DEFAULT_A_SCHEMA = parse(json.dumps({"type": SchemaType.ENUM, 
"name": "Enum", "symbols": ["A", "B"], "default": "A"}))
+ENUM_ABC_ENUM_DEFAULT_A_RECORD = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record",
+        "fields": [{
+            "name": "Field",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum",
+                "symbols": ["A", "B", "C"],
+                "default": "A"
+            }
+        }]
+    })
+)
+ENUM_AB_ENUM_DEFAULT_A_RECORD = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record",
+        "fields": [{
+            "name": "Field",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum",
+                "symbols": ["A", "B"],
+                "default": "A"
+            }
+        }]
+    })
+)
+ENUM_ABC_FIELD_DEFAULT_B_ENUM_DEFAULT_A_RECORD = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record",
+        "fields": [{
+            "name": "Field",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum",
+                "symbols": ["A", "B", "C"],
+                "default": "A"
+            },
+            "default": "B"
+        }]
+    })
+)
+ENUM_AB_FIELD_DEFAULT_A_ENUM_DEFAULT_B_RECORD = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record",
+        "fields": [{
+            "name": "Field",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum",
+                "symbols": ["A", "B"],
+                "default": "B"
+            },
+            "default": "A"
+        }]
+    })
+)
+EMPTY_UNION_SCHEMA = UnionSchema([], names=Names())
+NULL_UNION_SCHEMA = UnionSchema([SchemaType.NULL], names=Names())
+INT_UNION_SCHEMA = UnionSchema([SchemaType.INT], names=Names())
+LONG_UNION_SCHEMA = UnionSchema([SchemaType.LONG], names=Names())
+FLOAT_UNION_SCHEMA = UnionSchema([SchemaType.FLOAT], names=Names())
+DOUBLE_UNION_SCHEMA = UnionSchema([SchemaType.DOUBLE], names=Names())
+STRING_UNION_SCHEMA = UnionSchema([SchemaType.STRING], names=Names())
+BYTES_UNION_SCHEMA = UnionSchema([SchemaType.BYTES], names=Names())
+INT_STRING_UNION_SCHEMA = UnionSchema([SchemaType.INT, SchemaType.STRING], 
names=Names())
+STRING_INT_UNION_SCHEMA = UnionSchema([SchemaType.STRING, SchemaType.INT], 
names=Names())
+INT_FLOAT_UNION_SCHEMA = UnionSchema([SchemaType.INT, SchemaType.FLOAT], 
names=Names())
+INT_LONG_UNION_SCHEMA = UnionSchema([SchemaType.INT, SchemaType.LONG], 
names=Names())
+INT_LONG_FLOAT_DOUBLE_UNION_SCHEMA = UnionSchema([SchemaType.INT, 
SchemaType.LONG, SchemaType.FLOAT, SchemaType.DOUBLE], names=Names())
+NULL_INT_ARRAY_UNION_SCHEMA = UnionSchema([{"type": SchemaType.NULL}, {"type": 
SchemaType.ARRAY, "items": SchemaType.INT}], names=Names())
+NULL_INT_MAP_UNION_SCHEMA = UnionSchema([{"type": SchemaType.NULL}, {"type": 
SchemaType.MAP, "values": SchemaType.INT}], names=Names())
+EMPTY_RECORD1 = parse(json.dumps({"type": SchemaType.RECORD, "name": 
"Record1", "fields": []}))
+EMPTY_RECORD2 = parse(json.dumps({"type": SchemaType.RECORD, "name": 
"Record2", "fields": []}))
+A_INT_RECORD1 = parse(json.dumps({"type": SchemaType.RECORD, "name": 
"Record1", "fields": [{"name": "a", "type": SchemaType.INT}]}))
+A_LONG_RECORD1 = parse(json.dumps({"type": SchemaType.RECORD, "name": 
"Record1", "fields": [{"name": "a", "type": SchemaType.LONG}]}))
+A_INT_B_INT_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT
+        }, {
+            "name": "b",
+            "type": SchemaType.INT
+        }]
+    })
+)
+A_DINT_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }]
+    })
+)
+A_INT_B_DINT_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT
+        }, {
+            "name": "b",
+            "type": SchemaType.INT,
+            "default": 0
+        }]
+    })
+)
+A_DINT_B_DINT_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": SchemaType.INT,
+            "default": 0
+        }]
+    })
+)
+A_DINT_B_DFIXED_4_BYTES_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": {
+                "type": SchemaType.FIXED,
+                "name": "Fixed",
+                "size": 4
+            }
+        }]
+    })
+)
+A_DINT_B_DFIXED_8_BYTES_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": {
+                "type": SchemaType.FIXED,
+                "name": "Fixed",
+                "size": 8
+            }
+        }]
+    })
+)
+A_DINT_B_DINT_STRING_UNION_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": [SchemaType.INT, SchemaType.STRING],
+            "default": 0
+        }]
+    })
+)
+A_DINT_B_DINT_UNION_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": [SchemaType.INT],
+            "default": 0
+        }]
+    })
+)
+A_DINT_B_DENUM_1_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum1",
+                "symbols": ["A", "B"]
+            }
+        }]
+    })
+)
+A_DINT_B_DENUM_2_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "a",
+            "type": SchemaType.INT,
+            "default": 0
+        }, {
+            "name": "b",
+            "type": {
+                "type": SchemaType.ENUM,
+                "name": "Enum2",
+                "symbols": ["A", "B"]
+            }
+        }]
+    })
+)
+FIXED_4_BYTES = parse(json.dumps({"type": SchemaType.FIXED, "name": "Fixed", 
"size": 4}))
+FIXED_8_BYTES = parse(json.dumps({"type": SchemaType.FIXED, "name": "Fixed", 
"size": 8}))
+NS_RECORD1 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "f1",
+            "type": [
+                SchemaType.NULL, {
+                    "type": SchemaType.ARRAY,
+                    "items": {
+                        "type": SchemaType.RECORD,
+                        "name": "InnerRecord1",
+                        "namespace": "ns1",
+                        "fields": [{
+                            "name": "a",
+                            "type": SchemaType.INT
+                        }]
+                    }
+                }
+            ]
+        }]
+    })
+)
+NS_RECORD2 = parse(
+    json.dumps({
+        "type": SchemaType.RECORD,
+        "name": "Record1",
+        "fields": [{
+            "name": "f1",
+            "type": [
+                SchemaType.NULL, {
+                    "type": SchemaType.ARRAY,
+                    "items": {
+                        "type": SchemaType.RECORD,
+                        "name": "InnerRecord1",
+                        "namespace": "ns2",
+                        "fields": [{
+                            "name": "a",
+                            "type": SchemaType.INT
+                        }]
+                    }
+                }
+            ]
+        }]
+    })
+)
+
+UNION_INT_RECORD1 = UnionSchema([{"type": SchemaType.INT}, {"type": 
SchemaType.RECORD, "name": "Record1", "fields": [{"name": "field1", "type": 
SchemaType.INT}]}])
+UNION_INT_RECORD2 = UnionSchema([{"type": SchemaType.INT}, {"type": "record", 
"name": "Record2", "fields": [{"name": "field1", "type": SchemaType.INT}]}])
+UNION_INT_ENUM1_AB = UnionSchema([{"type": SchemaType.INT}, 
ENUM1_AB_SCHEMA.to_json()])
+UNION_INT_FIXED_4_BYTES = UnionSchema([{"type": SchemaType.INT}, 
FIXED_4_BYTES.to_json()])
+UNION_INT_BOOLEAN = UnionSchema([{"type": SchemaType.INT}, {"type": 
SchemaType.BOOLEAN}])
+UNION_INT_ARRAY_INT = UnionSchema([{"type": SchemaType.INT}, 
INT_ARRAY_SCHEMA.to_json()])
+UNION_INT_MAP_INT = UnionSchema([{"type": SchemaType.INT}, 
INT_MAP_SCHEMA.to_json()])
+UNION_INT_NULL = UnionSchema([{"type": SchemaType.INT}, {"type": 
SchemaType.NULL}])
+FIXED_4_ANOTHER_NAME = parse(json.dumps({"type": SchemaType.FIXED, "name": 
"AnotherName", "size": 4}))

Review comment:
       These are beautifully easy-to-read tests!




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to