289 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- 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()
 | |
|         self.assertRaises(AttributeError, getattr, check, "system_key")
 | |
| 
 | |
|     def test_problem_key(self):
 | |
|         check = self.make_check()
 | |
|         self.assertRaises(AttributeError, getattr, check, "problem_key")
 | |
| 
 | |
|     def test_title(self):
 | |
|         check = self.make_check()
 | |
|         self.assertRaises(AttributeError, getattr, check, "title")
 | |
| 
 | |
|     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):
 | |
|     system_key = "wuttatest"
 | |
|     problem_key = "fake_check"
 | |
|     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
 | |
|         self.config.setdefault("wutta.problems.modules", "tests.test_problems")
 | |
|         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
 | |
|         self.config.setdefault("wutta.problems.modules", "tests.test_problems")
 | |
|         checks = self.handler.filter_problem_checks()
 | |
|         self.assertIsInstance(checks, list)
 | |
|         self.assertEqual(len(checks), 1)
 | |
| 
 | |
|         # filter by system_key
 | |
|         checks = self.handler.filter_problem_checks(systems=["wuttatest"])
 | |
|         self.assertEqual(len(checks), 1)
 | |
|         checks = self.handler.filter_problem_checks(systems=["something_else"])
 | |
|         self.assertEqual(len(checks), 0)
 | |
| 
 | |
|         # filter by problem_key
 | |
|         checks = self.handler.filter_problem_checks(problems=["fake_check"])
 | |
|         self.assertEqual(len(checks), 1)
 | |
|         checks = self.handler.filter_problem_checks(problems=["something_else"])
 | |
|         self.assertEqual(len(checks), 0)
 | |
| 
 | |
|         # filter by both
 | |
|         checks = self.handler.filter_problem_checks(
 | |
|             systems=["wuttatest"], problems=["fake_check"]
 | |
|         )
 | |
|         self.assertEqual(len(checks), 1)
 | |
|         checks = self.handler.filter_problem_checks(
 | |
|             systems=["wuttatest"], problems=["bad_check"]
 | |
|         )
 | |
|         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
 | |
|         self.config.setdefault("wutta.problems.modules", "tests.test_problems")
 | |
|         systems = self.handler.get_supported_systems()
 | |
|         self.assertIsInstance(systems, list)
 | |
|         self.assertEqual(systems, ["wuttatest"])
 | |
| 
 | |
|     def test_get_system_title(self):
 | |
|         title = self.handler.get_system_title("wutta")
 | |
|         self.assertEqual(title, "wutta")
 | |
| 
 | |
|     def test_is_enabled(self):
 | |
|         check = FakeProblemCheck(self.config)
 | |
| 
 | |
|         # enabled by default
 | |
|         self.assertTrue(self.handler.is_enabled(check))
 | |
| 
 | |
|         # config can disable
 | |
|         self.config.setdefault("wutta.problems.wuttatest.fake_check.enabled", "false")
 | |
|         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
 | |
|         self.config.setdefault("wutta.problems.wuttatest.fake_check.day5", "false")
 | |
|         self.config.setdefault("wutta.problems.wuttatest.fake_check.day6", "false")
 | |
|         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)
 | |
|         self.assertEqual(list(organized), ["wuttatest"])
 | |
|         self.assertIsInstance(organized["wuttatest"], dict)
 | |
|         self.assertEqual(list(organized["wuttatest"]), ["fake_check"])
 | |
|         self.assertIs(organized["wuttatest"]["fake_check"], FakeProblemCheck)
 | |
| 
 | |
|     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)
 | |
|         self.assertEqual(key, "wuttatest_problems_fake_check")
 | |
| 
 | |
|     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)
 | |
|         self.assertEqual(context, {"system_title": "wuttatest"})
 | |
| 
 | |
|     def test_send_problem_report(self):
 | |
|         check = FakeProblemCheck(self.config)
 | |
|         problems = []
 | |
|         with patch.object(self.app, "send_email") as send_email:
 | |
|             self.handler.send_problem_report(check, problems)
 | |
|             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,
 | |
|             )
 | |
| 
 | |
|     def test_run_problem_check(self):
 | |
|         with patch.object(FakeProblemCheck, "find_problems") as find_problems:
 | |
|             with patch.object(
 | |
|                 self.handler, "send_problem_report"
 | |
|             ) as send_problem_report:
 | |
| 
 | |
|                 # check runs by default
 | |
|                 find_problems.return_value = [{"foo": "bar"}]
 | |
|                 problems = self.handler.run_problem_check(FakeProblemCheck)
 | |
|                 self.assertEqual(problems, [{"foo": "bar"}])
 | |
|                 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()
 | |
|                 with patch.object(self.handler, "is_enabled", return_value=False):
 | |
|                     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
 | |
|                     )
 | |
|                     self.assertEqual(problems, [{"foo": "bar"}])
 | |
|                     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()
 | |
|                 self.config.setdefault(
 | |
|                     f"wutta.problems.wuttatest.fake_check.day{weekday}", "false"
 | |
|                 )
 | |
|                 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)
 | |
|                 self.assertEqual(problems, [{"foo": "bar"}])
 | |
|                 find_problems.assert_called_once_with()
 | |
|                 send_problem_report.assert_called_once()
 | |
| 
 | |
|     def test_run_problem_checks(self):
 | |
|         with patch.object(FakeProblemCheck, "find_problems") as find_problems:
 | |
|             with patch.object(
 | |
|                 self.handler, "send_problem_report"
 | |
|             ) as send_problem_report:
 | |
| 
 | |
|                 # check runs by default
 | |
|                 find_problems.return_value = [{"foo": "bar"}]
 | |
|                 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()
 | |
|                 with patch.object(self.handler, "is_enabled", return_value=False):
 | |
|                     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()
 | |
|                 self.config.setdefault(
 | |
|                     f"wutta.problems.wuttatest.fake_check.day{weekday}", "false"
 | |
|                 )
 | |
|                 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()
 |