package com.rj.audio;

import com.rj.dto.SiliconFlowTtsRequest;
import com.rj.dto.SiliconFlowTtsResponse;
import com.rj.service.SiliconFlowTtsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

import java.util.Base64;

import static org.junit.jupiter.api.Assertions.*;

/**
 * 文本转语音测试类
 * 
 * @author rj
 * @date 2025-01-02
 */
@SpringBootTest
@TestPropertySource(properties = {
    "siliconflow.enabled=true",
    "siliconflow.api-key=${SILICONFLOW_API_KEY:test-key}",
    "siliconflow.base-url=https://api.siliconflow.cn/v1"
})
public class TextToSpeechTest {
    
    @Autowired
    private SiliconFlowTtsService ttsService;
    
    @Test
    public void testAudioDurationCalculation() {
        // 测试音频时长计算
        SiliconFlowTtsService service = new SiliconFlowTtsService();
        
        // 模拟不同大小的音频文件
        long smallAudio = 50000; // 50KB
        long mediumAudio = 200000; // 200KB  
        long largeAudio = 500000; // 500KB
        
        // 注意：由于calculateAudioDuration是private方法，我们通过反射或公共方法测试
        // 这里我们主要测试服务的基本功能
        assertNotNull(ttsService);
    }
    
    @Test
    public void testTtsRequestWithVoice() {
        SiliconFlowTtsRequest request = new SiliconFlowTtsRequest();
        request.setModel("fnlp/MOSS-TTSD-v0.5");
        request.setInput("Hello, this is a test message.");
        request.setVoice("fnlp/MOSS-TTSD-v0.5:claire");
        
        assertNotNull(request);
        assertEquals("fnlp/MOSS-TTSD-v0.5", request.getModel());
        assertEquals("fnlp/MOSS-TTSD-v0.5:claire", request.getVoice());
        assertNotNull(request.getInput());
    }
    
    @Test
    public void testBase64Encoding() {
        // 测试Base64编码/解码
        String testText = "Hello World";
        String encoded = Base64.getEncoder().encodeToString(testText.getBytes());
        String decoded = new String(Base64.getDecoder().decode(encoded));
        
        assertEquals(testText, decoded);
        assertNotNull(encoded);
        assertTrue(encoded.length() > 0);
    }
    
    @Test
    public void testTtsResponseCreation() {
        // 测试TTS响应创建
        String mockAudioData = "mockAudioBase64Data";
        SiliconFlowTtsResponse response = SiliconFlowTtsResponse.success(
            mockAudioData, "mp3", 44100, 5.5
        );
        
        assertTrue(response.isSuccess());
        assertEquals(mockAudioData, response.getAudio());
        assertEquals("mp3", response.getFormat());
        assertEquals(44100, response.getSampleRate());
        assertEquals(5.5, response.getDuration());
    }
}