from datetime import datetime from unittest.mock import Mock, call import pytest from db_schema.common import ActivityStatusEnum, CompletenessStatusEnum from db_schema.schemas.slz import UnitOfWork, UnitOfWorkPriorityEnum from slz_job_executor.const import MAX_REMAINING_TIME from slz_job_executor.exceptions import LambdaTimeoutError from slz_job_executor.services.job_starter import JobStarterService def test_start_job_ok(logger_test, merged_config_service_test, start_job_uow_mock): lambda_context = Mock() lambda_context.get_remaining_time_in_millis.return_value = MAX_REMAINING_TIME + 500 db_service = Mock() sf_starter = Mock() job_starter = JobStarterService( logger=logger_test, config=Mock(), lambda_context=lambda_context, db_service=db_service, sf_starter=sf_starter, ) job_starter.start_job( unit_of_work=start_job_uow_mock, config=merged_config_service_test.get(start_job_uow_mock.readable), contexts=['TEST'], is_reprocessing=False, ) sf_starter.start_sf.assert_called_once() def test_start_should_not_start_sf_when_no_time_left( logger_test, merged_config_service_test, start_job_uow_mock ): lambda_context = Mock() lambda_context.get_remaining_time_in_millis.return_value = MAX_REMAINING_TIME - 500 db_service = Mock() sf_starter = Mock() job_starter = JobStarterService( logger=logger_test, config=Mock(), lambda_context=lambda_context, db_service=db_service, sf_starter=sf_starter, ) with pytest.raises(LambdaTimeoutError): job_starter.start_job( unit_of_work=start_job_uow_mock, config=merged_config_service_test.get(start_job_uow_mock.readable), contexts=['TEST'], is_reprocessing=False, ) sf_starter.start_sf.assert_not_called() def test_preparer_should_fallback_uow_status_to_not_in_progress_when_start_failed( logger_test, merged_config_service_test, start_job_uow_mock, ): lambda_context = Mock() lambda_context.get_remaining_time_in_millis.return_value = MAX_REMAINING_TIME + 500 db_service = Mock() sf_starter = Mock() job_starter = JobStarterService( logger=logger_test, config=Mock(), lambda_context=lambda_context, db_service=db_service, sf_starter=sf_starter, ) sf_starter.start_sf.side_effect = ValueError('Unexpected exception') with pytest.raises(ValueError): job_starter.start_job( unit_of_work=start_job_uow_mock, config=merged_config_service_test.get(start_job_uow_mock.readable), contexts=['TEST'], is_reprocessing=False, ) assert sf_starter.start_sf.call_count == 1 assert db_service.update_activity_status.call_count == 2 db_service.update_activity_status.assert_has_calls( [ call(start_job_uow_mock, ActivityStatusEnum.IN_PROGRESS), call(start_job_uow_mock, ActivityStatusEnum.NOT_IN_PROGRESS) ] )