diff --git a/test.py b/test.py new file mode 100755 index 0000000..c45d97d --- /dev/null +++ b/test.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +import unittest +from checklib import Result, Check +from contextlib import redirect_stdout +from textwrap import dedent +import io +import sys + +def make_check( + result=Result.UNKNOWN, + short_message='Just a message', + long_message = None): + class Result(Check): + def check(self): + self.short_status = short_message + self.result=result + if long_message is not None: + self.long_status = long_message + return Result + +class DefaultCheck(Check): pass +class ExceptionInInit(Check): + def __init__(self): + raise ValueError('whatever') + +class ExceptionInCheck(Check): + def check(self): + raise ValueError('whatever') + +class ExitInInit(Check): + def __init__(self): + sys.exit(42) + +class ExitInCheck(Check): + def check(self): + sys.exit(42) + +class T(unittest.TestCase): + def setUp(self): + self.passing_check = make_check(Result.OK) + self.warning_check = make_check(Result.WARNING) + self.critical_check = make_check(Result.CRITICAL) + self.unknown_check = make_check(Result.UNKNOWN) + self.check_without_status = make_check(Result.OK, short_message = None) + + # Multiline status: + # Ref: IT Crowd :-) + self.short_message = 'Subject: Fire!' + self.long_message = dedent('''\ + Dear Sir / Madam, + + I am writing to inform + you of a fire, that has broken… + No, that\'s too formal.''') + self.multiline_check = make_check(Result.OK, self.short_message, self.long_message) + # Other checks are given as separate classes. + self.all_checks = [ + self.unknown_check, + ExceptionInCheck, + ExceptionInInit, + ExitInCheck, + ExitInInit, + DefaultCheck, + self.check_without_status, + self.multiline_check, + self.passing_check, + self.warning_check, + self.critical_check, + ] + + def test_run_exits(self): + for check in self.all_checks: + with self.subTest(check=check): + with self.assertRaises(SystemExit): + check.run() + + def test_correct_return_code(self): + expected_results = { + Result.UNKNOWN: [ + self.unknown_check, + ExceptionInCheck, + ExceptionInInit, + ExitInCheck, + ExitInInit, + DefaultCheck, + self.check_without_status, + ], + Result.OK: [ + self.multiline_check, + self.passing_check, + ], + Result.WARNING: [ + self.warning_check, + ], + Result.CRITICAL: [ + self.critical_check, + ], + } + + for result, checks in expected_results.items(): + for check in checks: + with self.subTest(check=check, expected_result=result): + try: + check.run() + except SystemExit as e: + self.assertEqual(e.code, result.value) + + def test_something_output(self): + for check in self.all_checks: + with self.subTest(check=check): + with redirect_stdout(io.StringIO()) as output: + try: + check.run() + except SystemExit: + pass + output = output.getvalue() + assert len(output) > 0 + assert '\n' in output + + def test_correct_output(self): + """ + The multiline status must contain both messages verbatim. + """ + with redirect_stdout(io.StringIO()) as output: + try: + self.multiline_check.run() + except SystemExit: + pass + output = output.getvalue() + self.assertIn(self.short_message, output) + self.assertIn(self.long_message, output) + + + + + + +if __name__ == '__main__': + unittest.main()