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("最后一个启用的平台管理员不能被降级") } }