- 将通用 Entities 命名空间拆分为具体业务实体子目录 - 更新所有实体类型引用为具体的 Entity 后缀类型 - 将 ModelType、ModelProvider、GroupMemberRole 等枚举重命名为 Enum 后缀 - 重构 AiModel 相关配置和映射逻辑适配新的实体结构 - 更新测试代码中的实体类型引用和枚举使用 - 调整应用层处理器中的实体创建和查询逻辑 - 修改 appsettings.json 中的基础设施主机配置为动态占位符模式
72 lines
3.2 KiB
C#
72 lines
3.2 KiB
C#
using FluentAssertions;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using NSubstitute;
|
||
using Xunit;
|
||
using BuildFlow.Platform.Application.Roles.Commands;
|
||
using BuildFlow.Platform.Application.Roles.Handlers;
|
||
using BuildFlow.Platform.Domain.Common;
|
||
using BuildFlow.Shared.Domain.Exceptions;
|
||
|
||
namespace BuildFlow.Platform.Tests.Roles;
|
||
|
||
/// <summary>
|
||
/// 分配权限 Command 处理器单元测试。覆盖分配成功 + 该角色所有用户版本号批量自增、权限不存在拒绝。
|
||
/// </summary>
|
||
public class AssignPermissionsCommandHandlerTests
|
||
{
|
||
[Fact]
|
||
public async Task Handle_ValidAssignment_ShouldBumpAllAffectedUsersVersion()
|
||
{
|
||
// Arrange:角色 A 关联两个用户,分配权限后两者版本号都应自增
|
||
var db = PlatformTestDb.CreateDbContext();
|
||
var roleId = Guid.NewGuid();
|
||
var permId = Guid.NewGuid();
|
||
var user1Id = Guid.NewGuid();
|
||
var user2Id = Guid.NewGuid();
|
||
|
||
db.Roles.Add(PlatformTestDb.WithAudit(new BuildFlow.Platform.Domain.Entities.Role { Id = roleId, Name = "Admin" }));
|
||
db.Permissions.Add(PlatformTestDb.WithAudit(new BuildFlow.Platform.Domain.Entities.Permission
|
||
{
|
||
Id = permId,
|
||
Name = "用户管理",
|
||
Code = "user:read",
|
||
}));
|
||
await PlatformTestDb.SeedUserAsync(db, user1Id, "u1", permissionVersion: 1);
|
||
await PlatformTestDb.SeedUserAsync(db, user2Id, "u2", permissionVersion: 1);
|
||
db.UserRoles.Add(new BuildFlow.Platform.Domain.Entities.UserRoleEntity { UserId = user1Id, RoleId = roleId, CreatedBy = "t", UpdatedBy = "t" });
|
||
db.UserRoles.Add(new BuildFlow.Platform.Domain.Entities.UserRoleEntity { UserId = user2Id, RoleId = roleId, CreatedBy = "t", UpdatedBy = "t" });
|
||
await db.SaveChangesAsync();
|
||
|
||
var versionStore = Substitute.For<IPermissionVersionStore>();
|
||
var handler = new AssignPermissionsCommandHandler(db, versionStore);
|
||
|
||
// Act
|
||
await handler.Handle(new AssignPermissionsCommand(roleId, [permId]), CancellationToken.None);
|
||
|
||
// Assert:两个受影响用户的版本号都自增(1 → 2)
|
||
var users = await db.Users.Where(u => u.Id == user1Id || u.Id == user2Id).ToListAsync();
|
||
users.Should().AllSatisfy(u => u.PermissionVersion.Should().Be(2));
|
||
await versionStore.Received(1).BumpAsync(
|
||
Arg.Is<IEnumerable<Guid>>(ids => ids.Contains(user1Id) && ids.Contains(user2Id)),
|
||
Arg.Any<CancellationToken>());
|
||
}
|
||
|
||
[Fact]
|
||
public async Task Handle_NonExistentPermission_ShouldThrowNotFound()
|
||
{
|
||
// Arrange
|
||
var db = PlatformTestDb.CreateDbContext();
|
||
var roleId = Guid.NewGuid();
|
||
db.Roles.Add(PlatformTestDb.WithAudit(new BuildFlow.Platform.Domain.Entities.Role { Id = roleId, Name = "Empty" }));
|
||
await db.SaveChangesAsync();
|
||
var handler = new AssignPermissionsCommandHandler(db, Substitute.For<IPermissionVersionStore>());
|
||
|
||
// Act
|
||
var act = () => handler.Handle(new AssignPermissionsCommand(roleId, [Guid.NewGuid()]), CancellationToken.None);
|
||
|
||
// Assert
|
||
await act.Should().ThrowAsync<NotFoundException>()
|
||
.WithMessage("*部分权限不存在*");
|
||
}
|
||
}
|