build-flow.api/tests/BuildFlow.Workflow.Tests/BuildFlow/BuildFlowButtonActionTests.cs
xiangning 2d70d92522 refactor(scripting): 删除旧 CustomFunction 代码 + 权限/菜单迁移
删除(workflow 模块):
- Application/BuildFlow/CustomFunctions/ 全目录(Commands/Handlers/Queries/DTOs/Services)
- Domain/Entities/CustomFunction.cs + CustomFunctionExecutionLog.cs
- Domain/Enums/CustomFunctionType.cs + CustomFunctionExecutionStatus.cs
- Infrastructure/Configurations/CustomFunction*Configuration.cs
- Host/Endpoints/Workflow/BuildFlow/CustomFunctions/ 全目录(5 端点+5 请求)
- Host/Services/Integration/HttpFunctionExecutor.cs + IHttpFunctionExecutor.cs(HTTP 函数不做,spec §11)
- WorkflowDbContext 移除 CustomFunctions/CustomFunctionExecutionLogs DbSet
- WorkflowApplicationModule 移除 ICustomFunctionExecutionService 注册

迁移:
- SeedData 权限码 buildflow:function:* → scripts.* (8 个)
- SeedData 菜单 buildflow.functions → scripts(顶级模块)
- 新增空迁移 RemoveCustomFunctionFromWorkflowModel(仅更新 ModelSnapshot)

测试清理:
- 删除 CustomFunctionTests.cs + BuildFlowApplicationTests.cs CustomFunction 用例
- BuildFlowButtonActionTests.cs 删除 7 个已 skip 的执行器测试(T9 重写)
- BuildFlowEntrySeedTests / PermissionRegistration 断言对齐新种子

Task T7 of scripting module refactor
2026-07-07 10:00:24 +08:00

111 lines
3.8 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 BuildFlow.Shared.Domain.Common;
using Microsoft.EntityFrameworkCore;
using Workflow.Application.BuildFlow.Buttons.Commands;
using Workflow.Application.BuildFlow.Buttons.Handlers;
using Workflow.Domain.Entities;
using Workflow.Domain.Enums;
using Xunit;
namespace BuildFlow.Workflow.Tests.BuildFlow;
/// <summary>
/// 按钮动作链测试,约束按钮配置驱动后端动作执行,而不是前端写死行为。
/// </summary>
public class BuildFlowButtonActionTests
{
[Fact]
public async Task CreateButtonDefinition_PersistsActionMetadata()
{
await using var db = TestDbFactory.Create();
var handler = new CreateBuildFlowButtonDefinitionCommandHandler(db);
var button = await handler.Handle(
new CreateBuildFlowButtonDefinitionCommand(
null,
null,
null,
null,
"submit",
"提交",
"send",
BuildFlowButtonPlacement.FormToolbar,
"form:submit",
null,
null,
"""{"title":"确认提交?"}""",
null,
"""[]""",
null,
10),
CancellationToken.None);
button.Code.Should().Be("submit");
button.PermissionCode.Should().Be("form:submit");
button.Status.Should().Be(BuildFlowMetadataStatus.Draft);
}
[Fact]
public async Task PublishButtonDefinition_ShouldMakeButtonExecutableByRuntime()
{
await using var db = TestDbFactory.Create();
var button = CreateButton();
button.Status = BuildFlowMetadataStatus.Draft;
db.BuildFlowButtons.Add(button);
await db.SaveChangesAsync();
var handler = new PublishBuildFlowButtonDefinitionCommandHandler(db);
var result = await handler.Handle(
new PublishBuildFlowButtonDefinitionCommand(button.Id),
CancellationToken.None);
result.Status.Should().Be(BuildFlowMetadataStatus.Published);
(await db.BuildFlowButtons.FindAsync(button.Id))!.Status
.Should().Be(BuildFlowMetadataStatus.Published);
}
[Fact]
public async Task DisableButtonDefinition_ShouldRemoveButtonFromRuntime()
{
await using var db = TestDbFactory.Create();
var button = CreateButton();
db.BuildFlowButtons.Add(button);
await db.SaveChangesAsync();
var handler = new DisableBuildFlowButtonDefinitionCommandHandler(db);
var result = await handler.Handle(
new DisableBuildFlowButtonDefinitionCommand(button.Id),
CancellationToken.None);
result.Status.Should().Be(BuildFlowMetadataStatus.Disabled);
(await db.BuildFlowButtons.FindAsync(button.Id))!.Status
.Should().Be(BuildFlowMetadataStatus.Disabled);
}
// 注:原 7 个 BuildFlowButtonActionExecutor 执行器用例(runFunction/submitForm/权限校验等)已删除。
// T6 已将执行器改造为依赖 IScriptExecutionService + ScriptingDbContext,旧用例基于已删除的
// CustomFunctionExecutionService/CustomFunctionCommandHandler 链路,无法编译。T9 将基于新的脚本执行路径重写。
private static BuildFlowButtonDefinition CreateButton()
=> new()
{
Id = Guid.NewGuid(),
Code = "submit-and-run",
Label = "提交并计算",
Placement = BuildFlowButtonPlacement.FormToolbar,
Status = BuildFlowMetadataStatus.Published,
ActionsJson = """
[
{
"type": "runFunction",
"target": "00000000-0000-0000-0000-000000000001",
"params": { "amount": "$input.amount" },
"runPolicy": "stopOnFailure"
}
]
""",
};
}