"""Transcoding validator module unit test.""" import json from unittest import mock import pytest from trafaret import DataError from src import config from src import metadata_validator @pytest.fixture def correct_audio_metadata(): """Correct audio metadata data.""" return { 'duration_ms': 2963, 'channels': 2, 'codec': 'pcm', 'bit_rate': 1411200, 'sample_rate': 44100, 'bits_per_sample': 16, 'container': 'wave', 'mime_type': 'audio/vnd.wave', 'file_size_bytes': 522796, 'lossless': True, } @pytest.fixture def correct_validation_error(): """Correct error for trafaret checking.""" error_dict = { 'field_1': DataError('error description 1'), 'field_2': DataError('error description 2') } return DataError(error_dict) def test_validate_audio_metadata_functional_success(correct_audio_metadata): """Test validate_audio_metadata function success call without mocking.""" # test function call result = metadata_validator.validate_audio_metadata( correct_audio_metadata) # checking assert result == correct_audio_metadata @mock.patch('src.trafaret_schema.get_schema') def test_validate_audio_metadata_success( mock_get_schema, correct_audio_metadata): """Test validate_audio_metadata function success call with mocking.""" # mocking check_mock = mock.MagicMock() check_mock.side_effect = lambda a: a mock_get_schema.return_value.check = check_mock # test function call result = metadata_validator.validate_audio_metadata(correct_audio_metadata) # checking assert result == correct_audio_metadata check_mock.assert_called_once_with(correct_audio_metadata) @mock.patch.object(config, 'MIN_DURATION_MS', 2000) def test_validate_audio_metadata_invalid_metadata(correct_audio_metadata): """Test validate_audio_metadata with invalid audio metadata.""" invalid_bits_per_sample = 123 valid_bit_rate = ( correct_audio_metadata['channels'] * correct_audio_metadata['sample_rate'] * invalid_bits_per_sample ) invalid_audio_metadata = { **correct_audio_metadata, 'bits_per_sample': invalid_bits_per_sample, 'bit_rate': valid_bit_rate, 'duration_ms': 1000 } with pytest.raises( metadata_validator.InvalidAudioError ) as invalid_audio_error: metadata_validator.validate_audio_metadata(invalid_audio_metadata) assert json.loads(str(invalid_audio_error.value)) == { 'errors': { 'bits_per_sample': { '0': "value is not exactly '16'", '1': "value is not exactly '24'", }, 'duration_ms': 'value is less than 2000' }, 'metadata': { 'bit_rate': 10848600, 'bits_per_sample': 123, 'channels': 2, 'codec': 'pcm', 'container': 'wave', 'duration_ms': 1000, 'file_size_bytes': 522796, 'lossless': True, 'mime_type': 'audio/vnd.wave', 'sample_rate': 44100 }, }