mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 21:10:51 +08:00
Break out config diffing, hashing, and OpenAI compatibility utilities into a dedicated diff package, update watcher to consume them, and add comprehensive tests for diff logic and watcher behavior.
110 lines
3.3 KiB
Go
110 lines
3.3 KiB
Go
package diff
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
|
|
)
|
|
|
|
func TestSummarizeExcludedModels_NormalizesAndDedupes(t *testing.T) {
|
|
summary := SummarizeExcludedModels([]string{"A", " a ", "B", "b"})
|
|
if summary.count != 2 {
|
|
t.Fatalf("expected 2 unique entries, got %d", summary.count)
|
|
}
|
|
if summary.hash == "" {
|
|
t.Fatal("expected non-empty hash")
|
|
}
|
|
if empty := SummarizeExcludedModels(nil); empty.count != 0 || empty.hash != "" {
|
|
t.Fatalf("expected empty summary for nil input, got %+v", empty)
|
|
}
|
|
}
|
|
|
|
func TestDiffOAuthExcludedModelChanges(t *testing.T) {
|
|
oldMap := map[string][]string{
|
|
"ProviderA": {"model-1", "model-2"},
|
|
"providerB": {"x"},
|
|
}
|
|
newMap := map[string][]string{
|
|
"providerA": {"model-1", "model-3"},
|
|
"providerC": {"y"},
|
|
}
|
|
|
|
changes, affected := DiffOAuthExcludedModelChanges(oldMap, newMap)
|
|
expectContains(t, changes, "oauth-excluded-models[providera]: updated (2 -> 2 entries)")
|
|
expectContains(t, changes, "oauth-excluded-models[providerb]: removed")
|
|
expectContains(t, changes, "oauth-excluded-models[providerc]: added (1 entries)")
|
|
|
|
if len(affected) != 3 {
|
|
t.Fatalf("expected 3 affected providers, got %d", len(affected))
|
|
}
|
|
}
|
|
|
|
func TestSummarizeAmpModelMappings(t *testing.T) {
|
|
summary := SummarizeAmpModelMappings([]config.AmpModelMapping{
|
|
{From: "a", To: "A"},
|
|
{From: "b", To: "B"},
|
|
{From: " ", To: " "}, // ignored
|
|
})
|
|
if summary.count != 2 {
|
|
t.Fatalf("expected 2 entries, got %d", summary.count)
|
|
}
|
|
if summary.hash == "" {
|
|
t.Fatal("expected non-empty hash")
|
|
}
|
|
if empty := SummarizeAmpModelMappings(nil); empty.count != 0 || empty.hash != "" {
|
|
t.Fatalf("expected empty summary for nil input, got %+v", empty)
|
|
}
|
|
if blank := SummarizeAmpModelMappings([]config.AmpModelMapping{{From: " ", To: " "}}); blank.count != 0 || blank.hash != "" {
|
|
t.Fatalf("expected blank mappings ignored, got %+v", blank)
|
|
}
|
|
}
|
|
|
|
func TestSummarizeOAuthExcludedModels_NormalizesKeys(t *testing.T) {
|
|
out := SummarizeOAuthExcludedModels(map[string][]string{
|
|
"ProvA": {"X"},
|
|
"": {"ignored"},
|
|
})
|
|
if len(out) != 1 {
|
|
t.Fatalf("expected only non-empty key summary, got %d", len(out))
|
|
}
|
|
if _, ok := out["prova"]; !ok {
|
|
t.Fatalf("expected normalized key 'prova', got keys %v", out)
|
|
}
|
|
if out["prova"].count != 1 || out["prova"].hash == "" {
|
|
t.Fatalf("unexpected summary %+v", out["prova"])
|
|
}
|
|
if outEmpty := SummarizeOAuthExcludedModels(nil); outEmpty != nil {
|
|
t.Fatalf("expected nil map for nil input, got %v", outEmpty)
|
|
}
|
|
}
|
|
|
|
func TestSummarizeVertexModels(t *testing.T) {
|
|
summary := SummarizeVertexModels([]config.VertexCompatModel{
|
|
{Name: "m1"},
|
|
{Name: " ", Alias: "alias"},
|
|
{}, // ignored
|
|
})
|
|
if summary.count != 2 {
|
|
t.Fatalf("expected 2 vertex models, got %d", summary.count)
|
|
}
|
|
if summary.hash == "" {
|
|
t.Fatal("expected non-empty hash")
|
|
}
|
|
if empty := SummarizeVertexModels(nil); empty.count != 0 || empty.hash != "" {
|
|
t.Fatalf("expected empty summary for nil input, got %+v", empty)
|
|
}
|
|
if blank := SummarizeVertexModels([]config.VertexCompatModel{{Name: " "}}); blank.count != 0 || blank.hash != "" {
|
|
t.Fatalf("expected blank model ignored, got %+v", blank)
|
|
}
|
|
}
|
|
|
|
func expectContains(t *testing.T, list []string, target string) {
|
|
t.Helper()
|
|
for _, entry := range list {
|
|
if entry == target {
|
|
return
|
|
}
|
|
}
|
|
t.Fatalf("expected list to contain %q, got %#v", target, list)
|
|
}
|