You've already forked agentic-coding-workflow
79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync/atomic"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type fakeEndpoint struct {
|
|
ID uuid.UUID
|
|
Provider string
|
|
BaseURL string
|
|
APIKey string
|
|
}
|
|
|
|
type fakeLoader struct {
|
|
endpoints map[uuid.UUID]fakeEndpoint
|
|
calls int32
|
|
}
|
|
|
|
func (l *fakeLoader) Load(ctx context.Context, id uuid.UUID) (Endpoint, error) {
|
|
atomic.AddInt32(&l.calls, 1)
|
|
ep, ok := l.endpoints[id]
|
|
if !ok {
|
|
return Endpoint{}, errors.New("not found")
|
|
}
|
|
return Endpoint{ID: ep.ID, Provider: ep.Provider, BaseURL: ep.BaseURL, APIKey: ep.APIKey}, nil
|
|
}
|
|
|
|
func TestRegistry_CachesByEndpointID(t *testing.T) {
|
|
id := uuid.New()
|
|
loader := &fakeLoader{endpoints: map[uuid.UUID]fakeEndpoint{
|
|
id: {ID: id, Provider: "anthropic", BaseURL: "http://localhost", APIKey: "k"},
|
|
}}
|
|
r := NewRegistry(loader)
|
|
|
|
c1, err := r.GetClient(context.Background(), id)
|
|
require.NoError(t, err)
|
|
c2, err := r.GetClient(context.Background(), id)
|
|
require.NoError(t, err)
|
|
require.Same(t, c1, c2)
|
|
require.Equal(t, int32(1), atomic.LoadInt32(&loader.calls))
|
|
}
|
|
|
|
func TestRegistry_InvalidateForcesReload(t *testing.T) {
|
|
id := uuid.New()
|
|
loader := &fakeLoader{endpoints: map[uuid.UUID]fakeEndpoint{
|
|
id: {ID: id, Provider: "anthropic", BaseURL: "http://localhost", APIKey: "k"},
|
|
}}
|
|
r := NewRegistry(loader)
|
|
_, err := r.GetClient(context.Background(), id)
|
|
require.NoError(t, err)
|
|
r.Invalidate(id)
|
|
_, err = r.GetClient(context.Background(), id)
|
|
require.NoError(t, err)
|
|
require.Equal(t, int32(2), atomic.LoadInt32(&loader.calls))
|
|
}
|
|
|
|
func TestRegistry_UnknownProviderReturnsError(t *testing.T) {
|
|
id := uuid.New()
|
|
loader := &fakeLoader{endpoints: map[uuid.UUID]fakeEndpoint{
|
|
id: {ID: id, Provider: "claude-3-but-typoed"},
|
|
}}
|
|
r := NewRegistry(loader)
|
|
_, err := r.GetClient(context.Background(), id)
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestRegistry_LoaderErrorPropagates(t *testing.T) {
|
|
loader := &fakeLoader{endpoints: map[uuid.UUID]fakeEndpoint{}}
|
|
r := NewRegistry(loader)
|
|
_, err := r.GetClient(context.Background(), uuid.New())
|
|
require.Error(t, err)
|
|
}
|