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