using FluentAssertions; using Microsoft.EntityFrameworkCore; using Workflow.Application.BuildFlow.Applications.Commands; using Workflow.Application.BuildFlow.Applications.Handlers; using Workflow.Application.BuildFlow.Applications.Queries; using Workflow.Application.BuildFlow.Buttons.Commands; using Workflow.Application.BuildFlow.Buttons.Handlers; using Workflow.Application.BuildFlow.Buttons.Queries; using Workflow.Application.BuildFlow.Pages.Commands; using Workflow.Application.BuildFlow.Pages.Handlers; using Workflow.Application.BuildFlow.Pages.Queries; using Workflow.Domain.Enums; using Xunit; namespace BuildFlow.Workflow.Tests.BuildFlow; /// /// BuildFlow 应用元数据测试,约束应用和页面定义作为低代码平台顶层归属存在。 /// public class BuildFlowApplicationTests { [Fact] public async Task CreateApplicationAndPage_PersistsMetadata() { await using var db = TestDbFactory.Create(); var appHandler = new CreateBuildFlowApplicationCommandHandler(db); var pageHandler = new CreateBuildFlowPageDefinitionCommandHandler(db); var app = await appHandler.Handle( new CreateBuildFlowApplicationCommand("leave", "请假应用", "员工请假流程"), CancellationToken.None); var page = await pageHandler.Handle( new CreateBuildFlowPageDefinitionCommand( app.Id, "leave-form", "请假申请页", BuildFlowPageType.Form, """{"type":"form","formCode":"leave-request"}"""), CancellationToken.None); app.Code.Should().Be("leave"); app.Status.Should().Be(BuildFlowMetadataStatus.Draft); page.ApplicationId.Should().Be(app.Id); page.SchemaJson.Should().Contain("leave-request"); } [Fact] public async Task GetApplicationList_FiltersByStatus() { await using var db = TestDbFactory.Create(); var appHandler = new CreateBuildFlowApplicationCommandHandler(db); var draft = await appHandler.Handle( new CreateBuildFlowApplicationCommand("draft-app", "草稿应用", null), CancellationToken.None); await appHandler.Handle( new CreateBuildFlowApplicationCommand("published-app", "已发布应用", null), CancellationToken.None); var published = await db.BuildFlowApplications.SingleAsync(x => x.Code == "published-app"); published.Status = BuildFlowMetadataStatus.Published; await db.SaveChangesAsync(); var handler = new GetBuildFlowApplicationListQueryHandler(db); var result = await handler.Handle( new GetBuildFlowApplicationListQuery(1, 20, BuildFlowMetadataStatus.Draft, null), CancellationToken.None); result.Total.Should().Be(1); result.Items.Should().ContainSingle(x => x.Id == draft.Id && x.Code == "draft-app"); } [Fact] public async Task GetPageList_FiltersByApplication() { await using var db = TestDbFactory.Create(); var appHandler = new CreateBuildFlowApplicationCommandHandler(db); var pageHandler = new CreateBuildFlowPageDefinitionCommandHandler(db); var leaveApp = await appHandler.Handle(new CreateBuildFlowApplicationCommand("leave", "请假应用", null), CancellationToken.None); var purchaseApp = await appHandler.Handle(new CreateBuildFlowApplicationCommand("purchase", "采购应用", null), CancellationToken.None); await pageHandler.Handle( new CreateBuildFlowPageDefinitionCommand(leaveApp.Id, "leave-list", "请假列表", BuildFlowPageType.List, "{}"), CancellationToken.None); await pageHandler.Handle( new CreateBuildFlowPageDefinitionCommand(purchaseApp.Id, "purchase-list", "采购列表", BuildFlowPageType.List, "{}"), CancellationToken.None); var handler = new GetBuildFlowPageDefinitionListQueryHandler(db); var result = await handler.Handle( new GetBuildFlowPageDefinitionListQuery(1, 20, leaveApp.Id, null, null), CancellationToken.None); result.Total.Should().Be(1); result.Items.Should().ContainSingle(x => x.ApplicationId == leaveApp.Id && x.Code == "leave-list"); } [Fact] public async Task GetButtonList_FiltersByFormAndPlacement() { await using var db = TestDbFactory.Create(); var formDefinitionId = Guid.NewGuid(); var buttonHandler = new CreateBuildFlowButtonDefinitionCommandHandler(db); await buttonHandler.Handle( new CreateBuildFlowButtonDefinitionCommand( null, null, formDefinitionId, null, "submit", "提交", "lucide:send", BuildFlowButtonPlacement.FormToolbar, "buildflow:button:submit", null, null, null, null, "[]", null, 10), CancellationToken.None); await buttonHandler.Handle( new CreateBuildFlowButtonDefinitionCommand( null, null, Guid.NewGuid(), null, "approve", "审批", "lucide:check", BuildFlowButtonPlacement.RowAction, "buildflow:button:approve", null, null, null, null, "[]", null, 20), CancellationToken.None); var handler = new GetBuildFlowButtonDefinitionListQueryHandler(db); var result = await handler.Handle( new GetBuildFlowButtonDefinitionListQuery( 1, 20, null, null, formDefinitionId, null, BuildFlowButtonPlacement.FormToolbar, null), CancellationToken.None); result.Total.Should().Be(1); result.Items.Should().ContainSingle(x => x.Code == "submit" && x.FormDefinitionId == formDefinitionId); } }