yao/neo/assistant/cache_test.go
Max d0d110b0ec Refactor assistant management and enhance storage retrieval in Neo API
- Removed Weaviate store implementation, streamlining the codebase and focusing on Mongo and Redis backends.
- Introduced GetAssistant method in both Mongo and Redis stores to retrieve a single assistant by ID, improving data access capabilities.
- Updated LoadStore function to utilize the new storage retrieval logic, enhancing the assistant loading process.
- Enhanced the Assistant struct to include a Script field for better management of assistant scripts.
- Improved tests to cover the new GetAssistant functionality, ensuring robust error handling and data retrieval across different scenarios.
2025-01-01 12:31:47 +08:00

151 lines
3.1 KiB
Go

package assistant
import (
"sync"
"testing"
)
func TestCache_Basic(t *testing.T) {
cache := NewCache(2)
// Test empty cache
if cache.Len() != 0 {
t.Errorf("Expected empty cache, got length %d", cache.Len())
}
// Test adding items
assistant1 := &Assistant{ID: "1", Name: "Test1"}
assistant2 := &Assistant{ID: "2", Name: "Test2"}
cache.Put(assistant1)
cache.Put(assistant2)
if cache.Len() != 2 {
t.Errorf("Expected cache length 2, got %d", cache.Len())
}
// Test getting items
if a, exists := cache.Get("1"); !exists || a.ID != "1" {
t.Error("Failed to get assistant1")
}
if a, exists := cache.Get("2"); !exists || a.ID != "2" {
t.Error("Failed to get assistant2")
}
}
func TestCache_LRU(t *testing.T) {
cache := NewCache(2)
assistant1 := &Assistant{ID: "1", Name: "Test1"}
assistant2 := &Assistant{ID: "2", Name: "Test2"}
assistant3 := &Assistant{ID: "3", Name: "Test3"}
// Add first two items
cache.Put(assistant1)
cache.Put(assistant2)
// Access assistant1 to make it most recently used
cache.Get("1")
// Add third item, should evict assistant2
cache.Put(assistant3)
// Check assistant2 was evicted
if _, exists := cache.Get("2"); exists {
t.Error("Assistant2 should have been evicted")
}
// Check assistant1 and assistant3 are still present
if _, exists := cache.Get("1"); !exists {
t.Error("Assistant1 should still be in cache")
}
if _, exists := cache.Get("3"); !exists {
t.Error("Assistant3 should be in cache")
}
}
func TestCache_Remove(t *testing.T) {
cache := NewCache(2)
assistant1 := &Assistant{ID: "1", Name: "Test1"}
cache.Put(assistant1)
// Test remove existing item
cache.Remove("1")
if cache.Len() != 0 {
t.Error("Cache should be empty after removing item")
}
// Test remove non-existing item
cache.Remove("nonexistent")
if cache.Len() != 0 {
t.Error("Cache length should not change when removing non-existent item")
}
}
func TestCache_Clear(t *testing.T) {
cache := NewCache(2)
assistant1 := &Assistant{ID: "1", Name: "Test1"}
assistant2 := &Assistant{ID: "2", Name: "Test2"}
cache.Put(assistant1)
cache.Put(assistant2)
cache.Clear()
if cache.Len() != 0 {
t.Error("Cache should be empty after clear")
}
}
func TestCache_Concurrent(t *testing.T) {
cache := NewCache(100)
var wg sync.WaitGroup
workers := 10
iterations := 100
// Concurrent writes
for i := 0; i < workers; i++ {
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for j := 0; j < iterations; j++ {
assistant := &Assistant{
ID: string(rune('A' + workerID)),
Name: "Test",
}
cache.Put(assistant)
}
}(i)
}
// Concurrent reads
for i := 0; i < workers; i++ {
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for j := 0; j < iterations; j++ {
cache.Get(string(rune('A' + workerID)))
}
}(i)
}
wg.Wait()
}
func TestCache_NilInput(t *testing.T) {
cache := NewCache(2)
// Test putting nil assistant
cache.Put(nil)
if cache.Len() != 0 {
t.Error("Cache should not store nil assistant")
}
// Test putting assistant with empty ID
cache.Put(&Assistant{ID: "", Name: "Test"})
if cache.Len() != 0 {
t.Error("Cache should not store assistant with empty ID")
}
}