Module: check_mk
Branch: master
Commit: cdbbec9d85ea62f0d0a27504817ad29db07e3d55
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=cdbbec9d85ea62…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Tue Jun 26 11:34:26 2018 +0200
Add MockHostExtraConf object to checktestlib.py
and apply in test_df_checks.py
Change-Id: I8749a85648ce724b9f31b62b8eaf71a816f35b51
---
tests/unit/checks/checktestlib.py | 53 ++++++++++++++++++++++++++++++++++++++
tests/unit/checks/test_df_check.py | 23 ++++++++++-------
2 files changed, 66 insertions(+), 10 deletions(-)
diff --git a/tests/unit/checks/checktestlib.py b/tests/unit/checks/checktestlib.py
index 94f4feb..a3fbc47 100644
--- a/tests/unit/checks/checktestlib.py
+++ b/tests/unit/checks/checktestlib.py
@@ -395,3 +395,56 @@ class assertMKCounterWrapped(object):
assert self.msg == str(ex), "%r != %r" % (self.msg, str(ex))
return True
+
+class MockHostExtraConf(object):
+ """Mock the calls to host_extra_conf.
+
+ Due to our rather unorthodox import structure, we cannot mock
+ host_extra_conf_merged directly (it's a global var in running checks!)
+ Instead, we mock the calls to cmk_base.config.host_extra_conf.
+
+ Passing a single dict to this objects init method will result in
+ host_extra_conf_merged returning said dict.
+
+ You can also pass a list of dicts, but that's rather pointless, as
+ host_extra_conf_merged will return a merged dict, the result of
+
+ merged_dict = {}
+ for d in reversed(list_of_dicts):
+ merged_dict.update(d)
+ .
+
+ Usage:
+
+ with MockHostExtraConf(mockconfig):
+ # run your check test here,
+ # host_extra_conf_merged in your check will return
+ # mockconfig
+
+ See for example 'test_df_check.py'.
+ """
+ TARGET = 'cmk_base.config.host_extra_conf'
+
+ def __init__(self, mock_config):
+ self.context = None
+ assert type(mock_config) in (dict, list)
+ if isinstance(mock_config, dict):
+ self.config = [mock_config]
+ else:
+ self.config = mock_config
+
+ def __call__(self, _hostname, _ruleset):
+ # ensure the default value is sane
+ return self.config
+
+ def __enter__(self):
+ '''The default context: just mock get_item_state'''
+ self.context = mock.patch(MockHostExtraConf.TARGET,
+ # I'm the MockObj myself!
+ new_callable=lambda: self)
+ return self.context.__enter__()
+
+ def __exit__(self, *exc_info):
+ return self.context.__exit__(*exc_info)
+
+
diff --git a/tests/unit/checks/test_df_check.py b/tests/unit/checks/test_df_check.py
index b0de7b4..5c6009c 100644
--- a/tests/unit/checks/test_df_check.py
+++ b/tests/unit/checks/test_df_check.py
@@ -1,5 +1,7 @@
import pytest
-import checktestlib
+from checktestlib import DiscoveryResult, CheckResult, \
+ assertDiscoveryResultsEqual, MockHostExtraConf
+
pytestmark = pytest.mark.checks
@@ -240,16 +242,16 @@ info_df_btrfs = \
(info_df_btrfs, [(u'/dev/sda1 btrfs /dev/sda1', {})],
{
"include_volume_name" : True }), # btrfs w/ volume name option
])
-def test_df_discovery_with_parse(check_manager, monkeypatch, info, expected_result,
inventory_df_rules):
-# NOTE: This commented-out code is the result of trying to mock the the ruleset
variable itself instead of the
-# host_extra_conf_merged function. It did not work. Maybe we can get it to work
at a later stage.
-# import cmk_base.config
-# monkeypatch.setitem(cmk_base.config._check_contexts["df"],
"inventory_df_rules",
-# [({"include_volume_name": include_volume_name}, [],
cmk_base.config.ALL_HOSTS, {})])
+def test_df_discovery_with_parse(check_manager, info, expected_result,
inventory_df_rules):
check = check_manager.get_check("df")
- monkeypatch.setitem(check.context, "host_extra_conf_merged", lambda _, __:
inventory_df_rules)
- assert checktestlib.DiscoveryResult(check.run_discovery(check.run_parse(info))) ==
expected_result
+
+ with MockHostExtraConf(inventory_df_rules):
+ raw_discovery_result = check.run_discovery(check.run_parse(info))
+
+ discovery_result = DiscoveryResult(raw_discovery_result)
+ expected_result = DiscoveryResult(expected_result)
+ assertDiscoveryResultsEqual(discovery_result, expected_result)
@pytest.mark.parametrize("item,params,info,expected_result", [
@@ -266,4 +268,5 @@ def test_df_check_with_parse(check_manager, item, params, info,
expected_result)
if params == "default":
params = check.default_parameters()
- result = checktestlib.CheckResult(check.run_check(item, params,
check.run_parse(info)))
+ result = CheckResult(check.run_check(item, params, check.run_parse(info)))
+