using BuildFlow.Shared.Domain.Errors; using FluentAssertions; using Microsoft.EntityFrameworkCore; using NSubstitute; using Workflow.Application.BuildFlow.Common.Services; using Workflow.Application.BuildFlow.Exports.Handlers; using Workflow.Application.BuildFlow.Exports.Queries; using Workflow.Application.BuildFlow.Imports.DTOs; using Workflow.Domain.Entities; using Workflow.Domain.Enums; using Xunit; namespace BuildFlow.Workflow.Tests.BuildFlow.Exports; public class DownloadImportTemplateQueryHandlerTests { private static WorkflowDbContext CreateDbContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; var db = new WorkflowDbContext(options); db.SavingChanges += AuditStub.OnSave; return db; } [Fact] public async Task DownloadImportTemplate_BuildsExcelViaService() { await using var db = CreateDbContext(); var formId = Guid.NewGuid(); db.FormDefinitions.Add(new FormDefinition { Id = formId, Name = "报销单", Code = "expense", Version = 1, Status = FormStatus.Published, SchemaJson = "{\"type\":\"object\"}" }); await db.SaveChangesAsync(); var excel = Substitute.For(); excel.BuildTemplate(Arg.Any(), Arg.Any()).Returns(new byte[] { 1, 2, 3 }); var handler = new DownloadImportTemplateQueryHandler(db, excel); var result = await handler.Handle(new DownloadImportTemplateQuery(formId), CancellationToken.None); result.Should().NotBeNull(); result.Content.Should().NotBeNull(); result.Content.Length.Should().Be(3); result.FileName.Should().EndWith("导入模版.xlsx"); excel.Received(1).BuildTemplate("{\"type\":\"object\"}", "报销单"); } [Fact] public async Task DownloadImportTemplate_MissingForm_ThrowsNotFound() { await using var db = CreateDbContext(); var excel = Substitute.For(); var handler = new DownloadImportTemplateQueryHandler(db, excel); var act = async () => await handler.Handle(new DownloadImportTemplateQuery(Guid.NewGuid()), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.NotFound); } }