"""Unit tests for SME Latam tasks workflow.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from feed_ingestion.flows.insta_reels import tasks _date = '2023-01-09' @pytest.fixture def expected_bootstrap_response(): """Response for bootstrap task.""" return { 'archive_bucket': 'dev-cucumbers', 'archive_path': 'insta_reels/creations/2023-01-01/', 'date': '2023-01-01', 'feed_name': 'insta_reels_creations', 'report': 'creations', 's3_dir_path': 's3://dev-cucumbers/insta_reels/creations/2023-01-01/', 'secrets_path': 'swf-insta-reels', 'staging_raw_table': 'staging_raw_insta_reels_creations' } @pytest.fixture def mock_get_overall_status(): """Yield get overall status.""" overall_status_path = ( 'feed_ingestion.flows.insta_reels.tasks.garcon_feed_status.' 'get_overall_status') with patch(overall_status_path) as overall_status: yield overall_status @pytest.fixture def mock_set_overall_status(): """Yield overall status.""" overall_status_path = ( 'feed_ingestion.flows.insta_reels.tasks.garcon_feed_status.' 'set_overall_status') with patch(overall_status_path) as overall_status: yield overall_status @pytest.fixture def mock_delete_status(): """Yield delete overall status.""" overall_status_path = ( 'feed_ingestion.flows.insta_reels.tasks.garcon_feed_status.' 'delete_status') with patch(overall_status_path) as overall_status: yield overall_status @pytest.fixture def mock_task_status(): """Yield task status.""" task_status_path = 'feed_ingestion.tasks.task_status' with patch(task_status_path) as task_status: task_status.is_completed_task.return_value = False task_status.mark_completed_task = MagicMock() yield task_status def test_bootstrap_reload( expected_bootstrap_response, mock_get_overall_status, mock_delete_status): """Test bootstrap task when reload = True.""" result = tasks.bootstrap( MagicMock(), _date, report='creations', reload='True') assert result == expected_bootstrap_response mock_delete_status.assert_called_with( 'insta_reels_creations', '2023-01-01') def test_bootstrap( expected_bootstrap_response, mock_get_overall_status, mock_delete_status): """Test bootstrap task.""" result = tasks.bootstrap( MagicMock(), _date, report='creations', reload='') assert result == expected_bootstrap_response mock_delete_status.assert_not_called() @pytest.fixture def mock_athena(): """Yield athena mock.""" with patch.object(tasks, 'athena') as mock: yield mock @pytest.fixture def mock_s3_tasks(): """Yield athena mock.""" with patch.object(tasks, 's3_tasks') as mock: yield mock def test_fetch_from_athena_file_is_available( mock_task_status, mock_set_overall_status, mock_athena, mock_s3_tasks): """Test fetch_from_athena_file when a file is available.""" result = tasks.fetch_from_athena( MagicMock(), date=_date, report='creations', feed_name='insta_reels_creations', destination_s3_bucket='dev-cucumbers', destination_s3_path='insta_reels/creations/2023-01-01/', ) assert result == mock_s3_tasks.source_files.return_value mock_set_overall_status.assert_called_with( 'insta_reels_creations', '2023-01-09', 'DOWNLOADED') def test_fetch_from_athena_file_is_not_available( mock_task_status, mock_set_overall_status, mock_athena, mock_s3_tasks): """Test fetch_from_athena_file when a file is available.""" mock_s3_tasks.source_files.side_effect = ValueError message = ('No parquet data files were found in ' 'insta_reels/creations/2023-01-01/') with pytest.raises(ValueError, match=message): tasks.fetch_from_athena( MagicMock(), date=_date, report='creations', feed_name='insta_reels_creations', destination_s3_bucket='dev-cucumbers', destination_s3_path='insta_reels/creations/2023-01-01/', ) mock_set_overall_status.assert_called_with( 'insta_reels_creations', '2023-01-09', 'NOT_AVAILABLE')