build-flow.api/tests/BuildFlow.Platform.Tests/Roles/AssignPermissionsCommandHandlerTests.cs
xiangning f550074fcc test(platform): 添加平台模块测试基础设施和RAG端到端测试
- 为平台测试添加EntityFrameworkCore和Xunit引用
- 实现PlatformTestDb创建带审计字段自动填充的测试数据库
- 添加DictionaryConfiguration支持配置值获取测试
- 实现完整的密码强度验证规则
- 添加RAG问答全链路端到端测试
- 创建多个Stub服务用于解耦外部依赖测试
- 实现测试专用的当前用户上下文
2026-07-07 17:31:50 +08:00

72 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.UserRole { UserId = user1Id, RoleId = roleId, CreatedBy = "t", UpdatedBy = "t" });
db.UserRoles.Add(new BuildFlow.Platform.Domain.Entities.UserRole { 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("*部分权限不存在*");
}
}