yao/kb/providers/converters/whisper_test.go
Max d750365ed9 Add tests for Structured and Semantic schema retrieval
- Introduced new test cases for Structured and Semantic providers to validate schema retrieval functionality.
- Updated existing tests across various providers to ensure they check for non-nil schemas, enhancing error handling and test coverage.
- Ensured consistency in error messages for schema validation across different provider tests.
2025-08-10 17:21:13 +08:00

223 lines
6.6 KiB
Go

package converters
import (
"testing"
kbtypes "github.com/yaoapp/yao/kb/types"
)
func TestWhisper_Make(t *testing.T) {
whisper := &Whisper{}
// Note: Whisper converter requires connectors to be loaded
// All tests will fail in test environment due to missing connectors
t.Run("nil option should return error due to missing connector", func(t *testing.T) {
_, err := whisper.Make(nil)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded in test environment
})
t.Run("empty option should return error due to missing connector", func(t *testing.T) {
option := &kbtypes.ProviderOption{}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded in test environment
})
t.Run("option with all audio properties should return error due to missing connector", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": "openai.whisper",
"model": "whisper-1",
"language": "en",
"chunk_duration": 45.0,
"mapping_duration": 10.0,
"silence_threshold": -35.0,
"silence_min_length": 2.0,
"enable_silence_detection": false,
"max_concurrency": 8,
"temp_dir": "/tmp/whisper",
"cleanup_temp": false,
"options": map[string]interface{}{
"temperature": 0.0,
},
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because openai.whisper connector is not loaded
})
t.Run("float64 values should be handled correctly but still return error", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": "openai.whisper",
"chunk_duration": 30.5, // float64
"mapping_duration": 5.2, // float64
"silence_threshold": -42.3, // float64
"silence_min_length": 1.8, // float64
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded
})
t.Run("int values should be converted to float64 for duration fields but still return error", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": "openai.whisper",
"chunk_duration": 30, // int
"mapping_duration": 5, // int
"silence_threshold": -40, // int
"silence_min_length": 1, // int
"max_concurrency": 6, // int
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded
})
t.Run("boolean values should be handled correctly but still return error", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": "openai.whisper",
"enable_silence_detection": true,
"cleanup_temp": false,
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded
})
t.Run("invalid property types should be ignored but still return error", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": 123, // invalid type
"chunk_duration": "invalid", // invalid type
"enable_silence_detection": "invalid", // invalid type
"max_concurrency": "invalid", // invalid type
"options": "not a map", // invalid type
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded
})
t.Run("partial properties should use defaults for missing values but still return error", func(t *testing.T) {
option := &kbtypes.ProviderOption{
Properties: map[string]interface{}{
"connector": "openai.whisper",
"chunk_duration": 60.0,
// Other properties should use defaults
},
}
_, err := whisper.Make(option)
if err == nil {
t.Error("Expected error due to missing connector")
}
// Error is expected because connector is not loaded
})
}
func TestWhisper_AutoDetect(t *testing.T) {
whisper := &Whisper{
Autodetect: []string{".mp3", ".wav", ".m4a", "audio/mpeg", "audio/wav"},
MatchPriority: 10,
}
t.Run("should detect .mp3 files", func(t *testing.T) {
match, priority, err := whisper.AutoDetect("audio.mp3", "")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if !match {
t.Error("Expected match for .mp3 file")
}
if priority != 10 {
t.Errorf("Expected priority 10, got %d", priority)
}
})
t.Run("should detect .wav files", func(t *testing.T) {
match, priority, err := whisper.AutoDetect("recording.wav", "")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if !match {
t.Error("Expected match for .wav file")
}
if priority != 10 {
t.Errorf("Expected priority 10, got %d", priority)
}
})
t.Run("should detect by content type", func(t *testing.T) {
match, priority, err := whisper.AutoDetect("unknown", "audio/mpeg")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if !match {
t.Error("Expected match for audio/mpeg content type")
}
if priority != 10 {
t.Errorf("Expected priority 10, got %d", priority)
}
})
t.Run("should not detect unsupported files", func(t *testing.T) {
match, priority, err := whisper.AutoDetect("video.mp4", "video/mp4")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if match {
t.Error("Expected no match for .mp4 file")
}
if priority != 0 {
t.Errorf("Expected priority 0, got %d", priority)
}
})
t.Run("empty autodetect should not match", func(t *testing.T) {
emptyWhisper := &Whisper{}
match, priority, err := emptyWhisper.AutoDetect("audio.mp3", "audio/mpeg")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if match {
t.Error("Expected no match when autodetect is empty")
}
if priority != 0 {
t.Errorf("Expected priority 0, got %d", priority)
}
})
}
func TestWhisper_Schema(t *testing.T) {
whisper := &Whisper{}
schema, err := whisper.Schema(nil, "en")
if err != nil {
t.Errorf("Expected no error, got %v", err)
}
if schema == nil {
t.Error("Expected non-nil schema from factory.GetSchemaFromBindata")
}
}