109 lines
3.5 KiB
Go
109 lines
3.5 KiB
Go
package service
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"affiliate_dash/internal/model"
|
|
)
|
|
|
|
func TestPlatformSupportAccountRoleSwitch(t *testing.T) {
|
|
db := newServiceTestDB(t)
|
|
svc := NewUserService(db, NewTenantService(db))
|
|
|
|
actor, err := svc.CreatePlatformAdmin("platform-role-actor", "password123", "管理员")
|
|
if err != nil {
|
|
t.Fatalf("创建管理员失败: %v", err)
|
|
}
|
|
support, err := svc.CreatePlatformUser("platform-role-support", "password123", "平台客服", model.RolePlatformSupport)
|
|
if err != nil {
|
|
t.Fatalf("创建平台客服失败: %v", err)
|
|
}
|
|
if support.Role != model.RolePlatformSupport {
|
|
t.Fatalf("平台客服角色不符: %+v", support)
|
|
}
|
|
|
|
var membershipCount int64
|
|
if err := db.Model(&model.MerchantMember{}).Where("user_id = ?", support.ID).Count(&membershipCount).Error; err != nil {
|
|
t.Fatalf("统计成员关系失败: %v", err)
|
|
}
|
|
if membershipCount != 0 {
|
|
t.Fatalf("平台客服不应写入商户成员关系,实际 %d 条", membershipCount)
|
|
}
|
|
|
|
list, total, err := svc.ListPlatformAdmins(1, 100)
|
|
if err != nil {
|
|
t.Fatalf("查询平台账号失败: %v", err)
|
|
}
|
|
if total < 2 {
|
|
t.Fatalf("平台账号列表应包含管理员与平台客服,实际 total=%d", total)
|
|
}
|
|
foundSupport := false
|
|
for _, item := range list {
|
|
if item.ID == support.ID && item.Role == model.RolePlatformSupport {
|
|
foundSupport = true
|
|
}
|
|
}
|
|
if !foundSupport {
|
|
t.Fatalf("平台账号列表未包含平台客服: %+v", list)
|
|
}
|
|
|
|
// 平台客服 -> 平台管理员:补自营商户负责人上下文。
|
|
updated, err := svc.UpdatePlatformAdmin(support.ID, UpdatePlatformAdminInput{
|
|
Username: support.Username,
|
|
Nickname: support.Nickname,
|
|
Status: 1,
|
|
Role: model.RoleAdmin,
|
|
}, actor.ID)
|
|
if err != nil {
|
|
t.Fatalf("提升为管理员失败: %v", err)
|
|
}
|
|
if updated.Role != model.RoleAdmin {
|
|
t.Fatalf("角色未更新为管理员: %+v", updated)
|
|
}
|
|
var membership model.MerchantMember
|
|
if err := db.Where("user_id = ?", support.ID).First(&membership).Error; err != nil {
|
|
t.Fatalf("管理员缺少自营商户成员关系: %v", err)
|
|
}
|
|
if membership.Role != model.MemberRoleOwner || !membership.IsDefault {
|
|
t.Fatalf("管理员成员关系不符: %+v", membership)
|
|
}
|
|
|
|
// 平台管理员 -> 平台客服:移除商户成员关系,回到 Tenant 合成上下文。
|
|
updated, err = svc.UpdatePlatformAdmin(support.ID, UpdatePlatformAdminInput{
|
|
Username: support.Username,
|
|
Nickname: support.Nickname,
|
|
Status: 1,
|
|
Role: model.RolePlatformSupport,
|
|
}, actor.ID)
|
|
if err != nil {
|
|
t.Fatalf("降级为平台客服失败: %v", err)
|
|
}
|
|
if updated.Role != model.RolePlatformSupport {
|
|
t.Fatalf("角色未更新为平台客服: %+v", updated)
|
|
}
|
|
if err := db.Model(&model.MerchantMember{}).Where("user_id = ?", support.ID).Count(&membershipCount).Error; err != nil {
|
|
t.Fatalf("统计成员关系失败: %v", err)
|
|
}
|
|
if membershipCount != 0 {
|
|
t.Fatalf("降级后应移除商户成员关系,实际 %d 条", membershipCount)
|
|
}
|
|
}
|
|
|
|
func TestCannotDemoteLastPlatformAdmin(t *testing.T) {
|
|
db := newServiceTestDB(t)
|
|
svc := NewUserService(db, nil)
|
|
|
|
admin, err := svc.CreatePlatformAdmin("only-role-admin", "password123", "唯一管理员")
|
|
if err != nil {
|
|
t.Fatalf("创建管理员失败: %v", err)
|
|
}
|
|
if _, err := svc.UpdatePlatformAdmin(admin.ID, UpdatePlatformAdminInput{
|
|
Username: admin.Username,
|
|
Nickname: admin.Nickname,
|
|
Status: 1,
|
|
Role: model.RolePlatformSupport,
|
|
}, 0); err == nil {
|
|
t.Fatal("最后一个启用的平台管理员不能被降级")
|
|
}
|
|
}
|