import json from src import dynamodb_utils from src import models def test_build_update_item_expression_kwargs(): result = dynamodb_utils.build_update_item_expression_kwargs( {'status': 'DONE', 'result': 'YES'}) assert result == dict( UpdateExpression='set #v1 = :v1, #v2 = :v2', ExpressionAttributeValues={ ':v1': {'S': 'DONE'}, ':v2': {'S': 'YES'}, }, ExpressionAttributeNames={ '#v1': 'status', '#v2': 'result', } ) def test_get_table_name_from_arn(): arn = ('arn:aws:dynamodb:us-east-1:103233932089:table/' 'dev-smart-downloader-tasks/stream/2023-11-10T10:48:34.578') result = dynamodb_utils.get_table_name_from_arn(arn) assert result == 'dev-smart-downloader-tasks' def test_extract_download_request_and_key_from_dynamodb_item(): request = { 'tasks': [ { 'source_url': 'http://1', 'destination_url': 's3://1', }, { 'source_url': 'http://2', 'destination_url': 's3://2', }, ] } request_payload = json.dumps(request) item = { 'ApproximateCreationDateTime': 1699511558.0, 'Keys': { 'jobId': { 'S': '2023-11-09-test-2' }, 'taskId': { 'S': 'GEN-ID' } }, 'NewImage': { 'jobId': { 'S': '2023-11-09-test-2' }, 'request': { 'S': request_payload, }, 'taskId': { 'S': 'GEN-ID' } }, 'SequenceNumber': '3075800000000069415476095', 'SizeBytes': 668, 'StreamViewType': 'NEW_AND_OLD_IMAGES' } result = dynamodb_utils.extract_download_request_from_dynamodb_item( item) expected_result = ( models.DownloadRequest( tasks=[ {'destination_url': 's3://1', 'source_url': 'http://1'}, {'destination_url': 's3://2', 'source_url': 'http://2'} ], tasksMessageId='GEN-ID', status='NEW', n_threads=None), {'jobId': {'S': '2023-11-09-test-2'}, 'taskId': {'S': 'GEN-ID'}}) assert result == expected_result