From 3c2aa9f9301ee5c2d113321a9bf7b65a75ec18cc Mon Sep 17 00:00:00 2001 From: Dariusz Kedzierski <dkedzierski@syncad.com> Date: Wed, 5 Aug 2020 13:56:50 +0200 Subject: [PATCH] Added possibility to ignore given fields in json - Response validator can now ignore specified fields in json response when comparing with patters - Example in get_profile in bridge_api --- .../tavern/test_bridge_api_patterns.tavern.yaml | 1 + hivemind/tavern/validate_response.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hivemind/tavern/test_bridge_api_patterns.tavern.yaml b/hivemind/tavern/test_bridge_api_patterns.tavern.yaml index 8d737fd4..23534eaa 100644 --- a/hivemind/tavern/test_bridge_api_patterns.tavern.yaml +++ b/hivemind/tavern/test_bridge_api_patterns.tavern.yaml @@ -179,6 +179,7 @@ extra_kwargs: method: "get_profile" directory: "bridge_api_patterns" + ignore_tags: ["id"] --- test_name: Hivemind bridge_api.get_trending_topics patterns test diff --git a/hivemind/tavern/validate_response.py b/hivemind/tavern/validate_response.py index 4c69f965..ccae0f67 100644 --- a/hivemind/tavern/validate_response.py +++ b/hivemind/tavern/validate_response.py @@ -32,7 +32,14 @@ def load_pattern(name): ret = load(f) return ret -def compare_response_with_pattern(response, method=None, directory=None): +def remove_tag(data, tags_to_remove): + if not isinstance(data, (dict, list)): + return data + if isinstance(data, list): + return [remove_tag(v, tags_to_remove) for v in data] + return {k: remove_tag(v, tags_to_remove) for k, v in data.items() if k not in tags_to_remove} + +def compare_response_with_pattern(response, method=None, directory=None, ignore_tags=None): """ This method will compare response with pattern file """ import os fname = directory + "/" + method + DIFF_FILE_EXT @@ -43,6 +50,9 @@ def compare_response_with_pattern(response, method=None, directory=None): os.remove(response_fname) response_json = response.json() + if ignore_tags is not None: + assert isinstance(ignore_tags, list), "ingore_tags should be list of tags" + response_json = remove_tag(response_json, ignore_tags) error = response_json.get("error", None) result = response_json.get("result", None) if error is not None: @@ -56,6 +66,8 @@ def compare_response_with_pattern(response, method=None, directory=None): import jsondiff pattern = load_pattern(directory + "/" + method + PATTERN_FILE_EXT) + if ignore_tags is not None: + pattern = remove_tag(pattern, ignore_tags) pattern_resp_diff = jsondiff.diff(pattern, result) if pattern_resp_diff: save_diff(fname, pattern_resp_diff) -- GitLab