using BuildFlow.Shared.Domain.Errors; using FluentAssertions; using Microsoft.EntityFrameworkCore; using Workflow.Application.Features.WorkflowInstances.Commands; using Workflow.Application.Features.WorkflowInstances.Handlers; using Workflow.Domain.Entities; using Workflow.Domain.Enums; using Xunit; namespace BuildFlow.Workflow.Tests.Handlers; public class UpdateWorkflowInstanceVariablesCommandHandlerTests { 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 UpdateWorkflowInstanceVariables_OverwritesVariables() { await using var db = CreateDbContext(); var id = Guid.NewGuid(); db.WorkflowInstances.Add(new WorkflowInstance { Id = id, DefinitionId = Guid.NewGuid(), Title = "Inst", Status = InstanceStatus.Running, InitiatorId = Guid.NewGuid(), Variables = "{}" }); await db.SaveChangesAsync(); var handler = new UpdateWorkflowInstanceVariablesCommandHandler(db); var command = new UpdateWorkflowInstanceVariablesCommand(id, "{\"k\":\"v\"}"); await handler.Handle(command, CancellationToken.None); var stored = await db.WorkflowInstances.FindAsync(id); stored!.Variables.Should().Be("{\"k\":\"v\"}"); } [Fact] public async Task UpdateWorkflowInstanceVariables_MissingInstance_ThrowsNotFound() { await using var db = CreateDbContext(); var handler = new UpdateWorkflowInstanceVariablesCommandHandler(db); var command = new UpdateWorkflowInstanceVariablesCommand(Guid.NewGuid(), "{}"); var act = async () => await handler.Handle(command, CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.NotFound); } [Fact] public async Task UpdateWorkflowInstanceVariables_NotObject_ThrowsInvalidParam() { await using var db = CreateDbContext(); var id = Guid.NewGuid(); db.WorkflowInstances.Add(new WorkflowInstance { Id = id, DefinitionId = Guid.NewGuid(), Title = "Inst", Status = InstanceStatus.Running, InitiatorId = Guid.NewGuid() }); await db.SaveChangesAsync(); var handler = new UpdateWorkflowInstanceVariablesCommandHandler(db); var command = new UpdateWorkflowInstanceVariablesCommand(id, "[]"); var act = async () => await handler.Handle(command, CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.InvalidParam); } [Fact] public async Task UpdateWorkflowInstanceVariables_InvalidJson_ThrowsInvalidParam() { await using var db = CreateDbContext(); var id = Guid.NewGuid(); db.WorkflowInstances.Add(new WorkflowInstance { Id = id, DefinitionId = Guid.NewGuid(), Title = "Inst", Status = InstanceStatus.Running, InitiatorId = Guid.NewGuid() }); await db.SaveChangesAsync(); var handler = new UpdateWorkflowInstanceVariablesCommandHandler(db); var command = new UpdateWorkflowInstanceVariablesCommand(id, "{not-json"); var act = async () => await handler.Handle(command, CancellationToken.None); var ex = await act.Should().ThrowAsync(); ex.Which.Code.Should().Be(ErrorCode.InvalidParam); } }