253 lines
5.8 KiB
Go
253 lines
5.8 KiB
Go
package store
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestFileStore_NewFileStore(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, store)
|
|
assert.Equal(t, filePath, store.filePath)
|
|
assert.Equal(t, filepath.Join(tempDir, "chats"), store.chatDir)
|
|
}
|
|
|
|
func TestFileStore_SaveChat(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
chat := &Chat{
|
|
Title: "Test Chat",
|
|
}
|
|
|
|
err = store.SaveChat(chat)
|
|
require.NoError(t, err)
|
|
assert.NotEqual(t, uuid.Nil, chat.ID)
|
|
assert.False(t, chat.CreatedAt.IsZero())
|
|
|
|
// Verify the file was created
|
|
chatFile := filepath.Join(store.chatDir, chat.ID.String()+".json")
|
|
_, err = os.Stat(chatFile)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestFileStore_GetChat(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
// Create and save a chat
|
|
chat := &Chat{
|
|
Title: "Test Chat",
|
|
}
|
|
err = store.SaveChat(chat)
|
|
require.NoError(t, err)
|
|
|
|
// Retrieve the chat
|
|
retrievedChat, err := store.GetChat(chat.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, chat.ID, retrievedChat.ID)
|
|
assert.Equal(t, chat.Title, retrievedChat.Title)
|
|
}
|
|
|
|
func TestFileStore_GetChat_NotFound(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
_, err = store.GetChat(uuid.New())
|
|
assert.ErrorIs(t, err, ErrChatNotFound)
|
|
}
|
|
|
|
func TestFileStore_DeleteChat(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
// Create and save a chat
|
|
chat := &Chat{
|
|
Title: "Test Chat",
|
|
}
|
|
err = store.SaveChat(chat)
|
|
require.NoError(t, err)
|
|
|
|
// Verify the file was created
|
|
chatFile := filepath.Join(store.chatDir, chat.ID.String()+".json")
|
|
_, err = os.Stat(chatFile)
|
|
assert.NoError(t, err)
|
|
|
|
// Delete the chat
|
|
err = store.DeleteChat(chat.ID)
|
|
require.NoError(t, err)
|
|
|
|
// Verify the file was deleted
|
|
_, err = os.Stat(chatFile)
|
|
assert.True(t, os.IsNotExist(err))
|
|
}
|
|
|
|
func TestFileStore_DeleteChat_NotFound(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
err = store.DeleteChat(uuid.New())
|
|
assert.ErrorIs(t, err, ErrChatNotFound)
|
|
}
|
|
|
|
func TestFileStore_ListChats(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
// Create and save multiple chats
|
|
chat1 := &Chat{Title: "Chat 1"}
|
|
chat2 := &Chat{Title: "Chat 2"}
|
|
|
|
err = store.SaveChat(chat1)
|
|
require.NoError(t, err)
|
|
|
|
err = store.SaveChat(chat2)
|
|
require.NoError(t, err)
|
|
|
|
// List all chats
|
|
chats, err := store.ListChats()
|
|
require.NoError(t, err)
|
|
assert.Len(t, chats, 2)
|
|
}
|
|
|
|
func TestFileStore_SaveChatMessage(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
// Create and save a chat
|
|
chat := &Chat{Title: "Test Chat"}
|
|
err = store.SaveChat(chat)
|
|
require.NoError(t, err)
|
|
|
|
// Create and save a message
|
|
message := &Message{
|
|
ChatID: chat.ID,
|
|
Role: "user",
|
|
Content: "Hello",
|
|
}
|
|
|
|
err = store.SaveChatMessage(message)
|
|
require.NoError(t, err)
|
|
assert.NotEqual(t, uuid.Nil, message.ID)
|
|
assert.False(t, message.CreatedAt.IsZero())
|
|
|
|
// Verify the chat file was updated
|
|
chatFile := filepath.Join(store.chatDir, chat.ID.String()+".json")
|
|
_, err = os.Stat(chatFile)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestFileStore_SaveChatMessage_InvalidChatID(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
message := &Message{
|
|
ChatID: uuid.Nil,
|
|
Role: "user",
|
|
Content: "Hello",
|
|
}
|
|
|
|
err = store.SaveChatMessage(message)
|
|
assert.ErrorIs(t, err, ErrNilChatID)
|
|
}
|
|
|
|
func TestFileStore_SaveChatMessage_ChatNotFound(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
message := &Message{
|
|
ChatID: uuid.New(),
|
|
Role: "user",
|
|
Content: "Hello",
|
|
}
|
|
|
|
err = store.SaveChatMessage(message)
|
|
assert.ErrorIs(t, err, ErrChatNotFound)
|
|
}
|
|
|
|
func TestFileStore_SaveSettings(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
settings := &Settings{
|
|
APIEndpoint: "http://example.com",
|
|
ImageEditSelector: ".image-edit",
|
|
ImageGenerationSelector: ".image-gen",
|
|
TextGenerationSelector: ".text-gen",
|
|
}
|
|
|
|
err = store.SaveSettings(settings)
|
|
require.NoError(t, err)
|
|
|
|
// Verify the settings file was created
|
|
_, err = os.Stat(filePath)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestFileStore_GetSettings(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
filePath := filepath.Join(tempDir, "test.json")
|
|
|
|
store, err := NewFileStore(filePath)
|
|
require.NoError(t, err)
|
|
|
|
// Get settings when none exist
|
|
settings, err := store.GetSettings()
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, settings)
|
|
|
|
// Set some settings
|
|
settings = &Settings{
|
|
APIEndpoint: "http://example.com",
|
|
ImageEditSelector: ".image-edit",
|
|
ImageGenerationSelector: ".image-gen",
|
|
TextGenerationSelector: ".text-gen",
|
|
}
|
|
err = store.SaveSettings(settings)
|
|
require.NoError(t, err)
|
|
|
|
// Get the settings
|
|
settings, err = store.GetSettings()
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "http://example.com", settings.APIEndpoint)
|
|
}
|