from unittest import TestCase from unittest.mock import patch from audiogen import AudioGenerator class TestAudioGeneratorValidate(TestCase): def setUp(self): self.valid_parsed_data = [ {'type': 'voice', 'voice': 'alloy'}, {'type': 'text', 'text': 'Hello, world!'}, {'type': 'silence', 'duration': 1000}, {'type': 'section_start', 'section_id': 1}, {'type': 'text', 'text': 'This is section 1.'}, {'type': 'section_end'}, {'type': 'insert_section', 'section_id': 1} ] self.audio_generator = AudioGenerator(self.valid_parsed_data, 'test_output.mp3') def test_validate_voices_valid(self): self.audio_generator.validate_voices() # No assertion needed as the function should not raise any exception def test_validate_voices_invalid(self): invalid_parsed_data = [ {'type': 'voice', 'voice': 'invalid_voice'}, {'type': 'text', 'text': 'Hello, world!'} ] invalid_audio_generator = AudioGenerator(invalid_parsed_data, 'test_output.mp3') with self.assertRaises(ValueError) as cm: invalid_audio_generator.validate_voices() self.assertEqual(str(cm.exception), "Invalid voice(s) found: invalid_voice") def test_validate_sections_valid(self): self.audio_generator.validate_sections() # No assertion needed as the function should not raise any exception def test_validate_sections_invalid(self): invalid_parsed_data = [ {'type': 'voice', 'voice': 'alloy'}, {'type': 'text', 'text': 'Hello, world!'}, {'type': 'insert_section', 'section_id': 1} ] invalid_audio_generator = AudioGenerator(invalid_parsed_data, 'test_output.mp3') with self.assertRaises(ValueError) as cm: invalid_audio_generator.validate_sections() self.assertIn("Section 1 is used before being defined.", str(cm.exception)) self.assertIn("Undefined section(s) used: 1", str(cm.exception)) # @patch('builtins.input', return_value='no') # @patch('audiogen.AudioGenerator.text_to_speech') # def test_text_to_speech_retry_logic(self, mock_text_to_speech, mock_input): # mock_text_to_speech.side_effect = [Exception('API error'), Exception('API error'), Exception('API error')] # with self.assertRaises(SystemExit) as cm: # self.audio_generator.text_to_speech('Hello, world!', 'alloy') # self.assertEqual(cm.exception.code, 1) # self.assertEqual(mock_text_to_speech.call_count, 3) # mock_input.assert_called_once_with("Retry TTS generation? (yes/no): ")