lib: add @patch decorator to config for unittests

This commit is contained in:
Jens Langhammer 2020-11-16 12:48:53 +01:00
parent 5faafbbca6
commit 8cc063ded2
2 changed files with 19 additions and 10 deletions

View file

@ -34,7 +34,6 @@ class ConfigLoader:
loaded_file = []
__config = {}
__sub_dicts = []
def __init__(self):
super().__init__()
@ -129,12 +128,12 @@ class ConfigLoader:
self.update(self.__config, outer)
@contextmanager
# pylint: disable=invalid-name
def cd(self, sub: str):
"""Contextmanager that descends into sub-dict. Can be chained."""
self.__sub_dicts.append(sub)
def patch(self, path: str, value: Any):
"""Context manager for unittests to patch a value"""
original_value = self.y(path)
self.y_set(path, value)
yield
self.__sub_dicts.pop()
self.y_set(path, original_value)
@property
def raw(self) -> dict:
@ -146,8 +145,6 @@ class ConfigLoader:
"""Access attribute by using yaml path"""
# Walk sub_dicts before parsing path
root = self.raw
for sub in self.__sub_dicts:
root = root.get(sub, None)
# Walk each component of the path
for comp in path.split(sep):
if root and comp in root:
@ -156,6 +153,18 @@ class ConfigLoader:
return default
return root
def y_set(self, path: str, value: Any, sep="."):
"""Set value using same syntax as y()"""
# Walk sub_dicts before parsing path
root = self.raw
# Walk each component of the path
path_parts = path.split(sep)
for comp in path_parts[:-1]:
if comp not in root:
root[comp] = {}
root = root.get(comp)
root[path_parts[-1]] = value
def y_bool(self, path: str, default=False) -> bool:
"""Wrapper for y that converts value into boolean"""
return str(self.y(path, default)).lower() == "true"

View file

@ -1,13 +1,13 @@
"""outpost tests"""
from os import environ
from unittest.case import skipUnless
from unittest.mock import patch
from django.test import TestCase
from guardian.models import UserObjectPermission
from passbook.crypto.models import CertificateKeyPair
from passbook.flows.models import Flow
from passbook.lib.config import CONFIG
from passbook.outposts.controllers.k8s.base import NeedsUpdate
from passbook.outposts.controllers.k8s.deployment import DeploymentReconciler
from passbook.outposts.controllers.kubernetes import KubernetesController
@ -104,7 +104,7 @@ class OutpostKubernetesTests(TestCase):
deployment_reconciler.get_reference_object(),
)
with patch.object(deployment_reconciler, "image_base", "test"):
with CONFIG.patch("outposts.docker_image_base", "test"):
with self.assertRaises(NeedsUpdate):
deployment_reconciler.reconcile(
deployment_reconciler.retrieve(),