import json import unittest.mock import pytest from db_schema import common from db_schema.factories.apps import UnitOfWorkFactory from apps_etl_runner import exceptions from apps_etl_runner.entities import LambdaConfig, LambdaPayload from apps_etl_runner.handler import handler @pytest.mark.integration def test_handler(session): mocked_sf = unittest.mock.Mock() config = LambdaConfig( etl_sf_arn='test', chartmetric_sf_arn='test', max_active_runs=1, backfill_active_runs=1, priority_threshold=8, process_backfill_uows=True, dbx_job_max_lifetime=1800, sentry_secret_key='sentry_secret_key', rds_secret_key='rds_secret_key' ) payload = LambdaPayload(data_sources=['slz', 'chartmetric']) unit1 = UnitOfWorkFactory( activity_status=common.ActivityStatusEnum.NOT_IN_PROGRESS, completeness_status='QUEUED', latest_job_id='etl-sf-name', latest_job_state={'dbx_job_id': 10}, data_source='SLZ' ) unit2 = UnitOfWorkFactory( activity_status=common.ActivityStatusEnum.NOT_IN_PROGRESS, completeness_status='QUEUED', latest_job_id='etl-sf-name-backfill', latest_job_state={'dbx_job_id': 10}, data_source='SLZ', unit_of_work_type='BACKFILL' ) unit3 = UnitOfWorkFactory( activity_status=common.ActivityStatusEnum.NOT_IN_PROGRESS, completeness_status='QUEUED', latest_job_id='chartmetric-sf-name', latest_job_state={}, data_source='CHARTMETRIC' ) sf_names = handler(unittest.mock.Mock(), mocked_sf, config, payload, session) session.refresh(unit1) session.refresh(unit2) session.refresh(unit3) assert sf_names == ['etl-sf-name', 'etl-sf-name-backfill', 'chartmetric-sf-name'] assert unit1.activity_status == common.ActivityStatusEnum.IN_PROGRESS assert unit2.activity_status == common.ActivityStatusEnum.IN_PROGRESS assert unit3.activity_status == common.ActivityStatusEnum.IN_PROGRESS call_1 = unittest.mock.call( name='etl-sf-name', stateMachineArn='test', input=json.dumps({'dbx_job_id': 10}) ) call_2 = unittest.mock.call( name='etl-sf-name-backfill', stateMachineArn='test', input=json.dumps({'dbx_job_id': 10}) ) call_3 = unittest.mock.call( name='chartmetric-sf-name', stateMachineArn='test', input=json.dumps({}) ) mocked_sf.start_execution.assert_has_calls([call_1, call_2, call_3]) @pytest.mark.integration def test_handler_wrong_data_source(session): mocked_sf = unittest.mock.Mock() config = LambdaConfig( etl_sf_arn='test', chartmetric_sf_arn='test', max_active_runs=2, priority_threshold=8, backfill_active_runs=0, dbx_job_max_lifetime=1800, sentry_secret_key='sentry_secret_key', rds_secret_key='rds_secret_key' ) payload = LambdaPayload(data_sources=['unknown']) with pytest.raises(exceptions.UnknownDataSourceError): handler(unittest.mock.Mock(), mocked_sf, config, payload, session)