import pytest from freezegun import freeze_time from unittest.mock import patch, MagicMock, call from tadas.platform import dynamodb as dynamodb_utils @pytest.mark.parametrize( 'tadas_update_dynamodb_status', ['y', 'Y'] ) @pytest.mark.parametrize( 'overall_status', ['NOT_INGESTED', 'INGESTED', 'NOT_AVAILABLE'] ) @freeze_time("2025-06-30T17:33:23+00:00") def test_set_overall_status(monkeypatch, tadas_update_dynamodb_status, overall_status): monkeypatch.setenv('FEED_INGESTION_TABLE', 'test_table') monkeypatch.setenv('TADAS_UPDATE_DYNAMODB_STATUS', tadas_update_dynamodb_status) mock_update_dynamodb_status = MagicMock() monkeypatch.setattr(dynamodb_utils, 'update_dynamodb_status', mock_update_dynamodb_status) feed_name = 'test_feed' date = '2024-06-01' dynamodb_utils.set_overall_status( feed_name=feed_name, date=date, overall_status=overall_status, ) assert mock_update_dynamodb_status.call_args_list == [ call( feed_name='test_feed', date='2024-06-01', status=overall_status, attributes={'updated_at': '2025-06-30T17:33:23+00:00'}, dynamodb_table='test_table', aws_region='us-east-1') ] @freeze_time("2025-06-30T17:33:23+00:00") def test_set_overall_status_with_details(monkeypatch): monkeypatch.setenv('FEED_INGESTION_TABLE', 'test_table') monkeypatch.setenv('TADAS_UPDATE_DYNAMODB_STATUS', 'Y') mock_update_dynamodb_status = MagicMock() monkeypatch.setattr(dynamodb_utils, 'update_dynamodb_status', mock_update_dynamodb_status) feed_name = 'test_feed' date = '2024-06-01' overall_status = 'NOT_INGESTED' dynamodb_utils.set_overall_status( feed_name=feed_name, date=date, overall_status=overall_status, details='tracks: 123', ) assert mock_update_dynamodb_status.call_args_list == [ call( feed_name='test_feed', date='2024-06-01', status='NOT_INGESTED', attributes={ 'updated_at': '2025-06-30T17:33:23+00:00', 'details': 'tracks: 123', }, dynamodb_table='test_table', aws_region='us-east-1') ] @pytest.mark.parametrize( 'tadas_update_dynamodb_status', ['n', 'N', 'No', 'false', 'False', ''] ) def test_set_overall_status_skipped(monkeypatch, tadas_update_dynamodb_status): monkeypatch.setenv('FEED_INGESTION_TABLE', 'test_table') monkeypatch.setenv('TADAS_UPDATE_DYNAMODB_STATUS', tadas_update_dynamodb_status) mock_boto3 = MagicMock() monkeypatch.setattr(dynamodb_utils, 'boto3', mock_boto3) mock_dynamodb = mock_boto3.client.return_value feed_name = 'test_feed' date = '2024-06-01' overall_status = 'NOT_INGESTED' dynamodb_utils.set_overall_status( feed_name=feed_name, date=date, overall_status=overall_status, ) assert not mock_dynamodb.update_item.called @pytest.mark.parametrize( 'overall_status', ['NOT_INGESTED1', 'FAILED', 'COMPLETED', 'IN_PROGRESS', 'UNKNOWN', 'not_ingested', 'Not_ingested'] ) def test_set_overall_status_unsupported(overall_status): feed_name = 'test_feed' date = '2024-06-01' with pytest.raises(ValueError): dynamodb_utils.set_overall_status( feed_name=feed_name, date=date, overall_status=overall_status, ) def test_update_dynamodb_status(monkeypatch): mock_boto3 = MagicMock() monkeypatch.setattr(dynamodb_utils, 'boto3', mock_boto3) mock_dynamodb = mock_boto3.client.return_value feed_name = 'test_feed' date = '2024-06-01' overall_status = 'NOT_INGESTED' dynamodb_utils.update_dynamodb_status( feed_name=feed_name, date=date, status=overall_status, dynamodb_table='test_table', aws_region='us-east-1', ) assert mock_dynamodb.update_item.call_args_list == [ call( TableName='test_table', Key={ 'feed_name': {'S': 'test_feed'}, 'date': {'S': '2024-06-01'} }, UpdateExpression='SET #status = :status', ExpressionAttributeNames={ '#status': 'status' }, ExpressionAttributeValues={ ':status': {'S': 'NOT_INGESTED'} } ) ] def test_update_dynamodb_status_with_attributes(monkeypatch): mock_boto3 = MagicMock() monkeypatch.setattr(dynamodb_utils, 'boto3', mock_boto3) mock_dynamodb = mock_boto3.client.return_value feed_name = 'test_feed' date = '2024-06-01' overall_status = 'NOT_INGESTED' dynamodb_utils.update_dynamodb_status( feed_name=feed_name, date=date, status=overall_status, dynamodb_table='test_table', aws_region='us-east-31', attributes={ 'updated_at': '2025-06-30T17:33:23+00:00', 'details': 'tracks: 123', } ) assert mock_boto3.client.call_args_list == [ call('dynamodb', region_name='us-east-31') ] assert mock_dynamodb.update_item.call_args_list == [ call( TableName='test_table', Key={ 'feed_name': {'S': 'test_feed'}, 'date': {'S': '2024-06-01'} }, UpdateExpression='SET #updated_at = :updated_at, #details = :details, #status = :status', ExpressionAttributeNames={ '#updated_at': 'updated_at', '#details': 'details', '#status': 'status' }, ExpressionAttributeValues={ ':updated_at': {'S': '2025-06-30T17:33:23+00:00'}, ':details': {'S': 'tracks: 123'}, ':status': {'S': 'NOT_INGESTED'} } ) ] @pytest.mark.parametrize( 'date', ['2024-06-0', '2024-12-', '2025-13-01', '', None] ) def test_update_dynamodb_status_date_wrong(date, monkeypatch): mock_boto3 = MagicMock() monkeypatch.setattr(dynamodb_utils, 'boto3', mock_boto3) mock_dynamodb = mock_boto3.client.return_value feed_name = 'test_feed' overall_status = dynamodb_utils.STATUS_INGESTED with pytest.raises(ValueError): dynamodb_utils.update_dynamodb_status( feed_name=feed_name, date=date, status=overall_status, dynamodb_table='test_table', aws_region='us-east-1', ) assert not mock_boto3.client.called assert not mock_dynamodb.update_item.called