179 lines
5.2 KiB
Go
179 lines
5.2 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/gochat/gochat/internal/model"
|
|
"github.com/gochat/gochat/internal/repository"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func setupPortalMemberService(t *testing.T) (*gorm.DB, *repository.PortalMemberRepo, *PortalMemberService) {
|
|
t.Helper()
|
|
db := setupServiceTestDB(t)
|
|
repo := repository.NewPortalMemberRepo(db)
|
|
svc := NewPortalMemberService(repo)
|
|
return db, repo, svc
|
|
}
|
|
|
|
func createTestPortalMember(t *testing.T, db *gorm.DB, portalID uint, userID uint, role string) *model.PortalMember {
|
|
t.Helper()
|
|
member := &model.PortalMember{
|
|
PortalID: portalID,
|
|
UserID: userID,
|
|
Role: role,
|
|
}
|
|
if err := db.Create(member).Error; err != nil {
|
|
t.Fatalf("failed to create test portal member: %v", err)
|
|
}
|
|
return member
|
|
}
|
|
|
|
func TestPortalMemberService_Create(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
ctx := context.Background()
|
|
req := &CreatePortalMemberRequest{
|
|
UserID: user.ID,
|
|
Role: model.PortalMemberRoleAdministrator,
|
|
}
|
|
member, err := svc.Create(ctx, portal.ID, req)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, portal.ID, member.PortalID)
|
|
assert.Equal(t, user.ID, member.UserID)
|
|
assert.Equal(t, string(model.PortalMemberRoleAdministrator), member.Role)
|
|
}
|
|
|
|
func TestPortalMemberService_Create_DefaultRole(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
ctx := context.Background()
|
|
req := &CreatePortalMemberRequest{
|
|
UserID: user.ID,
|
|
Role: "", // empty role should default to reader
|
|
}
|
|
member, err := svc.Create(ctx, portal.ID, req)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, string(model.PortalMemberRoleReader), member.Role)
|
|
}
|
|
|
|
func TestPortalMemberService_GetByID(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
existing := createTestPortalMember(t, db, portal.ID, user.ID, "editor")
|
|
|
|
ctx := context.Background()
|
|
member, err := svc.GetByID(ctx, existing.ID)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, existing.ID, member.ID)
|
|
assert.Equal(t, "editor", member.Role)
|
|
}
|
|
|
|
func TestPortalMemberService_GetByID_NotFound(t *testing.T) {
|
|
_, _, svc := setupPortalMemberService(t)
|
|
ctx := context.Background()
|
|
member, err := svc.GetByID(ctx, 99999)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, member)
|
|
}
|
|
|
|
func TestPortalMemberService_Update(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
existing := createTestPortalMember(t, db, portal.ID, user.ID, "reader")
|
|
|
|
ctx := context.Background()
|
|
req := &UpdatePortalMemberRequest{
|
|
Role: model.PortalMemberRoleAdministrator,
|
|
}
|
|
updated, err := svc.Update(ctx, existing.ID, req)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, string(model.PortalMemberRoleAdministrator), updated.Role)
|
|
}
|
|
|
|
func TestPortalMemberService_Update_NotFound(t *testing.T) {
|
|
_, _, svc := setupPortalMemberService(t)
|
|
ctx := context.Background()
|
|
req := &UpdatePortalMemberRequest{
|
|
Role: model.PortalMemberRoleAdministrator,
|
|
}
|
|
member, err := svc.Update(ctx, 99999, req)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, member)
|
|
}
|
|
|
|
func TestPortalMemberService_Delete(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
user := createTestUser(t, db, account.ID)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
existing := createTestPortalMember(t, db, portal.ID, user.ID, "reader")
|
|
|
|
ctx := context.Background()
|
|
err := svc.Delete(ctx, existing.ID)
|
|
require.NoError(t, err)
|
|
|
|
// Verify deleted
|
|
member, err := svc.GetByID(ctx, existing.ID)
|
|
assert.Error(t, err)
|
|
assert.Nil(t, member)
|
|
}
|
|
|
|
func TestPortalMemberService_Delete_NotFound(t *testing.T) {
|
|
_, _, svc := setupPortalMemberService(t)
|
|
ctx := context.Background()
|
|
err := svc.Delete(ctx, 99999)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestPortalMemberService_ListByPortalID(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
// Create 3 members with different users
|
|
for i := 0; i < 3; i++ {
|
|
user := createTestUser(t, db, account.ID)
|
|
createTestPortalMember(t, db, portal.ID, user.ID, "reader")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
members, count, err := svc.ListByPortalID(ctx, portal.ID, 0, 10)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(3), count)
|
|
assert.Len(t, members, 3)
|
|
}
|
|
|
|
func TestPortalMemberService_ListByPortalID_Pagination(t *testing.T) {
|
|
db, _, svc := setupPortalMemberService(t)
|
|
account := createTestAccount(t, db)
|
|
portal := createTestPortal(t, db, account.ID)
|
|
|
|
for i := 0; i < 5; i++ {
|
|
user := createTestUser(t, db, account.ID)
|
|
createTestPortalMember(t, db, portal.ID, user.ID, "reader")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
// offset=0, limit=2
|
|
members, count, err := svc.ListByPortalID(ctx, portal.ID, 0, 2)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(5), count)
|
|
assert.Len(t, members, 2)
|
|
} |