Skip to content
Merged
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
108 changes: 106 additions & 2 deletions stores/bolt/bolt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func TestBoltStore(t *testing.T) {
tempDir, err := os.MkdirTemp("", "boltdb-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

// Create a temporary file for the test
tempFile := filepath.Join(tempDir, "test-embeddings.db")

Expand Down Expand Up @@ -70,7 +70,7 @@ func TestBoltStoreCancellation(t *testing.T) {
tempDir, err := os.MkdirTemp("", "boltdb-cancel-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

// Create a temporary file for the test
tempFile := filepath.Join(tempDir, "test-embeddings-cancel.db")

Expand All @@ -96,4 +96,108 @@ func TestBoltStoreCancellation(t *testing.T) {
// Test retrieving with cancelled context
_, err = store.Get(ctx, utterance.Utterance)
assert.Error(t, err)
}

// Test to ensure setting the same key overwrites the previous value.
func TestBoltStoreOverwriteExistingKey(t *testing.T) {
tempDir, err := os.MkdirTemp("", "overwrite-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

dbFile := filepath.Join(tempDir, "overwrite.db")
store, err := boltstore.NewStore(dbFile)
require.NoError(t, err)
defer store.Close()

ctx := context.Background()
key := "overwrite-key"
firstEmbed := []float64{1.1, 2.2}
require.NoError(t, store.Set(ctx, semanticrouter.Utterance{Utterance: key, Embed: firstEmbed}))

secondEmbed := []float64{3.3, 4.4}
require.NoError(t, store.Set(ctx, semanticrouter.Utterance{Utterance: key, Embed: secondEmbed}))

retrieved, err := store.Get(ctx, key)
require.NoError(t, err)
assert.Equal(t, secondEmbed, retrieved)
}

// Test storing and retrieving multiple distinct keys.
func TestBoltStoreMultipleKeys(t *testing.T) {
tempDir, err := os.MkdirTemp("", "multiple-keys-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

dbFile := filepath.Join(tempDir, "multiple.db")
store, err := boltstore.NewStore(dbFile)
require.NoError(t, err)
defer store.Close()

ctx := context.Background()
entries := []semanticrouter.Utterance{
{Utterance: "one", Embed: []float64{1.0}},
{Utterance: "two", Embed: []float64{2.0, 2.1}},
{Utterance: "three", Embed: []float64{3.0, 3.1, 3.2}},
}
for _, e := range entries {
require.NoError(t, store.Set(ctx, e))
}
for _, e := range entries {
retrieved, err := store.Get(ctx, e.Utterance)
require.NoError(t, err)
assert.Equal(t, e.Embed, retrieved)
}
}

// Test setting and retrieving an empty embedding slice.
func TestBoltStoreEmptyEmbedding(t *testing.T) {
tempDir, err := os.MkdirTemp("", "empty-embed-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

dbFile := filepath.Join(tempDir, "empty.db")
store, err := boltstore.NewStore(dbFile)
require.NoError(t, err)
defer store.Close()

ctx := context.Background()
entry := semanticrouter.Utterance{Utterance: "empty", Embed: []float64{}}
require.NoError(t, store.Set(ctx, entry))

retrieved, err := store.Get(ctx, entry.Utterance)
require.NoError(t, err)
assert.Empty(t, retrieved)
}

// Test behavior after closing the store: all operations should return an error.
func TestBoltStoreCloseBehavior(t *testing.T) {
tempDir, err := os.MkdirTemp("", "close-behavior-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

dbFile := filepath.Join(tempDir, "close.db")
store, err := boltstore.NewStore(dbFile)
require.NoError(t, err)
require.NoError(t, store.Close())

ctx := context.Background()
entry := semanticrouter.Utterance{Utterance: "post-close", Embed: []float64{0.0}}

err = store.Set(ctx, entry)
assert.Error(t, err)

_, err = store.Get(ctx, entry.Utterance)
assert.Error(t, err)
}

// Test NewStore returns an error when the parent directory does not exist.
func TestBoltStoreNewStoreInvalidPath(t *testing.T) {
tempDir, err := os.MkdirTemp("", "invalid-path-test")
require.NoError(t, err)
defer os.RemoveAll(tempDir)

invalidDir := filepath.Join(tempDir, "no-such-dir")
invalidFile := filepath.Join(invalidDir, "db.db")
_, err = boltstore.NewStore(invalidFile)
assert.Error(t, err)
}