From 941afeed89bffdb07e828d50c93aa1181e0deb94 Mon Sep 17 00:00:00 2001 From: Markus Opolka Date: Fri, 19 Jun 2020 12:38:31 +0200 Subject: [PATCH] Move main entrypoint to own function for simpler testing --- check_http_json.py | 15 ++++++++--- test/test_cli.py | 44 ++++++++++++++++++++++++++++++++ test/test_main.py | 62 ++++++++++++++++++++++++++++++---------------- 3 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 test/test_cli.py diff --git a/check_http_json.py b/check_http_json.py index 3b8d6d9..85f76a5 100755 --- a/check_http_json.py +++ b/check_http_json.py @@ -424,7 +424,7 @@ def parseArgs(args): parser.add_argument('-s', '--ssl', action='store_true', help='use TLS to connect to remote host') parser.add_argument('-H', '--host', dest='host', - required=not ('-V' in sys.argv or '--version' in sys.argv), + required=not ('-V' in args or '--version' in args), help='remote host to query') parser.add_argument('-k', '--insecure', action='store_true', help='do not check server SSL certificate') @@ -524,10 +524,12 @@ def debugPrint(debug_flag, message, pretty_flag=False): print(message) -# Program entry point -if __name__ == "__main__": +def main(cliargs): + """ + Main entrypoint for CLI + """ - args = parseArgs(sys.argv[1:]) + args = parseArgs(cliargs) nagios = NagiosHelper() context = None @@ -630,4 +632,9 @@ if __name__ == "__main__": print(nagios.getMessage()) sys.exit(nagios.getCode()) + +if __name__ == "__main__": + # Program entry point + main(sys.argv[1:]) + #EOF diff --git a/test/test_cli.py b/test/test_cli.py new file mode 100644 index 0000000..8766ef5 --- /dev/null +++ b/test/test_cli.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 + + +import unittest +import unittest.mock as mock +import sys +import os + +sys.path.append('..') + +from check_http_json import debugPrint + + +class CLITest(unittest.TestCase): + """ + Tests for CLI + """ + + def setUp(self): + """ + Defining the exitcodes + """ + + self.exit_0 = 0 << 8 + self.exit_1 = 1 << 8 + self.exit_2 = 2 << 8 + self.exit_3 = 3 << 8 + + def test_debugprint(self): + with mock.patch('builtins.print') as mock_print: + debugPrint(True, 'debug') + mock_print.assert_called_once_with('debug') + + def test_debugprint_pprint(self): + with mock.patch('check_http_json.pprint') as mock_pprint: + debugPrint(True, 'debug', True) + mock_pprint.assert_called_once_with('debug') + + def test_cli_without_params(self): + + command = '/usr/bin/env python3 check_http_json.py > /dev/null 2>&1' + status = os.system(command) + + self.assertEqual(status, self.exit_2) diff --git a/test/test_main.py b/test/test_main.py index 873c62d..93edc70 100644 --- a/test/test_main.py +++ b/test/test_main.py @@ -8,37 +8,55 @@ import os sys.path.append('..') -from check_http_json import debugPrint +from check_http_json import main + + +class MockResponse(): + def __init__(self, status_code=200, content='{}'): + self.status_code = status_code + self.content = content + + def read(self): + return self.content class MainTest(unittest.TestCase): """ - Tests for main + Tests for Main """ - def setUp(self): - """ - Defining the exitcodes - """ + @mock.patch('builtins.print') + def test_main_version(self, mock_print): + args = ['--version'] - self.exit_0 = 0 << 8 - self.exit_1 = 1 << 8 - self.exit_2 = 2 << 8 - self.exit_3 = 3 << 8 + with self.assertRaises(SystemExit) as test: + main(args) - def test_debugprint(self): - with mock.patch('builtins.print') as mock_print: - debugPrint(True, 'debug') - mock_print.assert_called_once_with('debug') + mock_print.assert_called_once() + self.assertEqual(test.exception.code, 0) - def test_debugprint_pprint(self): - with mock.patch('check_http_json.pprint') as mock_pprint: - debugPrint(True, 'debug', True) - mock_pprint.assert_called_once_with('debug') + @mock.patch('builtins.print') + @mock.patch('urllib.request.urlopen') + def test_main_with_ssl(self, mock_request, mock_print): + args = '-H localhost --ssl'.split(' ') - def test_cli_without_params(self): + mock_request.return_value = MockResponse() - command = '/usr/bin/env python3 check_http_json.py > /dev/null 2>&1' - status = os.system(command) + with self.assertRaises(SystemExit) as test: + main(args) - self.assertEqual(status, self.exit_2) + self.assertEqual(test.exception.code, 0) + + + @mock.patch('builtins.print') + @mock.patch('urllib.request.urlopen') + def test_main_with_error(self, mock_request, mock_print): + args = '-H localhost'.split(' ') + + mock_request.return_value = MockResponse(content='not JSON') + + with self.assertRaises(SystemExit) as test: + main(args) + + # Returns Parser Error + self.assertEqual(test.exception.code, 3)