Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
438 changes: 116 additions & 322 deletions internal/providers/azure/azure_test.go

Large diffs are not rendered by default.

120 changes: 41 additions & 79 deletions internal/providers/azure/realtime_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ package azure
import (
"context"
"net/url"
"strings"
"testing"

"github.com/enterpilot/gomodel/internal/core"
"github.com/enterpilot/gomodel/internal/providers"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestRealtimeTarget(t *testing.T) {
Expand All @@ -19,30 +20,19 @@ func TestRealtimeTarget(t *testing.T) {
}, providers.ProviderOptions{}).(*Provider)

target, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: "gpt-realtime"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
require.NoError(t, err)

u, err := url.Parse(target.URL)
if err != nil {
t.Fatalf("parse target url: %v", err)
}
if u.Scheme != "wss" || u.Host != "myres.openai.azure.com" || u.Path != "/openai/realtime" {
t.Errorf("endpoint = %q, want wss://myres.openai.azure.com/openai/realtime", target.URL)
}
if got := u.Query().Get("deployment"); got != "gpt-realtime" {
t.Errorf("deployment = %q, want gpt-realtime", got)
}
if got := u.Query().Get("api-version"); got != "2025-04-01-preview" {
t.Errorf("api-version = %q, want 2025-04-01-preview", got)
}
require.NoError(t, err)
assert.Equal(t, "wss", u.Scheme)
assert.Equal(t, "myres.openai.azure.com", u.Host)
assert.Equal(t, "/openai/realtime", u.Path)
assert.Equal(t, "gpt-realtime", u.Query().Get("deployment"))
assert.Equal(t, "2025-04-01-preview", u.Query().Get("api-version"))

// Azure authenticates with the api-key header, not Bearer.
if got := target.Headers.Get("api-key"); got != apiKey {
t.Errorf("api-key = %q, want %q", got, apiKey)
}
if target.Headers.Get("Authorization") != "" {
t.Error("Authorization header must not be set for Azure (uses api-key)")
}
assert.Equal(t, apiKey, target.Headers.Get("api-key"))
assert.Empty(t, target.Headers.Get("Authorization"))
}

func TestRealtimeTargetStripsExistingOpenAIPath(t *testing.T) {
Expand All @@ -53,16 +43,11 @@ func TestRealtimeTargetStripsExistingOpenAIPath(t *testing.T) {
} {
p := New(providers.ProviderConfig{APIKey: "k", BaseURL: base}, providers.ProviderOptions{}).(*Provider)
target, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: "m"})
if err != nil {
t.Fatalf("base %q: unexpected error: %v", base, err)
}
require.NoError(t, err)

u, err := url.Parse(target.URL)
if err != nil {
t.Fatalf("base %q: parse target url: %v", base, err)
}
if u.Path != "/openai/realtime" {
t.Errorf("base %q: path = %q, want /openai/realtime", base, u.Path)
}
require.NoError(t, err, "base %q", base)
assert.Equal(t, "/openai/realtime", u.Path, "base %q", base)
}
}

Expand All @@ -72,19 +57,15 @@ func TestRealtimeTargetOmitsAuthWhenNoKey(t *testing.T) {
BaseURL: "https://myres.openai.azure.com",
}, providers.ProviderOptions{}).(*Provider)
target, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: "m"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if _, present := target.Headers["Api-Key"]; present {
t.Error("api-key header should be absent when no key is configured")
}
require.NoError(t, err)
_, present := target.Headers["Api-Key"]
assert.False(t, present)
}

func TestRealtimeTargetMissingModel(t *testing.T) {
p := New(providers.ProviderConfig{APIKey: "k", BaseURL: "https://myres.openai.azure.com"}, providers.ProviderOptions{}).(*Provider)
if _, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: " "}); err == nil {
t.Fatal("expected error for missing model")
}
_, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: " "})
require.Error(t, err)
}

func TestRealtimeCallTarget(t *testing.T) {
Expand All @@ -99,22 +80,13 @@ func TestRealtimeCallTarget(t *testing.T) {
} {
p := New(providers.ProviderConfig{APIKey: apiKey, BaseURL: base}, providers.ProviderOptions{}).(*Provider)
target, err := p.RealtimeCallTarget(context.Background(), &core.RealtimeRequest{Model: "gpt-realtime"})
if err != nil {
t.Fatalf("base %q: unexpected error: %v", base, err)
}
if target.URL != "https://myres.openai.azure.com/openai/v1/realtime/calls" {
t.Errorf("base %q: url = %q, want the GA calls endpoint", base, target.URL)
}
require.NoError(t, err)
assert.Equal(t, "https://myres.openai.azure.com/openai/v1/realtime/calls", target.URL, "base %q", base)

// The GA v1 surface takes no api-version parameter.
if strings.Contains(target.URL, "api-version") {
t.Errorf("base %q: url = %q, want no api-version on the GA surface", base, target.URL)
}
if got := target.Headers.Get("api-key"); got != apiKey {
t.Errorf("base %q: api-key = %q, want %q", base, got, apiKey)
}
if target.Headers.Get("Authorization") != "" {
t.Errorf("base %q: Authorization must not be set for Azure (uses api-key)", base)
}
assert.NotContains(t, target.URL, "api-version", "base %q", base)
assert.Equal(t, apiKey, target.Headers.Get("api-key"), "base %q", base)
assert.Empty(t, target.Headers.Get("Authorization"), "base %q: Azure uses api-key, not Authorization", base)
}
}

Expand All @@ -125,19 +97,14 @@ func TestRealtimeClientSecretTarget(t *testing.T) {
}, providers.ProviderOptions{}).(*Provider)

target, err := p.RealtimeClientSecretTarget(context.Background(), &core.RealtimeRequest{Model: "gpt-realtime"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if target.URL != "https://myres.openai.azure.com/openai/v1/realtime/client_secrets" {
t.Errorf("url = %q, want the GA client secrets endpoint", target.URL)
}
require.NoError(t, err)
assert.Equal(t, "https://myres.openai.azure.com/openai/v1/realtime/client_secrets", target.URL)
}

func TestRealtimeCallTargetMissingModel(t *testing.T) {
p := New(providers.ProviderConfig{APIKey: "k", BaseURL: "https://myres.openai.azure.com"}, providers.ProviderOptions{}).(*Provider)
if _, err := p.RealtimeCallTarget(context.Background(), &core.RealtimeRequest{Model: " "}); err == nil {
t.Fatal("expected error for missing model")
}
_, err := p.RealtimeCallTarget(context.Background(), &core.RealtimeRequest{Model: " "})
require.Error(t, err)
}

func TestRealtimeTargetAttachesByCallID(t *testing.T) {
Expand All @@ -147,21 +114,16 @@ func TestRealtimeTargetAttachesByCallID(t *testing.T) {
}, providers.ProviderOptions{}).(*Provider)

target, err := p.RealtimeTarget(context.Background(), &core.RealtimeRequest{Model: "gpt-realtime", CallID: "rtc_3"})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
require.NoError(t, err)

u, err := url.Parse(target.URL)
if err != nil {
t.Fatalf("parse target url: %v", err)
}
if u.Scheme != "wss" || u.Host != "myres.openai.azure.com" || u.Path != "/openai/v1/realtime" {
t.Errorf("endpoint = %q, want wss://myres.openai.azure.com/openai/v1/realtime", target.URL)
}
if got := u.Query().Get("call_id"); got != "rtc_3" {
t.Errorf("call_id = %q, want rtc_3", got)
}
require.NoError(t, err)
assert.Equal(t, "wss", u.Scheme)
assert.Equal(t, "myres.openai.azure.com", u.Host)
assert.Equal(t, "/openai/v1/realtime", u.Path)
assert.Equal(t, "rtc_3", u.Query().Get("call_id"))

// The GA attach surface takes neither api-version nor deployment.
if u.Query().Has("api-version") || u.Query().Has("deployment") {
t.Errorf("query = %q, want only call_id on the GA attach surface", u.RawQuery)
}
assert.False(t, u.Query().Has("api-version"))
assert.False(t, u.Query().Has("deployment"), "query = %q, want only call_id", u.RawQuery)
}
Loading