summaryrefslogtreecommitdiff
path: root/internal/catalog/catalog_test.go
blob: 2ce877938df117994c12cdf2ba0ce904d706fda0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package catalog

import (
	"testing"

	"aigw/internal/domain"
)

func TestCatalogReplaceSwapsModelSnapshot(t *testing.T) {
	openAI := domain.Provider{ID: "openai", Protocol: domain.ProtocolOpenAI}
	anthropic := domain.Provider{ID: "anthropic", Protocol: domain.ProtocolAnthropic}
	catalog := NewModels([]domain.Model{{
		ID: "old", Routes: []domain.Route{{Provider: openAI, UpstreamModel: "old-upstream"}},
	}})

	catalog.Replace([]domain.Model{{
		ID: "new", Routes: []domain.Route{{Provider: anthropic, UpstreamModel: "new-upstream"}},
	}})
	if _, err := catalog.Model("old"); err == nil {
		t.Fatal("old model remained after snapshot replacement")
	}
	model, err := catalog.Model("new")
	if err != nil || len(model.Routes) != 1 || model.Routes[0].Provider.ID != "anthropic" {
		t.Fatalf("new model was not loaded: model=%+v err=%v", model, err)
	}
	if got := catalog.Models(domain.ProtocolOpenAI); len(got) != 0 {
		t.Fatalf("unexpected OpenAI models after replacement: %+v", got)
	}
}

func TestCatalogReplaceCopiesRouteSlices(t *testing.T) {
	models := []domain.Model{{ID: "model", Routes: []domain.Route{{UpstreamModel: "before"}}}}
	catalog := NewModels(models)
	models[0].Routes[0].UpstreamModel = "after"

	model, err := catalog.Model("model")
	if err != nil {
		t.Fatal(err)
	}
	if model.Routes[0].UpstreamModel != "before" {
		t.Fatal("catalog snapshot aliases the caller's route slice")
	}
}

func TestModelRestrictionIsAppliedBeforeCatalogAccess(t *testing.T) {
	principal := domain.Principal{AllowedModels: map[string]struct{}{"model/allowed": {}}}
	if !(domain.Model{ID: "model/allowed"}).Allows(principal) {
		t.Fatal("allowed model was rejected")
	}
	if (domain.Model{ID: "model/other"}).Allows(principal) {
		t.Fatal("model outside the API key restriction was allowed")
	}
}