Files
gochat/internal/service/search_indexer_hooks_test.go
T

215 lines
8.1 KiB
Go

package service
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/gochat/gochat/internal/model"
"github.com/gochat/gochat/internal/repository"
)
type mockServiceSearchIndexer struct {
indexed []string
deleted []string
indexedContactLabels map[uint][]string
indexedConversationIDs []uint
indexedConversationNames []string
}
func (m *mockServiceSearchIndexer) IndexConversation(ctx context.Context, conversation *model.Conversation) error {
m.indexed = append(m.indexed, "conversation")
if conversation != nil {
m.indexedConversationIDs = append(m.indexedConversationIDs, conversation.ID)
if conversation.Contact != nil {
m.indexedConversationNames = append(m.indexedConversationNames, conversation.Contact.Name)
}
}
return nil
}
func (m *mockServiceSearchIndexer) DeleteConversation(ctx context.Context, accountID uint, id uint) error {
m.deleted = append(m.deleted, "conversation")
return nil
}
func (m *mockServiceSearchIndexer) IndexMessage(ctx context.Context, message *model.Message) error {
m.indexed = append(m.indexed, "message")
return nil
}
func (m *mockServiceSearchIndexer) DeleteMessage(ctx context.Context, accountID uint, id uint) error {
m.deleted = append(m.deleted, "message")
return nil
}
func (m *mockServiceSearchIndexer) IndexContact(ctx context.Context, contact *model.Contact) error {
m.indexed = append(m.indexed, "contact")
if contact != nil {
if m.indexedContactLabels == nil {
m.indexedContactLabels = map[uint][]string{}
}
m.indexedContactLabels[contact.ID] = append([]string(nil), contact.Labels...)
}
return nil
}
func (m *mockServiceSearchIndexer) DeleteContact(ctx context.Context, accountID uint, id uint) error {
m.deleted = append(m.deleted, "contact")
return nil
}
func (m *mockServiceSearchIndexer) IndexCompany(ctx context.Context, company *model.Company) error {
m.indexed = append(m.indexed, "company")
return nil
}
func (m *mockServiceSearchIndexer) DeleteCompany(ctx context.Context, accountID uint, id uint) error {
m.deleted = append(m.deleted, "company")
return nil
}
func (m *mockServiceSearchIndexer) IndexArticle(ctx context.Context, article *model.Article) error {
m.indexed = append(m.indexed, "article")
return nil
}
func (m *mockServiceSearchIndexer) DeleteArticle(ctx context.Context, accountID uint, id uint) error {
m.deleted = append(m.deleted, "article")
return nil
}
func TestConversationService_SearchIndexHooks(t *testing.T) {
svc, db := setupConversationService(t)
indexer := &mockServiceSearchIndexer{}
svc.SetSearchIndexer(indexer)
account := createConversationServiceTestAccount(t, db)
inbox := createConversationServiceTestInbox(t, db, account.ID)
contact := createConversationServiceTestContact(t, db, account.ID)
conversation, err := svc.Create(context.Background(), account.ID, CreateConversationRequest{InboxID: inbox.ID, ContactID: contact.ID})
require.NoError(t, err)
_, err = svc.UpdatePriority(context.Background(), account.ID, conversation.ID, "high")
require.NoError(t, err)
require.NoError(t, svc.Delete(context.Background(), account.ID, conversation.ID))
assert.Equal(t, []string{"conversation", "conversation"}, indexer.indexed)
assert.Equal(t, []string{"conversation"}, indexer.deleted)
}
func TestMessageService_SearchIndexHooks(t *testing.T) {
db, _, _, svc := setupMessageServiceWithDefaultLLM(t)
indexer := &mockServiceSearchIndexer{}
svc.SetSearchIndexer(indexer)
account := createTestAccount(t, db)
user := createTestUser(t, db, account.ID)
inbox := createTestInbox(t, db, account.ID, "web_widget")
contact := createTestContact(t, db, account.ID)
conversation := createTestConversation(t, db, account.ID, inbox.ID, contact.ID)
message, err := svc.Create(context.Background(), account.ID, user.ID, CreateMessageRequest{ConversationID: conversation.ID, Content: "hello", MessageType: "outgoing"})
require.NoError(t, err)
_, err = svc.Update(context.Background(), account.ID, message.ID, UpdateMessageRequest{Content: "updated"})
require.NoError(t, err)
_, err = svc.Delete(context.Background(), account.ID, message.ID)
require.NoError(t, err)
assert.Equal(t, []string{"message", "message"}, indexer.indexed)
assert.Equal(t, []string{"message"}, indexer.deleted)
}
func TestContactService_SearchIndexHooks(t *testing.T) {
db := setupServiceTestDB(t)
repo := NewContactService(repository.NewContactRepo(db), nil, nil)
indexer := &mockServiceSearchIndexer{}
repo.SetSearchIndexer(indexer)
account := createTestAccount(t, db)
contact, err := repo.Create(context.Background(), account.ID, CreateContactRequest{Name: "Ada", Email: "ada@example.com"})
require.NoError(t, err)
_, err = repo.Update(context.Background(), account.ID, contact.ID, UpdateContactRequest{Name: "Ada Lovelace"})
require.NoError(t, err)
require.NoError(t, repo.Delete(context.Background(), account.ID, contact.ID))
assert.Equal(t, []string{"contact", "contact"}, indexer.indexed)
assert.Equal(t, []string{"contact"}, indexer.deleted)
}
func TestContactService_SearchIndexHooksReindexContactConversations(t *testing.T) {
db := setupServiceTestDB(t)
repo := NewContactService(repository.NewContactRepo(db), nil, nil)
indexer := &mockServiceSearchIndexer{}
repo.SetSearchIndexer(indexer)
account := createTestAccount(t, db)
contact, err := repo.Create(context.Background(), account.ID, CreateContactRequest{Name: "Ada", Email: "ada@example.com"})
require.NoError(t, err)
inbox := createTestInbox(t, db, account.ID, "web_widget")
conversation := createTestConversation(t, db, account.ID, inbox.ID, contact.ID)
indexer.indexed = nil
indexer.indexedConversationIDs = nil
indexer.indexedConversationNames = nil
_, err = repo.Update(context.Background(), account.ID, contact.ID, UpdateContactRequest{Name: "Ada Lovelace"})
require.NoError(t, err)
assert.Equal(t, []string{"contact", "conversation"}, indexer.indexed)
assert.Equal(t, []uint{conversation.ID}, indexer.indexedConversationIDs)
assert.Equal(t, []string{"Ada Lovelace"}, indexer.indexedConversationNames)
}
func TestContactService_UpdateLabelsSearchIndexHookIncludesLabels(t *testing.T) {
db := setupServiceTestDB(t)
repo := NewContactService(repository.NewContactRepo(db), nil, nil)
indexer := &mockServiceSearchIndexer{}
repo.SetSearchIndexer(indexer)
account := createTestAccount(t, db)
contact, err := repo.Create(context.Background(), account.ID, CreateContactRequest{Name: "Ada", Email: "ada@example.com"})
require.NoError(t, err)
indexer.indexed = nil
labels, err := repo.UpdateLabels(context.Background(), account.ID, contact.ID, []string{"vip", "trial"})
require.NoError(t, err)
assert.Equal(t, []string{"vip", "trial"}, labels)
assert.Equal(t, []string{"contact"}, indexer.indexed)
assert.Equal(t, []string{"vip", "trial"}, indexer.indexedContactLabels[contact.ID])
}
func TestCompanyService_SearchIndexHooks(t *testing.T) {
db, _, _, _, svc := setupCompanyServiceTest(t)
indexer := &mockServiceSearchIndexer{}
svc.SetSearchIndexer(indexer)
account := createTestAccount(t, db)
company, err := svc.Create(context.Background(), account.ID, &CreateCompanyRequest{Name: "Acme"})
require.NoError(t, err)
_, err = svc.Update(context.Background(), company.ID, account.ID, &UpdateCompanyRequest{Name: "Acme Inc"})
require.NoError(t, err)
require.NoError(t, svc.Delete(context.Background(), company.ID, account.ID))
assert.Equal(t, []string{"company", "company"}, indexer.indexed)
assert.Equal(t, []string{"company"}, indexer.deleted)
}
func TestArticleService_SearchIndexHooks(t *testing.T) {
_, _, svc := setupArticleService(t)
indexer := &mockServiceSearchIndexer{}
svc.SetSearchIndexer(indexer)
article, err := svc.CreateWithAccount(context.Background(), 7, 3, 1, &CreateArticleRequest{Title: "Install", Slug: "install"})
require.NoError(t, err)
newTitle := "Install GoChat"
_, err = svc.Update(context.Background(), article.ID, &UpdateArticleRequest{Title: &newTitle})
require.NoError(t, err)
require.NoError(t, svc.Delete(context.Background(), article.ID))
assert.Equal(t, []string{"article", "article"}, indexer.indexed)
assert.Equal(t, []string{"article"}, indexer.deleted)
}