From 0cfc55c1751458fea97e907034b79288a470bfed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Wed, 21 Aug 2019 08:23:20 +0200 Subject: [PATCH] Helper function to compare nested structures in tests. --- spec/test/features/steps/comparedict.py | 38 +++++++++++++++++++++++++ spec/test/features/steps/steps.py | 1 + 2 files changed, 39 insertions(+) create mode 100644 spec/test/features/steps/comparedict.py diff --git a/spec/test/features/steps/comparedict.py b/spec/test/features/steps/comparedict.py new file mode 100644 index 0000000..7b5f968 --- /dev/null +++ b/spec/test/features/steps/comparedict.py @@ -0,0 +1,38 @@ +from functools import singledispatch + + +def assert_same_type(f): + def wrapper(a, b): + if type(a) != type(b): + raise TypeError("Non-matching types") + return f(a, b) + return wrapper + + +@singledispatch +@assert_same_type +def is_subset(model, obj): + return model == obj + + +@is_subset.register(dict) +@assert_same_type +def _(model, obj): + for key, value in model.items(): + if key not in obj or not is_subset(value, obj[key]): + return False + return True + + +@is_subset.register(list) +@assert_same_type +def _(model, obj): + if type(model) != type(obj): + raise TypeError("Non-matching types") + return is_subset(set(model), set(obj)) + + +@is_subset.register(set) +@assert_same_type +def _(model, obj): + return model <= obj diff --git a/spec/test/features/steps/steps.py b/spec/test/features/steps/steps.py index f2247c3..16edd2d 100644 --- a/spec/test/features/steps/steps.py +++ b/spec/test/features/steps/steps.py @@ -7,6 +7,7 @@ import subprocess import requests from environconfig import EnvironConfig, StringVar, IntVar, BooleanVar +from comparedict import is_subset import logging