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()
 |