using BuildFlow.Shared.Domain.Errors; using FluentAssertions; using Microsoft.EntityFrameworkCore; using Workflow.Application.BuildFlow.Imports.Handlers; using Workflow.Application.BuildFlow.Imports.Queries; using Workflow.Domain.Entities; using Workflow.Domain.Enums; using Xunit; namespace BuildFlow.Workflow.Tests.BuildFlow.Imports; public class ImportJobQueryHandlerTests { private static WorkflowDbContext CreateDbContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; var db = new WorkflowDbContext(options); db.SavingChanges += AuditStub.OnSave; return db; } private static BuildFlowImportJob SeedJob(WorkflowDbContext db, Guid formId, BuildFlowImportJobStatus status) { var job = new BuildFlowImportJob { Id = Guid.NewGuid(), FormDefinitionId = formId, FileUrl = "upload/test.xlsx", Status = status }; db.BuildFlowImportJobs.Add(job); return job; } #region GetImportJobList [Fact] public async Task GetImportJobList_ReturnsAll() { await using var db = CreateDbContext(); var formId = Guid.NewGuid(); SeedJob(db, formId, BuildFlowImportJobStatus.Pending); SeedJob(db, formId, BuildFlowImportJobStatus.Success); await db.SaveChangesAsync(); var handler = new GetImportJobListQueryHandler(db); var result = await handler.Handle(new GetImportJobListQuery(null, null, 1, 10), CancellationToken.None); result.Items.Should().HaveCount(2); result.Total.Should().Be(2); } [Fact] public async Task GetImportJobList_FiltersByStatus() { await using var db = CreateDbContext(); var formId = Guid.NewGuid(); SeedJob(db, formId, BuildFlowImportJobStatus.Pending); SeedJob(db, formId, BuildFlowImportJobStatus.Success); await db.SaveChangesAsync(); var handler = new GetImportJobListQueryHandler(db); var result = await handler.Handle( new GetImportJobListQuery(null, (int)BuildFlowImportJobStatus.Pending, 1, 10), CancellationToken.None); result.Items.Should().HaveCount(1); result.Items[0].Status.Should().Be(BuildFlowImportJobStatus.Pending); } #endregion #region GetImportJob [Fact] public async Task GetImportJob_ReturnsDto() { await using var db = CreateDbContext(); var job = SeedJob(db, Guid.NewGuid(), BuildFlowImportJobStatus.Running); await db.SaveChangesAsync(); var handler = new GetImportJobQueryHandler(db); var result = await handler.Handle(new GetImportJobQuery(job.Id), CancellationToken.None); result.Should().NotBeNull(); result.Id.Should().Be(job.Id); result.Status.Should().Be(BuildFlowImportJobStatus.Running); } [Fact] public async Task GetImportJob_Missing_ThrowsNotFound() { await using var db = CreateDbContext(); var handler = new GetImportJobQueryHandler(db); var act = async () => await handler.Handle(new GetImportJobQuery(Guid.NewGuid()), CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.NotFound); } #endregion }