package repository import ( "reflect" "sync" "testing" "time" "unsafe" "github.com/imroc/req/v3" "github.com/stretchr/testify/require" ) func forceHTTPVersion(t *testing.T, client *req.Client) string { t.Helper() transport := client.GetTransport() field := reflect.ValueOf(transport).Elem().FieldByName("forceHttpVersion") require.True(t, field.IsValid(), "forceHttpVersion field not found") require.True(t, field.CanAddr(), "forceHttpVersion field not addressable") return reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem().String() } func TestGetSharedReqClient_ForceHTTP2SeparatesCache(t *testing.T) { sharedReqClients = sync.Map{} base := reqClientOptions{ ProxyURL: "http://proxy.local:8080", Timeout: time.Second, } clientDefault := getSharedReqClient(base) force := base force.ForceHTTP2 = true clientForce := getSharedReqClient(force) require.NotSame(t, clientDefault, clientForce) require.NotEqual(t, buildReqClientKey(base), buildReqClientKey(force)) } func TestGetSharedReqClient_ReuseCachedClient(t *testing.T) { sharedReqClients = sync.Map{} opts := reqClientOptions{ ProxyURL: "http://proxy.local:8080", Timeout: 2 * time.Second, } first := getSharedReqClient(opts) second := getSharedReqClient(opts) require.Same(t, first, second) } func TestGetSharedReqClient_IgnoresNonClientCache(t *testing.T) { sharedReqClients = sync.Map{} opts := reqClientOptions{ ProxyURL: " http://proxy.local:8080 ", Timeout: 3 * time.Second, } key := buildReqClientKey(opts) sharedReqClients.Store(key, "invalid") client := getSharedReqClient(opts) require.NotNil(t, client) loaded, ok := sharedReqClients.Load(key) require.True(t, ok) require.IsType(t, "invalid", loaded) } func TestGetSharedReqClient_ImpersonateAndProxy(t *testing.T) { sharedReqClients = sync.Map{} opts := reqClientOptions{ ProxyURL: " http://proxy.local:8080 ", Timeout: 4 * time.Second, Impersonate: true, } client := getSharedReqClient(opts) require.NotNil(t, client) require.Equal(t, "http://proxy.local:8080|4s|true|false", buildReqClientKey(opts)) } func TestCreateOpenAIReqClient_Timeout120Seconds(t *testing.T) { sharedReqClients = sync.Map{} client := createOpenAIReqClient("http://proxy.local:8080") require.Equal(t, 120*time.Second, client.GetClient().Timeout) } func TestCreateGeminiReqClient_ForceHTTP2Disabled(t *testing.T) { sharedReqClients = sync.Map{} client := createGeminiReqClient("http://proxy.local:8080") require.Equal(t, "", forceHTTPVersion(t, client)) }