Add a basic test suite.
parent
51e8e1d47b
commit
04ed1700e0
@ -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()
|
Loading…
Reference in New Issue