"""Unit tests for the dynamodb util module.""" import datetime import boto3 from freezegun import freeze_time from moto import mock_aws from activity_detector import base_config from activity_detector.utils import dynamodb STATUS_TABLE_NAME = 'test_table' STATUS_TABLE_DEFINITION = dict( TableName=STATUS_TABLE_NAME, KeySchema=[ { 'AttributeName': 'activity_type_name', 'KeyType': 'HASH' }, { 'AttributeName': 'date', 'KeyType': 'RANGE' } ], AttributeDefinitions=[ { 'AttributeName': 'activity_type_name', 'AttributeType': 'S' }, { 'AttributeName': 'date', 'AttributeType': 'S' } ], ProvisionedThroughput={ 'ReadCapacityUnits': 5, 'WriteCapacityUnits': 5 } ) @mock_aws def test_get_status(monkeypatch): """Test getting the status from dynamodb.""" activity_type_name = 'analytics_digest' timestamp = '2018-01-01 00:00:00:000000' date = '0000-00-00' status = 'PROCESSED' monkeypatch.setattr( base_config, 'DYNAMODB_STATUS_TABLE', STATUS_TABLE_NAME) client = boto3.client('dynamodb') # Create mock table client.create_table(**STATUS_TABLE_DEFINITION) # Add mock item client.put_item( TableName=STATUS_TABLE_NAME, Item={ 'activity_type_name': {'S': activity_type_name}, 'date': {'S': date}, 'status': {'S': status}, 'last_processed_timestamp': {'S': timestamp} }) result = dynamodb.get_status(activity_type_name, date) assert result == { 'status': status, 'last_processed_timestamp': datetime.datetime(2018, 1, 1, 0, 0) } @mock_aws def test_get_last_processed_timestamp_no_item(monkeypatch): """Test when there is no item.""" activity_type_name = 'analytics_digest' date = '1970-01-01' monkeypatch.setattr( base_config, 'DYNAMODB_STATUS_TABLE', STATUS_TABLE_NAME) client = boto3.client('dynamodb') client.create_table(**STATUS_TABLE_DEFINITION) result = dynamodb.get_status(activity_type_name, date) assert result is None @freeze_time('2018-01-01') @mock_aws def test_save_last_processed_timestamp(monkeypatch): """Test save the last processed timestamp into dynamodb.""" activity_type_name = 'analytics_digest' date = '1970-01-01' status = 'PROCESSED' monkeypatch.setattr( base_config, 'DYNAMODB_STATUS_TABLE', STATUS_TABLE_NAME) client = boto3.client('dynamodb') client.create_table(**STATUS_TABLE_DEFINITION) dynamodb.set_status(activity_type_name, date, status) response = client.get_item( TableName=STATUS_TABLE_NAME, Key={ 'activity_type_name': {'S': activity_type_name}, 'date': {'S': date}}, ExpressionAttributeNames={'#status': 'status'}, ProjectionExpression='#status,last_processed_timestamp') timestamp = response['Item']['last_processed_timestamp']['S'] res_status = response['Item']['status']['S'] assert timestamp == '2018-01-01 00:00:00:000000' assert res_status == status @mock_aws def test_save_last_processed_timestamp_override(monkeypatch): """Test save an explicit last processed timestamp into dynamodb.""" activity_type_name = 'playlist_placements_spotify' date = '*' status = 'PROCESSED_NOTIF_SET' monkeypatch.setattr( base_config, 'DYNAMODB_STATUS_TABLE', STATUS_TABLE_NAME) client = boto3.client('dynamodb') client.create_table(**STATUS_TABLE_DEFINITION) processed_time_str = '2018-01-01' processed_time = datetime.datetime.strptime( processed_time_str, '%Y-%m-%d') dynamodb.set_status(activity_type_name, date, status, processed_time) response = client.get_item( TableName=STATUS_TABLE_NAME, Key={ 'activity_type_name': {'S': activity_type_name}, 'date': {'S': date}}, ExpressionAttributeNames={'#status': 'status'}, ProjectionExpression='#status,last_processed_timestamp') timestamp = response['Item']['last_processed_timestamp']['S'] res_status = response['Item']['status']['S'] assert timestamp == '2018-01-01 00:00:00:000000' assert res_status == status