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