"""Test utility functions.""" from mock import Mock import pytest import util @pytest.mark.parametrize('include_locked', [True, False]) def test_dynamo_active_record_to_json( active_record_internal_conflict_fixture, include_locked): """Test dynamoDB record parsing util.""" data = util.dynamo_active_record_to_json( active_record_internal_conflict_fixture, include_locked) assert data['isrc'] == 'ABC123456' assert data['territories'] == { 'US': [12345, 12346], 'UK': [12345], 'RU': [12345]} if include_locked: assert data['locked_territories'] == {'UA': 'Conflict with WMG'} def test_retry_succeeded(): """Test retry decorator successful retry.""" counter = {'count': 0} @util.retry( retry_timeout=0.1, progressive_timeout=False, error_condition=lambda err: type(err) is ValueError) def func_to_decorate(counter): counter['count'] += 1 if counter['count'] == 1: raise ValueError else: return True result = func_to_decorate(counter) assert result assert counter['count'] == 2 def test_retry_count_exceeded(): """Test retry decorator raise RetryCountExceededError.""" @util.retry( retry_timeout=0.1, progressive_timeout=False, error_condition=lambda err: type(err) is ValueError, retry_count=1) def func_to_decorate(): raise ValueError with pytest.raises(util.RetryCountExceededError): func_to_decorate() def test_upload_to_s3_error_retry(mocker): """Expect to retry upload to S3 in case of failure.""" s3_error_response = { 'ResponseMetadata': {'HTTPStatusCode': 400} } s3_mock = Mock() s3_mock.put_object = Mock(return_value=s3_error_response) with pytest.raises(util.RetryCountExceededError) as e: util.upload_to_s3(s3_mock, 'bucket', 'key', "{'fake': 'data'}") assert e.value.args[0].args == (s3_error_response,) assert s3_mock.put_object.call_count == 10