From 11b1841f62397d5d2b66100f768f7da96b039137 Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Thu, 16 Jan 2020 11:27:49 +0100
Subject: [PATCH] refactor how schema defs are written

---
 test/test_classifier_routes.py | 418 +++++++++++++++++----------------
 1 file changed, 212 insertions(+), 206 deletions(-)

diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py
index 7723dfab..c0c92c13 100644
--- a/test/test_classifier_routes.py
+++ b/test/test_classifier_routes.py
@@ -8,129 +8,139 @@ DEFAULT_REQUEST_HEADERS = {
     "Accept": ["application/json"]
 }
 
-LOCATION_END_DEFINITION = {
-    "type": "object",
-    "properties": {
-        "equipment": {"type": "string"},
-        "name": {"type": "string"},
-        "abbreviation": {"type": "string"}
+LOCATIONS_DEFINITIONS = {
+    "location-endpoint": {
+        "type": "object",
+        "properties": {
+            "equipment": {"type": "string"},
+            "name": {"type": "string"},
+            "abbreviation": {"type": "string"}
+        },
+        "required": ["equipment", "name", "abbreviation"],
+        "additionalProperties": False
     },
-    "required": ["equipment", "name", "abbreviation"],
-    "additionalProperties": False
+    "location": {
+        "type": "object",
+        "properties": {
+            "a": {"$ref": "#/definitions/location-endpoint"},
+            "b": {"$ref": "#/definitions/location-endpoint"}
+        },
+        "required": ["a"],
+        "additionalProperties": False
+    },
+    "locations-list": {
+        "type": "array",
+        "items": {"$ref": "#/definitions/location"}
+    }
 }
-LOCATION_DEFINITION = {
-    "type": "object",
-    "properties": {
-        "a": LOCATION_END_DEFINITION,
-        "b": LOCATION_END_DEFINITION
+
+JUNIPER_LINK_METADATA_DEFINITIONS = {
+    "ip-address": {
+        "type": "string",
+        "oneOf": [
+            {"pattern": r'^(\d+\.){3}\d+$'},
+            {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'}
+        ]
     },
-    "required": ["a"],
-    "additionalProperties": False
+    "ipv4-interface-address": {
+        "type": "string",
+        "pattern": r'^(\d+\.){3}\d+/\d+$'
+    },
+    "ipv6-interface-address": {
+        "type": "string",
+        "pattern": r'^[a-f\d:]+/\d+$'
+    },
+    "interface-info": {
+        "type": "object",
+        "properties": {
+            "name": {"type": "string"},
+            "description": {"type": "string"},
+            "ipv4": {
+                "type": "array",
+                "items": {"$ref": "#/definitions/ipv4-interface-address"}
+            },
+            "ipv6": {
+                "type": "array",
+                "items": {"$ref": "#/definitions/ipv6-interface-address"}
+            },
+
+            # TODO: check what's changed: added to make tests pass
+            'bundle': {"type": "array"}
+        },
+        "required": ["name", "description", "ipv4", "ipv6"],
+        "additionalProperties": False
+    },
+    "service-info": {
+        "type": "object",
+        "properties": {
+            "id": {"type": "integer"},
+            "name": {"type": "string"},
+            "status": {
+                "type": "string",
+                "enum": ["operational", "installed", "planned", "ordered"]
+            },
+            "circuit_type": {
+                "type": "string",
+                "enum": ["path", "service", "l2circuit"]
+            },
+            "service_type": {"type": "string"},
+            "project": {"type": "string"},
+            "equipment": {"type": "string"},
+            "pop": {"type": "string"},
+            "pop_abbreviation": {"type": "string"},
+
+            "other_end_pop": {"type": "string"},
+            "other_end_pop_abbreviation": {"type": "string"},
+            "other_end_equipment": {"type": "string"},
+            "port": {"type": "string"},
+            "other_end_port": {"type": "string"},
+            "logical_unit": {
+                "oneOf": [
+                    {"type": "integer"},
+                    {"type": "string", "maxLength": 0}
+                ]
+            },
+            "other_end_logical_unit": {
+                "oneOf": [
+                    {"type": "integer"},
+                    {"type": "string", "maxLength": 0}
+                ]
+            },
+            "manufacturer": {
+                "type": "string",
+                "enum": ["juniper", "coriant", "infinera",
+                         "cisco", "hewlett packard",
+                         "corsa", "graham smith uk ltd",
+                         "unknown", ""]
+            },
+            "card_id": {"type": "string"},
+            "other_end_card_id": {"type": "string"},
+            "interface_name": {"type": "string"},
+            "other_end_interface_name": {"type": "string"},
+
+            # TODO: check what's changed: added to make tests pass
+            'other_end_pop_name': {"type": "string"},
+            'pop_name': {"type": "string"}
+        },
+        # TODO: modify service-info so that "" entries are just omitted
+        #       (... rather than requiring 'oneOf')
+        # TODO: put 'other_end_*' params in a sub dictionary
+        # "required": [
+        #     "id", "name", "status",
+        #     "circuit_type", "service_type",
+        #     "project", "port", "manufacturer",
+        #     "equipment", "logical_unit", "card_id", "interface_name"
+        # ],
+        "additionalProperties": False
+    }
 }
+
 JUNIPER_LINK_METADATA = {
     "$schema": "http://json-schema.org/draft-07/schema#",
     "type": "object",
 
     "definitions": {
-        "location": LOCATION_DEFINITION,
-        "ip-address": {
-            "type": "string",
-            "oneOf": [
-                {"pattern": r'^(\d+\.){3}\d+$'},
-                {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'}
-            ]
-        },
-        "ipv4-interface-address": {
-            "type": "string",
-            "pattern": r'^(\d+\.){3}\d+/\d+$'
-        },
-        "ipv6-interface-address": {
-            "type": "string",
-            "pattern": r'^[a-f\d:]+/\d+$'
-        },
-        "interface-info": {
-            "type": "object",
-            "properties": {
-                "name": {"type": "string"},
-                "description": {"type": "string"},
-                "ipv4": {
-                    "type": "array",
-                    "items": {"$ref": "#/definitions/ipv4-interface-address"}
-                },
-                "ipv6": {
-                    "type": "array",
-                    "items": {"$ref": "#/definitions/ipv6-interface-address"}
-                },
-
-                # TODO: check what's changed: added to make tests pass
-                'bundle': {"type": "array"}
-            },
-            "required": ["name", "description", "ipv4", "ipv6"],
-            "additionalProperties": False
-        },
-        "service-info": {
-            "type": "object",
-            "properties": {
-                "id": {"type": "integer"},
-                "name": {"type": "string"},
-                "status": {
-                    "type": "string",
-                    "enum": ["operational", "installed", "planned", "ordered"]
-                },
-                "circuit_type": {
-                    "type": "string",
-                    "enum": ["path", "service", "l2circuit"]
-                },
-                "service_type": {"type": "string"},
-                "project": {"type": "string"},
-                "equipment": {"type": "string"},
-                "pop": {"type": "string"},
-                "pop_abbreviation": {"type": "string"},
-
-                "other_end_pop": {"type": "string"},
-                "other_end_pop_abbreviation": {"type": "string"},
-                "other_end_equipment": {"type": "string"},
-                "port": {"type": "string"},
-                "other_end_port": {"type": "string"},
-                "logical_unit": {
-                    "oneOf": [
-                        {"type": "integer"},
-                        {"type": "string", "maxLength": 0}
-                    ]
-                },
-                "other_end_logical_unit": {
-                    "oneOf": [
-                        {"type": "integer"},
-                        {"type": "string", "maxLength": 0}
-                    ]
-                },
-                "manufacturer": {
-                    "type": "string",
-                    "enum": ["juniper", "coriant", "infinera",
-                             "cisco", "hewlett packard",
-                             "corsa", "graham smith uk ltd",
-                             "unknown", ""]
-                },
-                "card_id": {"type": "string"},
-                "other_end_card_id": {"type": "string"},
-                "interface_name": {"type": "string"},
-                "other_end_interface_name": {"type": "string"},
-
-                # TODO: check what's changed: added to make tests pass
-                'other_end_pop_name': {"type": "string"},
-                'pop_name': {"type": "string"}
-            },
-            # TODO: modify service-info so that "" entries are just omitted
-            #       (... rather than requiring 'oneOf')
-            # TODO: put 'other_end_*' params in a sub dictionary
-            # "required": [
-            #     "id", "name", "status",
-            #     "circuit_type", "service_type",
-            #     "project", "port", "manufacturer",
-            #     "equipment", "logical_unit", "card_id", "interface_name"
-            # ],
-            "additionalProperties": False
-        }
+        **JUNIPER_LINK_METADATA_DEFINITIONS, **LOCATIONS_DEFINITIONS
     },
 
     "type": "object",
@@ -144,10 +154,7 @@ JUNIPER_LINK_METADATA = {
             "type": "array",
             "items": {"$ref": "#/definitions/service-info"}
         },
-        "locations": {
-            "type": "array",
-            "items": {"$ref": "#/definitions/location"}
-        }
+        "locations": {"$ref": "#/definitions/locations-list"}
     },
     # "required": ["interface"],
     "additionalProperties": False
@@ -203,96 +210,98 @@ IX_PUBLIC_PEER_INFO_KEYS = {'ix-public-peer-info', 'interfaces', 'locations'}
 )
 def test_peer_info(
         client, peer_address, expected_response_keys):
-    response_schema = {
-        "$schema": "http://json-schema.org/draft-07/schema#",
-        "type": "object",
-
-        "definitions": {
-            "location": LOCATION_DEFINITION,
-            "ip-address": {
-                "type": "string",
-                "oneOf": [
-                    {"pattern": r'^(\d+\.){3}\d+$'},
-                    {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'}
-                ]
-            },
-            "interface-address": {
-                "type": "string",
-                "oneOf": [
-                    {"pattern": r'^(\d+\.){3}\d+/\d+$'},
-                    {"pattern": r'^[a-f\d:]+/\d+$'}
-                ]
-            },
-            "vpn-rr-peer": {
-                "type": "object",
-                "properties": {
-                    "name": {"$ref": "#/definitions/ip-address"},
-                    "description": {"type": "string"},
-                    "peer-as": {"type": "integer"},
-                    "router": {"type": "string"}
-                },
-                "required": ["name", "description"],
-                "additionalProperties": False
-            },
-            "ix-public-peer": {
-                "type": "object",
-                "properties": {
-                    "name": {"$ref": "#/definitions/ip-address"},
-                    "description": {"type": "string"},
-                    "router": {"type": "string"},
-                    "as": {
-                        "type": "object",
-                        "properties": {
-                            "local": {"type": "integer"},
-                            "peer": {"type": "integer"},
-                        },
-                        "required": ["local", "peer"],
-                        "additionalProperties": False
-                    }
-                },
-                "required": ["name", "description", "as"],
-                "additionalProperties": False
-            },
-            "ix-public-peer-list": {
-                "type": "array",
-                "items": {"$ref": "#/definitions/ip-address"}
+    response_schema_definitions = {
+        "ip-address": {
+            "type": "string",
+            "oneOf": [
+                {"pattern": r'^(\d+\.){3}\d+$'},
+                {"pattern": r'^([a-f\d]{4}:){7}[a-f\d]{4}$'}
+            ]
+        },
+        "interface-address": {
+            "type": "string",
+            "oneOf": [
+                {"pattern": r'^(\d+\.){3}\d+/\d+$'},
+                {"pattern": r'^[a-f\d:]+/\d+$'}
+            ]
+        },
+        "vpn-rr-peer": {
+            "type": "object",
+            "properties": {
+                "name": {"$ref": "#/definitions/ip-address"},
+                "description": {"type": "string"},
+                "peer-as": {"type": "integer"},
+                "router": {"type": "string"}
             },
-            "ix-public-peer-info": {
-                "type": "object",
-                "properties": {
-                    "peer": {"$ref": "#/definitions/ix-public-peer"},
-                    "group": {"$ref": "#/definitions/ix-public-peer-list"},
-                    "router": {"$ref": "#/definitions/ix-public-peer-list"}
-                },
-                "required": ["peer", "group", "router"],
-                "additionalProperties": False
+            "required": ["name", "description"],
+            "additionalProperties": False
+        },
+        "ix-public-peer": {
+            "type": "object",
+            "properties": {
+                "name": {"$ref": "#/definitions/ip-address"},
+                "description": {"type": "string"},
+                "router": {"type": "string"},
+                "as": {
+                    "type": "object",
+                    "properties": {
+                        "local": {"type": "integer"},
+                        "peer": {"type": "integer"},
+                    },
+                    "required": ["local", "peer"],
+                    "additionalProperties": False
+                }
             },
-            "interface-info": {
-                "type": "object",
-                "properties": {
-                    "name": {"$ref": "#/definitions/ip-address"},
-                    "interface address": {
-                        "$ref": "#/definitions/interface-address"},
-                    "interface name": {"type": "string"},
-                    "router": {"type": "string"}
-                },
-                "required": [
-                    "name", "interface address", "interface name", "router"],
-                "additionalProperties": False
+            "required": ["name", "description", "as"],
+            "additionalProperties": False
+        },
+        "ix-public-peer-list": {
+            "type": "array",
+            "items": {"$ref": "#/definitions/ip-address"}
+        },
+        "ix-public-peer-info": {
+            "type": "object",
+            "properties": {
+                "peer": {"$ref": "#/definitions/ix-public-peer"},
+                "group": {"$ref": "#/definitions/ix-public-peer-list"},
+                "router": {"$ref": "#/definitions/ix-public-peer-list"}
             },
-            "service-info": {
-                "type": "object"
+            "required": ["peer", "group", "router"],
+            "additionalProperties": False
+        },
+        "interface-info": {
+            "type": "object",
+            "properties": {
+                "name": {"$ref": "#/definitions/ip-address"},
+                "interface address": {
+                    "$ref": "#/definitions/interface-address"},
+                "interface name": {"type": "string"},
+                "router": {"type": "string"}
             },
-            "interface-lookup-info": {
-                "type": "object",
-                "properties": {
-                    "interface": {"$ref": "#/definitions/interface-info"},
-                    "services": {
-                        "type": "array",
-                        "items": {"$ref": "#/definitions/service-info"}
-                    }
+            "required": [
+                "name", "interface address", "interface name", "router"],
+            "additionalProperties": False
+        },
+        "service-info": {
+            "type": "object"
+        },
+        "interface-lookup-info": {
+            "type": "object",
+            "properties": {
+                "interface": {"$ref": "#/definitions/interface-info"},
+                "services": {
+                    "type": "array",
+                    "items": {"$ref": "#/definitions/service-info"}
                 }
             }
+        }
+    }
+    response_schema = {
+        "$schema": "http://json-schema.org/draft-07/schema#",
+        "type": "object",
+
+        "definitions": {
+            **response_schema_definitions, **LOCATIONS_DEFINITIONS
         },
 
         "type": "object",
@@ -304,10 +313,7 @@ def test_peer_info(
                 "type": "array",
                 "items": {"$ref": "#/definitions/interface-lookup-info"}
             },
-            "locations": {
-                "type": "array",
-                "items": {"$ref": "#/definitions/location"}
-            }
+            "locations": {"$ref": "#/definitions/locations-list"}
         },
         "additionalProperties": False
     }
-- 
GitLab