import pathlib import unittest from datetime import datetime, timedelta, timezone from unittest.mock import Mock, call from db_schema.schemas import slz from slz_uow_monitoring.handler import DataDogGroupIdParseError, extract_uow_id_from_dd_group_id from slz_uow_monitoring.handler import handler as handler_func FIXTURES = pathlib.Path(__file__).parent / 'fixtures' class UtilTestCase(unittest.TestCase): def test_extract_uow_id_from_dd_group_id_correct(self): group_id = ( 'environment:dev,uow.unit_of_work_code:apple-20190110-smejp-amcontentdemographics-v1_0,' 'uow.unit_of_work_id:10603' ) result = extract_uow_id_from_dd_group_id(group_id) self.assertEqual(result, '10603') def test_extract_uow_id_from_dd_group_id_exception(self): group_id = 'wrong' self.assertRaises(DataDogGroupIdParseError, extract_uow_id_from_dd_group_id, group_id) class HandlerTestCase(unittest.TestCase): def setUp(self) -> None: self.logger = Mock() self.pg_mock = Mock() @unittest.mock.patch( 'slz_uow_monitoring.handler.datetime', wraps=datetime, now=lambda: datetime(year=2019, month=12, day=5, hour=15, minute=10, tzinfo=timezone.utc) ) @unittest.mock.patch('slz_uow_monitoring.handler.Repository.find_uows_by_completness_statuses') @unittest.mock.patch('slz_uow_monitoring.handler.DatadogClient') @unittest.mock.patch('slz_uow_monitoring.handler.Connection') def test_handler_correct_log_msg(self, _, __, pg_repo_mock, ___): config = { 'rds_secrets_key': 'RDS_SECRETS_KEY', 'dsp_config_path': FIXTURES / 'dsp_config.json', 'datadog_secrets_key': 'DATADOG_SECRETS_KEY' } uow = slz.UnitOfWork( unit_of_work_code='amazonadsupported-20191203-sme-playlist-v1', created_at=datetime(year=2019, month=12, day=1, tzinfo=timezone.utc), ) pg_repo_mock.return_value = [ uow, ] handler_func(Mock(), self.logger, config, Mock()) self.logger.warning.assert_has_calls( [ call( '[CHECK_ACTIVE_UOW] Uow is in ACTIVE completeness status more than n hours', uow_active_hours_threshold=72, **{ 'uow': { 'unit_of_work_id': None, 'unit_of_work_code': 'amazonadsupported-20191203-sme-playlist-v1', 'reprocess_id': None, 'licensor_id': None, 'report_id': None, 'report_date': None, 'version': None, 'timeslot': None, 'activity_status': None, 'completeness_status': None, 'unit_of_work_type': None, 'is_force_complete': None, 'priority': None, 'next_run_at': None, 'created_at': datetime(2019, 12, 1, 0, 0, tzinfo=timezone.utc), 'last_updated_at': None }, 'now': datetime(2019, 12, 5, 15, 10, tzinfo=timezone.utc), 'inactive_hours_timedelta': timedelta(days=4, seconds=54600) } ) ] )