From a30e892e330f6da6837248fa50f3ab0f3296f0f6 Mon Sep 17 00:00:00 2001 From: Mario Apra Date: Fri, 28 Jun 2024 15:03:02 +0100 Subject: [PATCH] Fix test_limit and test_runner --- awslimitchecker/limit.py | 2 +- awslimitchecker/runner.py | 19 ++++++-- awslimitchecker/tests/test_limit.py | 72 ++++++++++++++++++---------- awslimitchecker/tests/test_runner.py | 49 ++++++++----------- 4 files changed, 83 insertions(+), 59 deletions(-) diff --git a/awslimitchecker/limit.py b/awslimitchecker/limit.py index c8031e56..b8226ce7 100644 --- a/awslimitchecker/limit.py +++ b/awslimitchecker/limit.py @@ -431,7 +431,7 @@ class instance. Return True if usage is within thresholds, or false if limit = u.get_maximum() or self.get_limit() if limit is None or limit == 0: continue - pct = (usage / (limit * 1.0)) * 100 + pct = (usage / limit) * 100 if crit_int is not None and usage >= crit_int: all_ok = False elif pct >= crit_pct: diff --git a/awslimitchecker/runner.py b/awslimitchecker/runner.py index 25fc1732..38c07de5 100644 --- a/awslimitchecker/runner.py +++ b/awslimitchecker/runner.py @@ -330,11 +330,22 @@ def show_usage(self): service = svc limit_name = lim resource = usage.resource_id or '-' - limit = int(data.quotas_limit) if data.quotas_limit else "" + limit = "" + if data.quotas_limit: + limit = int(data.quotas_limit) use = usage.value - use_percent = "{:.0f} %".format((use / limit) * 100) if isinstance(limit, (int, float)) else "-" - table.append([f"{service}/{limit_name}", resource, str(use), use_percent, str(limit)]) - print(tabulate.tabulate(table, headers=headers, tablefmt="simple_outline")) + use_percent = "-" + if isinstance(limit, (int, float)): + use_percent = "{:.0f} %".format((use / limit) * 100) + table.append([ + f"{service}/{limit_name}", + resource, + str(use), + use_percent, + str(limit), + ]) + print(tabulate.tabulate( + table, headers=headers, tablefmt="simple_outline")) def check_thresholds(self, metrics=None): have_warn = False diff --git a/awslimitchecker/tests/test_limit.py b/awslimitchecker/tests/test_limit.py index be7dd1c3..cbbd4a47 100644 --- a/awslimitchecker/tests/test_limit.py +++ b/awslimitchecker/tests/test_limit.py @@ -602,23 +602,33 @@ def test_int_warn(self): assert mock_get_limit.mock_calls == [call(), call(), call()] def test_int_warn_crit(self): - limit = AwsLimit('limitname', self.mock_svc, 100, 1, 2) - u1 = AwsLimitUsage(limit, 4, resource_id='foo4bar') - u2 = AwsLimitUsage(limit, 1, resource_id='foo3bar') - u3 = AwsLimitUsage(limit, 7, resource_id='foo2bar') + limit = AwsLimit( + name='limitname', + service=self.mock_svc, + default_limit=10, + def_warning_threshold=40, + def_critical_threshold=60, + ) + u1 = AwsLimitUsage( + limit=limit, + value=4, + resource_id='foo4bar', + ) + u2 = AwsLimitUsage( + limit=limit, + value=1, + resource_id='foo3bar', + ) + u3 = AwsLimitUsage( + limit=limit, + value=7, + resource_id='foo2bar', + ) limit._current_usage = [u1, u2, u3] - with patch('awslimitchecker.limit.AwsLimit.' - '_get_thresholds') as mock_get_thresh: - with patch('awslimitchecker.limit.AwsLimit.get_' - 'limit') as mock_get_limit: - mock_get_thresh.return_value = (4, 40, 6, 80) - mock_get_limit.return_value = 100 - res = limit.check_thresholds() + res = limit.check_thresholds() assert res is False assert limit._warnings == [u1] assert limit._criticals == [u3] - assert mock_get_thresh.mock_calls == [call()] - assert mock_get_limit.mock_calls == [call(), call(), call()] def test_pct_crit(self): limit = AwsLimit('limitname', self.mock_svc, 100, 1, 2) @@ -640,23 +650,33 @@ def test_pct_crit(self): assert mock_get_limit.mock_calls == [call(), call(), call()] def test_int_crit(self): - limit = AwsLimit('limitname', self.mock_svc, 100, 1, 2) - u1 = AwsLimitUsage(limit, 9, resource_id='foo4bar') - u2 = AwsLimitUsage(limit, 3, resource_id='foo3bar') - u3 = AwsLimitUsage(limit, 95, resource_id='foo2bar') + limit = AwsLimit( + name='limitname', + service=self.mock_svc, + default_limit=10, + def_warning_threshold=60, + def_critical_threshold=80, + ) + u1 = AwsLimitUsage( + limit=limit, + value=9, + resource_id='foo4bar', + ) + u2 = AwsLimitUsage( + limit=limit, + value=3, + resource_id='foo3bar', + ) + u3 = AwsLimitUsage( + limit=limit, + value=95, + resource_id='foo2bar', + ) limit._current_usage = [u1, u2, u3] - with patch('awslimitchecker.limit.AwsLimit.' - '_get_thresholds') as mock_get_thresh: - with patch('awslimitchecker.limit.AwsLimit.get_' - 'limit') as mock_get_limit: - mock_get_thresh.return_value = (6, 40, 8, 80) - mock_get_limit.return_value = 100 - res = limit.check_thresholds() + res = limit.check_thresholds() assert res is False assert limit._warnings == [] assert limit._criticals == [u1, u3] - assert mock_get_thresh.mock_calls == [call()] - assert mock_get_limit.mock_calls == [call(), call(), call()] def test_pct_warn_crit(self): limit = AwsLimit('limitname', self.mock_svc, 100, 1, 2) diff --git a/awslimitchecker/tests/test_runner.py b/awslimitchecker/tests/test_runner.py index e80f472d..fb385141 100644 --- a/awslimitchecker/tests/test_runner.py +++ b/awslimitchecker/tests/test_runner.py @@ -769,22 +769,18 @@ def test_default(self, capsys): mock_checker = Mock(spec_set=AwsLimitChecker) mock_checker.get_limits.return_value = limits self.cls.checker = mock_checker - with patch('awslimitchecker.runner.dict2cols') as mock_d2c: - mock_d2c.return_value = 'd2cval' + with patch('awslimitchecker.runner.tabulate') as mock_tabulate: self.cls.show_usage() - out, err = capsys.readouterr() - assert out == 'd2cval\n' - assert mock_checker.mock_calls == [ - call.find_usage(service=None, use_ta=True), - call.get_limits(service=None, use_ta=True) - ] - assert mock_d2c.mock_calls == [ - call({ - 'SvcBar/bar limit2': '22', - 'SvcBar/barlimit1': '11', - 'SvcFoo/foo limit3': '33', - }) - ] + assert mock_checker.mock_calls == [ + call.find_usage(service=None, use_ta=True), + call.get_limits(service=None, use_ta=True) + ] + assert len(mock_tabulate.method_calls) == 1 + assert mock_tabulate.method_calls[0].args == ([ + ['SvcBar/bar limit2', '-', '22', '-', ''], + ['SvcBar/barlimit1', '-', '11', '-', ''], + ['SvcFoo/foo limit3', '-', '33', '-', ''] + ],) def test_one_service(self, capsys): limits = { @@ -796,20 +792,17 @@ def test_one_service(self, capsys): self.cls.checker = mock_checker self.cls.service_name = ['SvcFoo'] self.cls.skip_ta = True - with patch('awslimitchecker.runner.dict2cols') as mock_d2c: - mock_d2c.return_value = 'd2cval' + with patch('awslimitchecker.runner.tabulate') as mock_tabulate: self.cls.show_usage() - out, err = capsys.readouterr() - assert out == 'd2cval\n' - assert mock_checker.mock_calls == [ - call.find_usage(service=['SvcFoo'], use_ta=False), - call.get_limits(service=['SvcFoo'], use_ta=False) - ] - assert mock_d2c.mock_calls == [ - call({ - 'SvcFoo/foo limit3': '33', - }) - ] + out, err = capsys.readouterr() + assert mock_checker.mock_calls == [ + call.find_usage(service=['SvcFoo'], use_ta=False), + call.get_limits(service=['SvcFoo'], use_ta=False) + ] + assert len(mock_tabulate.method_calls) == 1 + assert mock_tabulate.method_calls[0].args == ( + [['SvcFoo/foo limit3', '-', '33', '-', '']], + ) class TestCheckThresholds(RunnerTester):