using w4c_workflows.Services.Execution; using Xunit; namespace w4c_workflows.Tests; public class TaskResultTests { private static TaskInvocation Invocation() => new( TaskInvocation.TypeValue, "run-1", "task-1", "root", "shell", "a.sh", null, new Dictionary(), "{}", null, "tenant-1", 1); [Fact] public void Parses_success_fields_published_by_the_worker() { var result = new ExecutionResult(true, 0, "stdout", string.Empty, "{\"ok\":true}", null, TimeSpan.FromMilliseconds(42)); var parsed = TaskResult.FromFields(TaskResultMessage.ToFields(Invocation(), result)); Assert.True(parsed.Success); Assert.Equal("run-1", parsed.RunId); Assert.Equal("task-1", parsed.TaskId); Assert.Equal(1, parsed.Attempt); Assert.Equal("tenant-1", parsed.TenantId); Assert.Equal(0, parsed.ExitCode); Assert.Equal("{\"ok\":true}", parsed.Output); Assert.Null(parsed.Error); Assert.Equal(42, parsed.DurationMs); } [Fact] public void Parses_failure_fields_with_error() { var result = new ExecutionResult(false, 1, string.Empty, "boom", null, "boom", TimeSpan.Zero); var parsed = TaskResult.FromFields(TaskResultMessage.ToFields(Invocation(), result)); Assert.False(parsed.Success); Assert.Equal(1, parsed.ExitCode); Assert.Equal("boom", parsed.Error); Assert.Null(parsed.Output); } [Fact] public void Throws_when_required_fields_are_missing() { var fields = new Dictionary { ["type"] = "task.result" }; Assert.Throws(() => TaskResult.FromFields(fields)); } }