Files
gochat/internal/repository/inbox_member_repo_test.go
T
2026-06-04 15:44:48 +08:00

243 lines
7.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package repository
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/gorm"
"github.com/gochat/gochat/internal/model"
)
// Helper: create prerequisite Account + User + Inbox.
func createInboxMemberPrereqs(t *testing.T, db *gorm.DB) (*model.Account, *model.User, *model.Inbox) {
t.Helper()
account := &model.Account{Name: "IMTestOrg", Locale: "en", Active: true}
require.NoError(t, db.Create(account).Error)
user := &model.User{Name: "IMTestUser", Email: "im@example.com", Provider: "email"}
require.NoError(t, db.Create(user).Error)
inbox := &model.Inbox{AccountID: account.ID, Name: "IMTestInbox", ChannelType: "web_widget", ChannelID: 1}
require.NoError(t, db.Create(inbox).Error)
return account, user, inbox
}
// Helper: create a test InboxMember with all prerequisites.
func createTestInboxMember(t *testing.T, db *gorm.DB, role string) *model.InboxMember {
t.Helper()
_, user, inbox := createInboxMemberPrereqs(t, db)
im := &model.InboxMember{
InboxID: inbox.ID,
UserID: user.ID,
Role: role,
}
require.NoError(t, db.Create(im).Error)
return im
}
// ========== 1. FindByID ==========
// 1a. FindByID – success
func TestInboxMemberRepo_FindByID(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
im := createTestInboxMember(t, db, "agent")
found, err := repo.FindByID(context.Background(), im.ID)
assert.NoError(t, err)
assert.Equal(t, im.ID, found.ID)
assert.Equal(t, im.InboxID, found.InboxID)
assert.Equal(t, im.UserID, found.UserID)
assert.Equal(t, "agent", found.Role)
}
// 1b. FindByID – not found
func TestInboxMemberRepo_FindByID_NotFound(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
found, err := repo.FindByID(context.Background(), 9999)
assert.Error(t, err)
assert.Nil(t, found)
}
// ========== 2. FindByInboxAndUser ==========
// 2a. FindByInboxAndUser – success
func TestInboxMemberRepo_FindByInboxAndUser(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
im := createTestInboxMember(t, db, "supervisor")
found, err := repo.FindByInboxAndUser(context.Background(), im.InboxID, im.UserID)
assert.NoError(t, err)
assert.Equal(t, im.ID, found.ID)
assert.Equal(t, im.InboxID, found.InboxID)
assert.Equal(t, im.UserID, found.UserID)
assert.Equal(t, "supervisor", found.Role)
}
// 2b. FindByInboxAndUser – not found
func TestInboxMemberRepo_FindByInboxAndUser_NotFound(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
found, err := repo.FindByInboxAndUser(context.Background(), 8888, 9999)
assert.Error(t, err)
assert.Nil(t, found)
}
// ========== 3. FindByInbox ==========
// 3. FindByInbox – returns all members assigned to an inbox (with User preloaded)
func TestInboxMemberRepo_FindByInbox(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
_, user1, inbox := createInboxMemberPrereqs(t, db)
// Create a second user
user2 := &model.User{Name: "IMTestUser2", Email: "im2@example.com", Provider: "email"}
require.NoError(t, db.Create(user2).Error)
im1 := &model.InboxMember{InboxID: inbox.ID, UserID: user1.ID, Role: "agent"}
require.NoError(t, db.Create(im1).Error)
im2 := &model.InboxMember{InboxID: inbox.ID, UserID: user2.ID, Role: "supervisor"}
require.NoError(t, db.Create(im2).Error)
members, err := repo.FindByInbox(context.Background(), inbox.ID)
assert.NoError(t, err)
assert.Len(t, members, 2)
// Verify User is preloaded
assert.Equal(t, "IMTestUser", members[0].User.Name)
assert.Equal(t, "IMTestUser2", members[1].User.Name)
// Verify ordering by ID ASC
assert.Equal(t, im1.ID, members[0].ID)
assert.Equal(t, im2.ID, members[1].ID)
}
// ========== 4. FindByUser ==========
// 4. FindByUser – returns all inboxes a user is assigned to (with Inbox preloaded)
func TestInboxMemberRepo_FindByUser(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
account, user, inbox1 := createInboxMemberPrereqs(t, db)
// Create a second inbox under the same account
inbox2 := &model.Inbox{AccountID: account.ID, Name: "IMTestInbox2", ChannelType: "api", ChannelID: 2}
require.NoError(t, db.Create(inbox2).Error)
im1 := &model.InboxMember{InboxID: inbox1.ID, UserID: user.ID, Role: "agent"}
require.NoError(t, db.Create(im1).Error)
im2 := &model.InboxMember{InboxID: inbox2.ID, UserID: user.ID, Role: "supervisor"}
require.NoError(t, db.Create(im2).Error)
members, err := repo.FindByUser(context.Background(), user.ID)
assert.NoError(t, err)
assert.Len(t, members, 2)
// Verify Inbox is preloaded
assert.Equal(t, "IMTestInbox", members[0].Inbox.Name)
assert.Equal(t, "IMTestInbox2", members[1].Inbox.Name)
// Verify ordering by ID ASC
assert.Equal(t, im1.ID, members[0].ID)
assert.Equal(t, im2.ID, members[1].ID)
}
// ========== 5. Create ==========
// 5. Create – inserts a new InboxMember
func TestInboxMemberRepo_Create(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
_, user, inbox := createInboxMemberPrereqs(t, db)
im := &model.InboxMember{
InboxID: inbox.ID,
UserID: user.ID,
Role: "agent",
}
err := repo.Create(context.Background(), im)
assert.NoError(t, err)
assert.NotZero(t, im.ID, "ID should be set after Create")
// Verify via FindByID
found, err := repo.FindByID(context.Background(), im.ID)
assert.NoError(t, err)
assert.Equal(t, inbox.ID, found.InboxID)
assert.Equal(t, user.ID, found.UserID)
assert.Equal(t, "agent", found.Role)
}
// ========== 6. Delete ==========
// 6a. Delete – removes an InboxMember by ID
func TestInboxMemberRepo_Delete(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
im := createTestInboxMember(t, db, "agent")
err := repo.Delete(context.Background(), im.ID)
assert.NoError(t, err)
// Verify it no longer exists (soft delete)
found, err := repo.FindByID(context.Background(), im.ID)
assert.Error(t, err)
assert.Nil(t, found)
}
// 6b. DeleteByInboxAndUser – removes membership by inbox and user
func TestInboxMemberRepo_DeleteByInboxAndUser(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
im := createTestInboxMember(t, db, "agent")
err := repo.DeleteByInboxAndUser(context.Background(), im.InboxID, im.UserID)
assert.NoError(t, err)
// Verify it no longer exists
found, err := repo.FindByInboxAndUser(context.Background(), im.InboxID, im.UserID)
assert.Error(t, err)
assert.Nil(t, found)
}
// 6c. DeleteByInbox – removes all members from an inbox
func TestInboxMemberRepo_DeleteByInbox(t *testing.T) {
db := setupTestDB(t, &model.InboxMember{})
repo := NewInboxMemberRepo(db)
_, user1, inbox := createInboxMemberPrereqs(t, db)
user2 := &model.User{Name: "IMDelUser2", Email: "imdel2@example.com", Provider: "email"}
require.NoError(t, db.Create(user2).Error)
im1 := &model.InboxMember{InboxID: inbox.ID, UserID: user1.ID, Role: "agent"}
require.NoError(t, db.Create(im1).Error)
im2 := &model.InboxMember{InboxID: inbox.ID, UserID: user2.ID, Role: "supervisor"}
require.NoError(t, db.Create(im2).Error)
err := repo.DeleteByInbox(context.Background(), inbox.ID)
assert.NoError(t, err)
// Verify no members remain for this inbox
members, err := repo.FindByInbox(context.Background(), inbox.ID)
assert.NoError(t, err)
assert.Len(t, members, 0)
}