refactor config validation to use provider registry

- use provider.GetProvider() for provider validation
- use provider.GetModel() for model validation
- use p.RequiresAPIKey() for API key checks
- warn for unrecognized language codes (don't error)
- add ValidateModelLanguageCompatibility for model-language checks
- remove hardcoded isValidLanguageCode function
This commit is contained in:
leonardotrapani
2026-02-01 02:07:09 +01:00
parent 4b6e6d87ed
commit 700f7fb633
4 changed files with 234 additions and 125 deletions
+65 -14
View File
@@ -4,6 +4,7 @@ import (
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
@@ -677,22 +678,72 @@ func TestConfig_ConversionMethods(t *testing.T) {
})
}
func TestIsValidLanguageCode(t *testing.T) {
validCodes := []string{"en", "es", "fr", "de", "it", "pt", "ru", "ja", "ko", "zh", "ar", "hi"}
invalidCodes := []string{"", "invalid", "xx", "123", "EN", "en-us"}
for _, code := range validCodes {
t.Run("valid_"+code, func(t *testing.T) {
if !isValidLanguageCode(code) {
t.Errorf("isValidLanguageCode(%s) = false, want true", code)
}
})
func TestValidateModelLanguageCompatibility(t *testing.T) {
tests := []struct {
name string
provider string
model string
langCode string
wantErr bool
errContains string
}{
{
name: "auto language always passes",
provider: "groq",
model: "distil-whisper-large-v3-en",
langCode: "",
wantErr: false,
},
{
name: "english model supports english",
provider: "groq",
model: "distil-whisper-large-v3-en",
langCode: "en",
wantErr: false,
},
{
name: "english model rejects spanish",
provider: "groq",
model: "distil-whisper-large-v3-en",
langCode: "es",
wantErr: true,
errContains: "does not support language 'es'",
},
{
name: "multilingual model supports spanish",
provider: "groq",
model: "whisper-large-v3",
langCode: "es",
wantErr: false,
},
{
name: "whisper-cpp english-only rejects french",
provider: "whisper-cpp",
model: "base.en",
langCode: "fr",
wantErr: true,
errContains: "does not support language 'fr'",
},
{
name: "whisper-cpp multilingual supports french",
provider: "whisper-cpp",
model: "base",
langCode: "fr",
wantErr: false,
},
}
for _, code := range invalidCodes {
t.Run("invalid_"+code, func(t *testing.T) {
if isValidLanguageCode(code) {
t.Errorf("isValidLanguageCode(%s) = true, want false", code)
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := ValidateModelLanguageCompatibility(tt.provider, tt.model, tt.langCode)
if tt.wantErr {
if err == nil {
t.Errorf("expected error containing %q, got nil", tt.errContains)
} else if tt.errContains != "" && !strings.Contains(err.Error(), tt.errContains) {
t.Errorf("error = %q, should contain %q", err.Error(), tt.errContains)
}
} else if err != nil {
t.Errorf("unexpected error: %v", err)
}
})
}