250 lines
8.2 KiB
Plaintext
250 lines
8.2 KiB
Plaintext
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/gochat/gochat/internal/model"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// ========== GetByID ==========
|
|
|
|
func TestInboxMemberService_GetByID_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
// 直接通过 db 创建 InboxMember
|
|
im := &model.InboxMember{InboxID: inbox.ID, UserID: user.ID}
|
|
require.NoError(t, db.Create(im).Error)
|
|
|
|
result, err := svc.GetByID(context.Background(), im.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, im.ID, result.ID)
|
|
assert.Equal(t, inbox.ID, result.InboxID)
|
|
assert.Equal(t, user.ID, result.UserID)
|
|
}
|
|
|
|
func TestInboxMemberService_GetByID_不存在(t *testing.T) {
|
|
_, _, svc := setupInboxMemberService(t)
|
|
|
|
result, err := svc.GetByID(context.Background(), 9999)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
}
|
|
|
|
// ========== ListByInbox ==========
|
|
|
|
func TestInboxMemberService_ListByInbox_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
// 创建2个用户(不同邮箱)并加入同一 inbox
|
|
user1 := &model.User{AccountID: account.ID, Name: "成员1", Email: "member1@example.com", Password: "pw", Role: "agent", Active: true}
|
|
require.NoError(t, db.Create(user1).Error)
|
|
user2 := &model.User{AccountID: account.ID, Name: "成员2", Email: "member2@example.com", Password: "pw", Role: "agent", Active: true}
|
|
require.NoError(t, db.Create(user2).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox.ID, UserID: user1.ID}).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox.ID, UserID: user2.ID}).Error)
|
|
|
|
members, err := svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 2)
|
|
}
|
|
|
|
func TestInboxMemberService_ListByInbox_空列表(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
members, err := svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 0)
|
|
}
|
|
|
|
// ========== ListByUser ==========
|
|
|
|
func TestInboxMemberService_ListByUser_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
|
|
// 创建2个 inbox 并将同一用户加入
|
|
inbox1 := createTestInbox(t, db, account.ID, "web_widget")
|
|
inbox2 := createTestInbox(t, db, account.ID, "api")
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox1.ID, UserID: user.ID}).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox2.ID, UserID: user.ID}).Error)
|
|
|
|
members, err := svc.ListByUser(context.Background(), user.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 2)
|
|
}
|
|
|
|
func TestInboxMemberService_ListByUser_空列表(t *testing.T) {
|
|
_, _, svc := setupInboxMemberService(t)
|
|
|
|
members, err := svc.ListByUser(context.Background(), 9999)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 0)
|
|
}
|
|
|
|
// ========== AddMember ==========
|
|
|
|
func TestInboxMemberService_AddMember_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
user := createTestUser(t, db, account.ID)
|
|
|
|
req := AddMemberRequest{
|
|
InboxID: inbox.ID,
|
|
UserID: user.ID,
|
|
}
|
|
|
|
result, err := svc.AddMember(context.Background(), req)
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, result.ID)
|
|
assert.Equal(t, inbox.ID, result.InboxID)
|
|
assert.Equal(t, user.ID, result.UserID)
|
|
|
|
// 验证数据库中确实存在
|
|
members, err := svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 1)
|
|
assert.Equal(t, user.ID, members[0].UserID)
|
|
}
|
|
|
|
func TestInboxMemberService_AddMember_重复添加(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
user := createTestUser(t, db, account.ID)
|
|
|
|
req := AddMemberRequest{
|
|
InboxID: inbox.ID,
|
|
UserID: user.ID,
|
|
}
|
|
|
|
// 第一次添加成功
|
|
result, err := svc.AddMember(context.Background(), req)
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, result.ID)
|
|
|
|
// 第二次添加同一用户到同一 inbox 应失败
|
|
result2, err2 := svc.AddMember(context.Background(), req)
|
|
assert.Error(t, err2)
|
|
assert.Nil(t, result2)
|
|
assert.Contains(t, err2.Error(), "already a member")
|
|
}
|
|
|
|
func TestInboxMemberService_AddMember_验证失败_InboxID为零(t *testing.T) {
|
|
_, _, svc := setupInboxMemberService(t)
|
|
|
|
req := AddMemberRequest{
|
|
InboxID: 0, // validate:"required" 不满足
|
|
UserID: 1,
|
|
}
|
|
|
|
result, err := svc.AddMember(context.Background(), req)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
}
|
|
|
|
func TestInboxMemberService_AddMember_验证失败_UserID为零(t *testing.T) {
|
|
_, _, svc := setupInboxMemberService(t)
|
|
|
|
req := AddMemberRequest{
|
|
InboxID: 1,
|
|
UserID: 0, // validate:"required" 不满足
|
|
}
|
|
|
|
result, err := svc.AddMember(context.Background(), req)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, result)
|
|
}
|
|
|
|
// ========== RemoveMember ==========
|
|
|
|
func TestInboxMemberService_RemoveMember_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
user := createTestUser(t, db, account.ID)
|
|
|
|
// 先添加成员
|
|
req := AddMemberRequest{InboxID: inbox.ID, UserID: user.ID}
|
|
result, err := svc.AddMember(context.Background(), req)
|
|
require.NoError(t, err)
|
|
assert.NotZero(t, result.ID)
|
|
|
|
// 验证有1个成员
|
|
members, err := svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 1)
|
|
|
|
// 移除成员
|
|
err = svc.RemoveMember(context.Background(), inbox.ID, user.ID)
|
|
require.NoError(t, err)
|
|
|
|
// 验证已无成员
|
|
members, err = svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 0)
|
|
}
|
|
|
|
func TestInboxMemberService_RemoveMember_移除不存在的成员(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
// 移除一个从未添加的成员,GORM Delete 不报错(0行被删除)
|
|
err := svc.RemoveMember(context.Background(), inbox.ID, 9999)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
// ========== RemoveAllMembers ==========
|
|
|
|
func TestInboxMemberService_RemoveAllMembers_成功(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
// 创建3个用户(不同邮箱)并加入同一 inbox
|
|
user1 := &model.User{AccountID: account.ID, Name: "成员1", Email: "rm-member1@example.com", Password: "pw", Role: "agent", Active: true}
|
|
require.NoError(t, db.Create(user1).Error)
|
|
user2 := &model.User{AccountID: account.ID, Name: "成员2", Email: "rm-member2@example.com", Password: "pw", Role: "agent", Active: true}
|
|
require.NoError(t, db.Create(user2).Error)
|
|
user3 := &model.User{AccountID: account.ID, Name: "成员3", Email: "rm-member3@example.com", Password: "pw", Role: "agent", Active: true}
|
|
require.NoError(t, db.Create(user3).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox.ID, UserID: user1.ID}).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox.ID, UserID: user2.ID}).Error)
|
|
require.NoError(t, db.Create(&model.InboxMember{InboxID: inbox.ID, UserID: user3.ID}).Error)
|
|
|
|
// 验证有3个成员
|
|
members, err := svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 3)
|
|
|
|
// 移除所有成员
|
|
err = svc.RemoveAllMembers(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
|
|
// 验证已无成员
|
|
members, err = svc.ListByInbox(context.Background(), inbox.ID)
|
|
require.NoError(t, err)
|
|
assert.Len(t, members, 0)
|
|
}
|
|
|
|
func TestInboxMemberService_RemoveAllMembers_空inbox(t *testing.T) {
|
|
db, _, svc := setupInboxMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
inbox := createTestInbox(t, db, account.ID, "web_widget")
|
|
|
|
// 空inbox移除所有成员也不报错
|
|
err := svc.RemoveAllMembers(context.Background(), inbox.ID)
|
|
assert.NoError(t, err)
|
|
} |