Skip to content
Open
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
168 changes: 168 additions & 0 deletions backend/pkg/providers/embeddings/embedder_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package embeddings

import (
"testing"

"pentagi/pkg/config"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestNew_OpenAI(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "openai",
OpenAIKey: "test-key",
OpenAIServerURL: "https://api.openai.com/v1",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}
Comment on lines +19 to +23
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert.NotNil(t, e) doesn't stop the test, and the next line dereferences e via e.IsAvailable(). If New ever returns a nil embedder with a nil error (or the code changes), this will panic rather than produce a clean test failure. Use require.NotNil(t, e) (or guard the dereference) in this and the other tests in this file where e is used after an assert.NotNil.

Copilot uses AI. Check for mistakes.

func TestNew_OpenAI_WithCustomURL(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "openai",
EmbeddingURL: "https://custom-openai.example.com",
EmbeddingKey: "custom-key",
EmbeddingModel: "text-embedding-3-small",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_Ollama(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "ollama",
EmbeddingURL: "http://localhost:11434",
EmbeddingModel: "nomic-embed-text",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_Mistral(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "mistral",
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_Jina(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "jina",
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_Huggingface(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "huggingface",
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_GoogleAI(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "googleai",
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_VoyageAI(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "voyageai",
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.True(t, e.IsAvailable())
}

func TestNew_None(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "none",
}

e, err := New(cfg)
require.NoError(t, err)
assert.NotNil(t, e)
assert.False(t, e.IsAvailable())
}

func TestNew_UnsupportedProvider(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: "unknown-provider",
}

e, err := New(cfg)
assert.Error(t, err)
assert.Contains(t, err.Error(), "unsupported embedding provider")
assert.NotNil(t, e)
assert.False(t, e.IsAvailable())
}
Comment on lines +128 to +133
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this test, assert.Error(t, err) and assert.Contains(t, err.Error(), ...) are used back-to-back. Since assert.Error doesn't stop execution, a nil err would cause a panic when calling err.Error(). Prefer require.Error(t, err) (or guard err before dereferencing) so failures are reported cleanly.

Copilot uses AI. Check for mistakes.

func TestNew_AllProviders_TableDriven(t *testing.T) {
providers := []struct {
name string
provider string
available bool
}{
{"openai", "openai", true},
{"ollama", "ollama", true},
{"mistral", "mistral", true},
{"jina", "jina", true},
{"huggingface", "huggingface", true},
{"googleai", "googleai", true},
{"voyageai", "voyageai", true},
{"none", "none", false},
}

for _, tt := range providers {
t.Run(tt.name, func(t *testing.T) {
cfg := &config.Config{
EmbeddingProvider: tt.provider,
EmbeddingKey: "test-key",
}

e, err := New(cfg)
require.NoError(t, err)
assert.Equal(t, tt.available, e.IsAvailable())
})
}
}

func TestIsAvailable_NilEmbedder(t *testing.T) {
e := &embedder{nil}
assert.False(t, e.IsAvailable())
}
Loading