"""Custom validators module unit test.""" import pytest from trafaret import DataError from src import custom_validators from src.constants import errors from src.constants import validation_const @pytest.fixture def correct_audio_metadata(): """Correct audio metadata.""" return { 'container': 'wave', 'codec': 'pcm', 'bit_rate': 1411200, 'bits_per_sample': 16, 'channels': 2, 'sample_rate': 44100, 'file_size_bytes': 3413948, 'duration_ms': 2963 } @pytest.mark.parametrize('input_sample_rate, expected_sample_rate', [ (44100, 44100), (48000, 48000)]) def test_sample_rate_validation_success( input_sample_rate, expected_sample_rate, correct_audio_metadata): """Test sample_rate_validation function success call.""" audio_metadata = dict.copy(correct_audio_metadata) audio_metadata['sample_rate'] = input_sample_rate # test function call result = custom_validators.sample_rate_validation(audio_metadata) # checking assert 'sample_rate' in result assert expected_sample_rate == result['sample_rate'] def test_sample_rate_validation_failure(correct_audio_metadata): """Test sample_rate_validation function failure call.""" bits_per_sample = correct_audio_metadata['bits_per_sample'] # mocking invalid_metadata = correct_audio_metadata invalid_metadata['sample_rate'] = 100 expected_sample_rate_values = ( validation_const.BITS_PER_SAMPLE_TO_ALLOWED_SAMPLE_RATES[ bits_per_sample ] ) expected_error_message = errors.INVALID_INPUT_VALUE_ERROR_MESSAGE.format( name='sample_rate', expected=expected_sample_rate_values, value=invalid_metadata['sample_rate'] ) # test function call result = custom_validators.sample_rate_validation(invalid_metadata) # checking assert 'sample_rate' in result assert type(result['sample_rate']) is DataError result_error_message = result['sample_rate'].as_dict() assert expected_error_message == result_error_message required_sample_rate_validation_inputs = {'bits_per_sample', 'sample_rate'} @pytest.mark.parametrize( 'missing_input', required_sample_rate_validation_inputs) def test_sample_rate_validation_missing_inputs(missing_input): """Test sample_rate_validation when inputs are missing.""" audio_meta = { required_input: 'something' for required_input in required_sample_rate_validation_inputs if required_input != missing_input } result = custom_validators.sample_rate_validation(audio_meta) assert result == {'sample_rate': audio_meta.get('sample_rate')}