feat(server): owner role group, custom role colors with effects and animated avatars

This commit is contained in:
justme committed 2026-10-17 13:25:13 +08:00
1 parent 7ef298f587
commit bef8898cd8
8 files changed
+67 -19

No files matched your search

@@ -90,9 +90,17 @@ public sealed class WorkspaceStructureTests
Assert.Equal("管理员", role.Suffix); Assert.Equal(["alice"], role.Members);
// 默认的「管理组」一直在;删掉自己建的不影响它,删掉默认组后也不会再自动出现
var remaining = env.Service.DeleteWorkspaceRole(ch.Id, owner, created.Role.Id);
Assert.Equal(WorkspaceRole.DefaultId, Assert.Single(remaining.Roles).Id);
Assert.Empty(env.Service.DeleteWorkspaceRole(ch.Id, owner, WorkspaceRole.DefaultId).Roles);
Assert.Empty(env.Service.CreateWorkspaceChannel(ch.Id, owner, "再写一次", null).Roles);
Assert.Equal([WorkspaceRole.OwnerId, WorkspaceRole.DefaultId], remaining.Roles.Select(r => r.Id));
Assert.Equal(WorkspaceRole.OwnerId, Assert.Single(env.Service.DeleteWorkspaceRole(ch.Id, owner, WorkspaceRole.DefaultId).Roles).Id);
// Owner 组删不掉、不能加成员,但前后缀和颜色可以改,名称和权限保持不变
Assert.Throws<WebDropException>(() => env.Service.DeleteWorkspaceRole(ch.Id, owner, WorkspaceRole.OwnerId));
Assert.Throws<WebDropException>(() => env.Service.SetWorkspaceRoleMembers(ch.Id, owner, WorkspaceRole.OwnerId, ["alice"]));
var edited = env.Service.UpdateWorkspaceRole(ch.Id, owner, WorkspaceRole.OwnerId, "改名", "**主**", "*Owner*", "g:#ff0000,#0000ff", []).Roles.Single();
Assert.Equal("Owner 组", edited.Name); Assert.Equal("**主**", edited.Prefix); Assert.Equal("g:#ff0000,#0000ff", edited.Color); Assert.Equal(WorkspacePermission.All, edited.Permissions);
Assert.Throws<WebDropException>(() => env.Service.UpdateWorkspaceRole(ch.Id, owner, WorkspaceRole.OwnerId, "x", null, null, "#12345", []));
Assert.Equal("g:#ff0000,#0000ff|marquee", env.Service.UpdateWorkspaceRole(ch.Id, owner, WorkspaceRole.OwnerId, "x", null, null, "g:#ff0000,#0000ff|marquee", []).Roles.Single().Color); // 动画效果跟在颜色后面
Assert.Throws<WebDropException>(() => env.Service.UpdateWorkspaceRole(ch.Id, owner, WorkspaceRole.OwnerId, "x", null, null, "#ff0000|spin", []));
Assert.Single(env.Service.CreateWorkspaceChannel(ch.Id, owner, "再写一次", null).Roles);
}
[Fact]
public void StructureStoredBeforeRolesExistedStillLoadsWithAnEmptyRoleList()
@@ -104,7 +112,7 @@ public sealed class WorkspaceStructureTests
public void EverySpaceStartsWithADefaultAdminGroupThatCanHoldMembers()
{
var (env, ch, owner, alice, bob, _) = RoleSpace(); using var _env = env;
var admin = Assert.Single(env.Service.GetWorkspace(ch.Id, owner).Roles);
var admin = Assert.Single(env.Service.GetWorkspace(ch.Id, owner).Roles, r => r.Id == WorkspaceRole.DefaultId);
Assert.Equal(WorkspaceRole.DefaultId, admin.Id); Assert.Equal("管理组", admin.Name); Assert.Empty(admin.Members);
Assert.Contains(WorkspacePermission.RemoveMembers, admin.Permissions); Assert.Contains(WorkspacePermission.ManageStructure, admin.Permissions);
env.Service.SetWorkspaceRoleMembers(ch.Id, owner, admin.Id, ["alice"]);