243 lines
7.4 KiB
Go
243 lines
7.4 KiB
Go
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)
|
||
} |