Move main entrypoint to own function for simpler testing

This commit is contained in:
Markus Opolka 2020-06-19 12:38:31 +02:00
parent b9a583f281
commit 941afeed89
3 changed files with 95 additions and 26 deletions

View File

@ -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

44
test/test_cli.py Normal file
View File

@ -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)

View File

@ -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)