2025-08-10 11:07:30 -05:00
|
|
|
# -*- coding: utf-8; -*-
|
|
|
|
|
|
|
|
import datetime
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
from wuttjamaican import problems as mod
|
|
|
|
from wuttjamaican.testing import ConfigTestCase
|
|
|
|
|
|
|
|
|
|
|
|
class TestProblemCheck(ConfigTestCase):
|
|
|
|
|
|
|
|
def make_check(self):
|
|
|
|
return mod.ProblemCheck(self.config)
|
|
|
|
|
|
|
|
def test_system_key(self):
|
|
|
|
check = self.make_check()
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertRaises(AttributeError, getattr, check, "system_key")
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_problem_key(self):
|
|
|
|
check = self.make_check()
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertRaises(AttributeError, getattr, check, "problem_key")
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_title(self):
|
|
|
|
check = self.make_check()
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertRaises(AttributeError, getattr, check, "title")
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_find_problems(self):
|
|
|
|
check = self.make_check()
|
|
|
|
problems = check.find_problems()
|
|
|
|
self.assertEqual(problems, [])
|
|
|
|
|
|
|
|
def test_get_email_context(self):
|
|
|
|
check = self.make_check()
|
|
|
|
problems = check.find_problems()
|
|
|
|
context = check.get_email_context(problems)
|
|
|
|
self.assertEqual(context, {})
|
|
|
|
|
|
|
|
def test_make_email_attachments(self):
|
|
|
|
check = self.make_check()
|
|
|
|
problems = check.find_problems()
|
|
|
|
context = check.get_email_context(problems)
|
|
|
|
attachments = check.make_email_attachments(context)
|
|
|
|
self.assertIsNone(attachments)
|
|
|
|
|
|
|
|
|
|
|
|
class FakeProblemCheck(mod.ProblemCheck):
|
2025-08-30 21:25:44 -05:00
|
|
|
system_key = "wuttatest"
|
|
|
|
problem_key = "fake_check"
|
2025-08-10 11:07:30 -05:00
|
|
|
title = "Fake problem check"
|
|
|
|
|
|
|
|
# def find_problems(self):
|
|
|
|
# return [{'foo': 'bar'}]
|
|
|
|
|
|
|
|
|
|
|
|
class TestProblemHandler(ConfigTestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
super().setUp()
|
|
|
|
self.handler = self.make_handler()
|
|
|
|
|
|
|
|
def make_handler(self):
|
|
|
|
return mod.ProblemHandler(self.config)
|
|
|
|
|
|
|
|
def test_get_all_problem_checks(self):
|
|
|
|
|
|
|
|
# no checks by default
|
|
|
|
checks = self.handler.get_all_problem_checks()
|
|
|
|
self.assertIsInstance(checks, list)
|
|
|
|
self.assertEqual(len(checks), 0)
|
|
|
|
|
|
|
|
# but let's configure our fake check
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault("wutta.problems.modules", "tests.test_problems")
|
2025-08-10 11:07:30 -05:00
|
|
|
checks = self.handler.get_all_problem_checks()
|
|
|
|
self.assertIsInstance(checks, list)
|
|
|
|
self.assertEqual(len(checks), 1)
|
|
|
|
|
|
|
|
def test_filtered_problem_checks(self):
|
|
|
|
|
|
|
|
# no checks by default
|
|
|
|
checks = self.handler.filter_problem_checks()
|
|
|
|
self.assertIsInstance(checks, list)
|
|
|
|
self.assertEqual(len(checks), 0)
|
|
|
|
|
|
|
|
# but let's configure our fake check
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault("wutta.problems.modules", "tests.test_problems")
|
2025-08-10 11:07:30 -05:00
|
|
|
checks = self.handler.filter_problem_checks()
|
|
|
|
self.assertIsInstance(checks, list)
|
|
|
|
self.assertEqual(len(checks), 1)
|
|
|
|
|
|
|
|
# filter by system_key
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(systems=["wuttatest"])
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 1)
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(systems=["something_else"])
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 0)
|
|
|
|
|
|
|
|
# filter by problem_key
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(problems=["fake_check"])
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 1)
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(problems=["something_else"])
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 0)
|
|
|
|
|
|
|
|
# filter by both
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(
|
|
|
|
systems=["wuttatest"], problems=["fake_check"]
|
|
|
|
)
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 1)
|
2025-08-30 21:25:44 -05:00
|
|
|
checks = self.handler.filter_problem_checks(
|
|
|
|
systems=["wuttatest"], problems=["bad_check"]
|
|
|
|
)
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertEqual(len(checks), 0)
|
|
|
|
|
|
|
|
def test_get_supported_systems(self):
|
|
|
|
|
|
|
|
# no checks by default
|
|
|
|
systems = self.handler.get_supported_systems()
|
|
|
|
self.assertIsInstance(systems, list)
|
|
|
|
self.assertEqual(len(systems), 0)
|
|
|
|
|
|
|
|
# but let's configure our fake check
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault("wutta.problems.modules", "tests.test_problems")
|
2025-08-10 11:07:30 -05:00
|
|
|
systems = self.handler.get_supported_systems()
|
|
|
|
self.assertIsInstance(systems, list)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(systems, ["wuttatest"])
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_get_system_title(self):
|
2025-08-30 21:25:44 -05:00
|
|
|
title = self.handler.get_system_title("wutta")
|
|
|
|
self.assertEqual(title, "wutta")
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_is_enabled(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
|
|
|
|
# enabled by default
|
|
|
|
self.assertTrue(self.handler.is_enabled(check))
|
|
|
|
|
|
|
|
# config can disable
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault("wutta.problems.wuttatest.fake_check.enabled", "false")
|
2025-08-10 11:07:30 -05:00
|
|
|
self.assertFalse(self.handler.is_enabled(check))
|
|
|
|
|
|
|
|
def test_should_run_for_weekday(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
|
|
|
|
# should run by default
|
|
|
|
for weekday in range(7):
|
|
|
|
self.assertTrue(self.handler.should_run_for_weekday(check, weekday))
|
|
|
|
|
|
|
|
# config can disable, e.g. for weekends
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault("wutta.problems.wuttatest.fake_check.day5", "false")
|
|
|
|
self.config.setdefault("wutta.problems.wuttatest.fake_check.day6", "false")
|
2025-08-10 11:07:30 -05:00
|
|
|
for weekday in range(5):
|
|
|
|
self.assertTrue(self.handler.should_run_for_weekday(check, weekday))
|
|
|
|
for weekday in (5, 6):
|
|
|
|
self.assertFalse(self.handler.should_run_for_weekday(check, weekday))
|
|
|
|
|
|
|
|
def test_organize_problem_checks(self):
|
|
|
|
checks = [FakeProblemCheck]
|
|
|
|
|
|
|
|
organized = self.handler.organize_problem_checks(checks)
|
|
|
|
self.assertIsInstance(organized, dict)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(list(organized), ["wuttatest"])
|
|
|
|
self.assertIsInstance(organized["wuttatest"], dict)
|
|
|
|
self.assertEqual(list(organized["wuttatest"]), ["fake_check"])
|
|
|
|
self.assertIs(organized["wuttatest"]["fake_check"], FakeProblemCheck)
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_find_problems(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
problems = self.handler.find_problems(check)
|
|
|
|
self.assertEqual(problems, [])
|
|
|
|
|
|
|
|
def test_get_email_key(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
key = self.handler.get_email_key(check)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(key, "wuttatest_problems_fake_check")
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_get_global_email_context(self):
|
|
|
|
context = self.handler.get_global_email_context()
|
|
|
|
self.assertEqual(context, {})
|
|
|
|
|
|
|
|
def test_get_check_email_context(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
problems = []
|
|
|
|
context = self.handler.get_check_email_context(check, problems)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(context, {"system_title": "wuttatest"})
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_send_problem_report(self):
|
|
|
|
check = FakeProblemCheck(self.config)
|
|
|
|
problems = []
|
2025-08-30 21:25:44 -05:00
|
|
|
with patch.object(self.app, "send_email") as send_email:
|
2025-08-10 11:07:30 -05:00
|
|
|
self.handler.send_problem_report(check, problems)
|
2025-08-30 21:25:44 -05:00
|
|
|
send_email.assert_called_once_with(
|
|
|
|
"wuttatest_problems_fake_check",
|
|
|
|
{
|
|
|
|
"system_title": "wuttatest",
|
|
|
|
"config": self.config,
|
|
|
|
"app": self.app,
|
|
|
|
"check": check,
|
|
|
|
"problems": problems,
|
|
|
|
},
|
|
|
|
default_subject="Fake problem check",
|
|
|
|
attachments=None,
|
|
|
|
)
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
def test_run_problem_check(self):
|
2025-08-30 21:25:44 -05:00
|
|
|
with patch.object(FakeProblemCheck, "find_problems") as find_problems:
|
|
|
|
with patch.object(
|
|
|
|
self.handler, "send_problem_report"
|
|
|
|
) as send_problem_report:
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
# check runs by default
|
2025-08-30 21:25:44 -05:00
|
|
|
find_problems.return_value = [{"foo": "bar"}]
|
2025-08-10 11:07:30 -05:00
|
|
|
problems = self.handler.run_problem_check(FakeProblemCheck)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(problems, [{"foo": "bar"}])
|
2025-08-10 11:07:30 -05:00
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|
|
|
|
|
|
|
|
# does not run if generally disabled
|
|
|
|
find_problems.reset_mock()
|
|
|
|
send_problem_report.reset_mock()
|
2025-08-30 21:25:44 -05:00
|
|
|
with patch.object(self.handler, "is_enabled", return_value=False):
|
2025-08-10 11:07:30 -05:00
|
|
|
problems = self.handler.run_problem_check(FakeProblemCheck)
|
|
|
|
self.assertIsNone(problems)
|
|
|
|
find_problems.assert_not_called()
|
|
|
|
send_problem_report.assert_not_called()
|
|
|
|
|
|
|
|
# unless caller gives force flag
|
2025-08-30 21:25:44 -05:00
|
|
|
problems = self.handler.run_problem_check(
|
|
|
|
FakeProblemCheck, force=True
|
|
|
|
)
|
|
|
|
self.assertEqual(problems, [{"foo": "bar"}])
|
2025-08-10 11:07:30 -05:00
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|
|
|
|
|
|
|
|
# does not run if disabled for weekday
|
|
|
|
find_problems.reset_mock()
|
|
|
|
send_problem_report.reset_mock()
|
|
|
|
weekday = datetime.date.today().weekday()
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault(
|
|
|
|
f"wutta.problems.wuttatest.fake_check.day{weekday}", "false"
|
|
|
|
)
|
2025-08-10 11:07:30 -05:00
|
|
|
problems = self.handler.run_problem_check(FakeProblemCheck)
|
|
|
|
self.assertIsNone(problems)
|
|
|
|
find_problems.assert_not_called()
|
|
|
|
send_problem_report.assert_not_called()
|
|
|
|
|
|
|
|
# unless caller gives force flag
|
|
|
|
problems = self.handler.run_problem_check(FakeProblemCheck, force=True)
|
2025-08-30 21:25:44 -05:00
|
|
|
self.assertEqual(problems, [{"foo": "bar"}])
|
2025-08-10 11:07:30 -05:00
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|
|
|
|
|
|
|
|
def test_run_problem_checks(self):
|
2025-08-30 21:25:44 -05:00
|
|
|
with patch.object(FakeProblemCheck, "find_problems") as find_problems:
|
|
|
|
with patch.object(
|
|
|
|
self.handler, "send_problem_report"
|
|
|
|
) as send_problem_report:
|
2025-08-10 11:07:30 -05:00
|
|
|
|
|
|
|
# check runs by default
|
2025-08-30 21:25:44 -05:00
|
|
|
find_problems.return_value = [{"foo": "bar"}]
|
2025-08-10 11:07:30 -05:00
|
|
|
self.handler.run_problem_checks([FakeProblemCheck])
|
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|
|
|
|
|
|
|
|
# does not run if generally disabled
|
|
|
|
find_problems.reset_mock()
|
|
|
|
send_problem_report.reset_mock()
|
2025-08-30 21:25:44 -05:00
|
|
|
with patch.object(self.handler, "is_enabled", return_value=False):
|
2025-08-10 11:07:30 -05:00
|
|
|
self.handler.run_problem_checks([FakeProblemCheck])
|
|
|
|
find_problems.assert_not_called()
|
|
|
|
send_problem_report.assert_not_called()
|
|
|
|
|
|
|
|
# unless caller gives force flag
|
|
|
|
self.handler.run_problem_checks([FakeProblemCheck], force=True)
|
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|
|
|
|
|
|
|
|
# does not run if disabled for weekday
|
|
|
|
find_problems.reset_mock()
|
|
|
|
send_problem_report.reset_mock()
|
|
|
|
weekday = datetime.date.today().weekday()
|
2025-08-30 21:25:44 -05:00
|
|
|
self.config.setdefault(
|
|
|
|
f"wutta.problems.wuttatest.fake_check.day{weekday}", "false"
|
|
|
|
)
|
2025-08-10 11:07:30 -05:00
|
|
|
self.handler.run_problem_checks([FakeProblemCheck])
|
|
|
|
find_problems.assert_not_called()
|
|
|
|
send_problem_report.assert_not_called()
|
|
|
|
|
|
|
|
# unless caller gives force flag
|
|
|
|
self.handler.run_problem_checks([FakeProblemCheck], force=True)
|
|
|
|
find_problems.assert_called_once_with()
|
|
|
|
send_problem_report.assert_called_once()
|