mirror of
https://github.com/netbirdio/netbird.git
synced 2026-08-30 11:31:29 +02:00
125 lines
4.8 KiB
Go
125 lines
4.8 KiB
Go
package agentnetwork
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/netbirdio/netbird/management/internals/modules/agentnetwork/catalog"
|
|
"github.com/netbirdio/netbird/management/internals/modules/agentnetwork/types"
|
|
)
|
|
|
|
func TestPrepareProviderAPIKey(t *testing.T) {
|
|
t.Run("required create rejects an empty key", func(t *testing.T) {
|
|
provider := &types.Provider{ProviderID: "openai_api"}
|
|
err := prepareProviderAPIKey(provider, nil)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "api_key is required")
|
|
})
|
|
|
|
t.Run("Ollama Cloud requires a key", func(t *testing.T) {
|
|
provider := &types.Provider{ProviderID: "ollama_cloud"}
|
|
err := prepareProviderAPIKey(provider, nil)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "api_key is required")
|
|
})
|
|
|
|
t.Run("Ollama Cloud accepts a key", func(t *testing.T) {
|
|
provider := &types.Provider{
|
|
ProviderID: "ollama_cloud",
|
|
APIKey: "ollama-cloud-key",
|
|
APIKeyProvided: true,
|
|
}
|
|
require.NoError(t, prepareProviderAPIKey(provider, nil))
|
|
assert.Equal(t, "ollama-cloud-key", provider.APIKey)
|
|
})
|
|
|
|
t.Run("optional create accepts an empty key", func(t *testing.T) {
|
|
provider := &types.Provider{ProviderID: "ollama"}
|
|
require.NoError(t, prepareProviderAPIKey(provider, nil))
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("optional update omission preserves the existing key", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "ollama", APIKey: "existing"}
|
|
provider := &types.Provider{ProviderID: "ollama"}
|
|
require.NoError(t, prepareProviderAPIKey(provider, existing))
|
|
assert.Equal(t, "existing", provider.APIKey)
|
|
})
|
|
|
|
t.Run("optional update explicit empty clears the existing key", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "ollama", APIKey: "existing"}
|
|
provider := &types.Provider{ProviderID: "ollama", APIKeyProvided: true}
|
|
require.NoError(t, prepareProviderAPIKey(provider, existing))
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("changing to optional without a key does not carry the old secret", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "openai_api", APIKey: "sk-old-provider"}
|
|
provider := &types.Provider{ProviderID: "ollama"}
|
|
require.NoError(t, prepareProviderAPIKey(provider, existing))
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("changing to required without a key fails", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "ollama", APIKey: "old-optional-key"}
|
|
provider := &types.Provider{ProviderID: "openai_api"}
|
|
err := prepareProviderAPIKey(provider, existing)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "api_key is required")
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("required update omission preserves the existing key", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "openai_api", APIKey: "sk-existing"}
|
|
provider := &types.Provider{ProviderID: "openai_api"}
|
|
require.NoError(t, prepareProviderAPIKey(provider, existing))
|
|
assert.Equal(t, "sk-existing", provider.APIKey)
|
|
})
|
|
|
|
t.Run("required update rejects a preserved whitespace-only key", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "openai_api", APIKey: " "}
|
|
provider := &types.Provider{ProviderID: "openai_api"}
|
|
err := prepareProviderAPIKey(provider, existing)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "api_key is required")
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("required update explicit empty is rejected", func(t *testing.T) {
|
|
existing := &types.Provider{ProviderID: "openai_api", APIKey: "sk-existing"}
|
|
provider := &types.Provider{ProviderID: "openai_api", APIKeyProvided: true}
|
|
err := prepareProviderAPIKey(provider, existing)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "api_key is required")
|
|
})
|
|
|
|
t.Run("unknown catalog provider is rejected", func(t *testing.T) {
|
|
provider := &types.Provider{ProviderID: "unknown", APIKey: "secret"}
|
|
err := prepareProviderAPIKey(provider, nil)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "not a known catalog provider")
|
|
})
|
|
|
|
t.Run("none mode clears a stale key", func(t *testing.T) {
|
|
entry := catalog.Provider{ID: "authless", AuthMode: catalog.AuthModeNone}
|
|
existing := &types.Provider{ProviderID: "authless", APIKey: "stale-secret"}
|
|
provider := &types.Provider{ProviderID: "authless"}
|
|
require.NoError(t, prepareProviderAPIKeyForEntry(provider, existing, entry))
|
|
assert.Empty(t, provider.APIKey)
|
|
})
|
|
|
|
t.Run("none mode rejects a supplied key", func(t *testing.T) {
|
|
entry := catalog.Provider{ID: "authless", AuthMode: catalog.AuthModeNone}
|
|
provider := &types.Provider{
|
|
ProviderID: "authless",
|
|
APIKey: "unexpected-secret",
|
|
APIKeyProvided: true,
|
|
}
|
|
err := prepareProviderAPIKeyForEntry(provider, nil, entry)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "not supported")
|
|
})
|
|
}
|