"""Tests for DDEX generation wrapper.""" from unittest.mock import MagicMock, patch import pytest from soundrecording_utils.constants.ddex.constants import RuleService from soundrecording_utils.ddex.generate import generate_ddex from soundrecording_utils.metadata.types import Asset, OrchardSoundRecording def test_generate_ddex_version_38( mock_orchard_sound_recording: OrchardSoundRecording, mock_asset: Asset, execution_meta: dict, ): """Test that version 3.8 calls the correct generator.""" mock_generator = MagicMock(return_value='v3.8') with patch.dict( 'soundrecording_utils.ddex.generate._VERSION_GENERATORS', {'3.8': mock_generator} ): result = generate_ddex( mock_orchard_sound_recording, mock_asset, execution_meta, 'test-app', RuleService.TIKTOK, selected_version='3.8', takedown=False, ) assert result == 'v3.8' mock_generator.assert_called_once_with( mock_orchard_sound_recording, mock_asset, execution_meta, 'test-app', RuleService.TIKTOK, False, ) def test_generate_ddex_version_43( mock_orchard_sound_recording: OrchardSoundRecording, mock_asset: Asset, execution_meta: dict, ): """Test that version 4.3 calls the correct generator.""" mock_generator = MagicMock(return_value='v4.3') with patch.dict( 'soundrecording_utils.ddex.generate._VERSION_GENERATORS', {'4.3': mock_generator} ): result = generate_ddex( mock_orchard_sound_recording, mock_asset, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version='4.3', takedown=False, ) assert result == 'v4.3' mock_generator.assert_called_once_with( mock_orchard_sound_recording, mock_asset, execution_meta, 'test-app', RuleService.YOUTUBE, False, ) def test_generate_ddex_normalizes_whitespace( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that version strings with whitespace are normalized.""" mock_generator = MagicMock(return_value='normalized') with patch.dict( 'soundrecording_utils.ddex.generate._VERSION_GENERATORS', {'3.8': mock_generator} ): # Test with leading/trailing whitespace result = generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version=' 3.8 ', ) assert result == 'normalized' mock_generator.assert_called_once() def test_generate_ddex_normalizes_newlines( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that version strings with newlines are normalized.""" mock_generator = MagicMock(return_value='normalized') with patch.dict( 'soundrecording_utils.ddex.generate._VERSION_GENERATORS', {'3.8': mock_generator} ): # Test with trailing newline (common from env vars) result = generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version='3.8\n', ) assert result == 'normalized' mock_generator.assert_called_once() def test_generate_ddex_unsupported_version_raises_error( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that unsupported version raises ValueError.""" with pytest.raises(ValueError) as exc_info: generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version='5.0', ) error_message = str(exc_info.value) assert 'Unsupported DDEX version' in error_message assert "'5.0'" in error_message assert '3.8' in error_message assert '4.3' in error_message def test_generate_ddex_empty_version_raises_error( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that empty version string raises ValueError.""" with pytest.raises(ValueError) as exc_info: generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version='', ) error_message = str(exc_info.value) assert 'Unsupported DDEX version' in error_message def test_generate_ddex_whitespace_only_version_raises_error( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that whitespace-only version string raises ValueError.""" with pytest.raises(ValueError) as exc_info: generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version=' \n ', ) error_message = str(exc_info.value) assert 'Unsupported DDEX version' in error_message def test_generate_ddex_invalid_version_format_raises_error( mock_orchard_sound_recording: OrchardSoundRecording, execution_meta: dict, ): """Test that invalid version format raises ValueError with helpful message.""" with pytest.raises(ValueError) as exc_info: generate_ddex( mock_orchard_sound_recording, None, execution_meta, 'test-app', RuleService.YOUTUBE, selected_version='v4.3', ) error_message = str(exc_info.value) assert 'Unsupported DDEX version' in error_message assert "'v4.3'" in error_message assert 'Supported versions:' in error_message