From 3e3cd75c5c1ef257f8b71a9e3d1de905f580c539 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 20:22:34 +0000 Subject: [PATCH 1/2] Initial plan From 7314adbf35a9d74fe9cd32ca7bd40cfbad8b9c71 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 20:29:32 +0000 Subject: [PATCH 2/2] Fix deterministic ZIP export and add 404 test for consumers endpoint Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --- .../Endpoints/WorkflowDefinitions/Export/Endpoint.cs | 7 +++++-- .../WorkflowReferenceGraphTests.cs | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs index 3a4f06b37d..506dea1bbe 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Export/Endpoint.cs @@ -131,17 +131,19 @@ private async Task> IncludeConsumersAsync(List definitions, CancellationToken cancellationToken) { var zipStream = new MemoryStream(); + var sortedDefinitions = definitions.OrderBy(d => d.DefinitionId).ToList(); #if NET10_0_OR_GREATER await using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { // Create a JSON file for each workflow definition: - foreach (var definition in definitions) + foreach (var definition in sortedDefinitions) { var model = await CreateWorkflowModelAsync(definition, cancellationToken); var binaryJson = await SerializeWorkflowDefinitionAsync(model, cancellationToken); var fileName = GetFileName(model); var entry = zipArchive.CreateEntry(fileName, CompressionLevel.Optimal); + entry.LastWriteTime = DateTimeOffset.UnixEpoch; await using var entryStream = await entry.OpenAsync(cancellationToken); await entryStream.WriteAsync(binaryJson, cancellationToken); } @@ -150,12 +152,13 @@ private async Task WriteZipResponseAsync(List definitions, C using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { // Create a JSON file for each workflow definition: - foreach (var definition in definitions) + foreach (var definition in sortedDefinitions) { var model = await CreateWorkflowModelAsync(definition, cancellationToken); var binaryJson = await SerializeWorkflowDefinitionAsync(model, cancellationToken); var fileName = GetFileName(model); var entry = zipArchive.CreateEntry(fileName, CompressionLevel.Optimal); + entry.LastWriteTime = DateTimeOffset.UnixEpoch; await using var entryStream = entry.Open(); await entryStream.WriteAsync(binaryJson, cancellationToken); } diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowReferenceGraph/WorkflowReferenceGraphTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowReferenceGraph/WorkflowReferenceGraphTests.cs index dd41beac2e..f37751ddd1 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowReferenceGraph/WorkflowReferenceGraphTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowReferenceGraph/WorkflowReferenceGraphTests.cs @@ -36,4 +36,16 @@ public async Task ConsumersEndpoint_LeafWorkflow_ReturnsEmpty() Assert.NotNull(response); Assert.Empty(response.ConsumingWorkflowDefinitionIds); } + + [Fact(DisplayName = "Consumers endpoint for unknown workflow returns not found")] + public async Task ConsumersEndpoint_UnknownWorkflow_ReturnsNotFound() + { + var client = WorkflowServer.CreateApiClient(); + const string unknownDefinitionId = "refgraph-unknown-definition"; + + var exception = await Assert.ThrowsAsync(async () => + await client.GetConsumersAsync(unknownDefinitionId)); + + Assert.Equal(System.Net.HttpStatusCode.NotFound, exception.StatusCode); + } }