diff --git a/Elsa.sln b/Elsa.sln
index 886cbad70..0d68b277f 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -322,8 +322,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Hosting.Management", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.KeyValues", "src\modules\Elsa.KeyValues\Elsa.KeyValues.csproj", "{73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Workflows.Runtime.UnitTests", "test\unit\Elsa.Workflows.Runtime.UnitTests\Elsa.Workflows.Runtime.UnitTests.csproj", "{D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -788,10 +786,6 @@ Global
{086A7E2A-6CE7-41DA-927B-C033638060B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{086A7E2A-6CE7-41DA-927B-C033638060B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{086A7E2A-6CE7-41DA-927B-C033638060B1}.Release|Any CPU.Build.0 = Release|Any CPU
- {D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -931,7 +925,6 @@ Global
{BBCE36D1-6767-4ED1-B3E8-84D2567A962A} = {A516931E-EDBB-4FC3-BB94-1BB824D5BC61}
{73BBB1E3-AEEC-44E8-83D7-6DD9CD687FE3} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}
{086A7E2A-6CE7-41DA-927B-C033638060B1} = {56C2FFB8-EA54-45B5-A095-4A78142EB4B5}
- {D2C54C82-D79B-47AE-BEDB-F15D4E4B7EA5} = {18453B51-25EB-4317-A4B3-B10518252E92}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D4B5CEAA-7D70-4FCB-A68E-B03FBE5E0E5E}
diff --git a/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowDefinitionStorePopulator.cs b/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowDefinitionStorePopulator.cs
index f987b7a08..3bdb8efdc 100644
--- a/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowDefinitionStorePopulator.cs
+++ b/src/modules/Elsa.Workflows.Runtime/Services/DefaultWorkflowDefinitionStorePopulator.cs
@@ -92,9 +92,6 @@ public class DefaultWorkflowDefinitionStorePopulator : IWorkflowDefinitionStoreP
var workflow = materializedWorkflow.Workflow;
var definitionId = workflow.Identity.DefinitionId;
- var olderWorkflowLatest = false;
- var olderWorkflowPublished = false;
-
// Serialize materializer context.
var materializerContext = materializedWorkflow.MaterializerContext;
var materializerContextJson = materializerContext != null ? _payloadSerializer.Serialize(materializerContext) : default;
@@ -133,13 +130,6 @@ public class DefaultWorkflowDefinitionStorePopulator : IWorkflowDefinitionStoreP
foreach (var latestWorkflowDefinition in latestWorkflowDefinitions)
{
- if (latestWorkflowDefinition.Version > workflow.Version)
- {
- _logger.LogWarning("A more recent version of the workflow has been found, overwriting the IsLatest property on the workflow.");
- olderWorkflowLatest = true;
- continue;
- }
-
latestWorkflowDefinition.IsLatest = false;
workflowDefinitionsToSave.Add(latestWorkflowDefinition);
}
@@ -161,13 +151,6 @@ public class DefaultWorkflowDefinitionStorePopulator : IWorkflowDefinitionStoreP
foreach (var publishedWorkflowDefinition in publishedWorkflowDefinitions)
{
- if (publishedWorkflowDefinition.Version > workflow.Version)
- {
- _logger.LogWarning("A more recent version of the workflow has been found to be published, overwriting the IsPublished property on the workflow.");
- olderWorkflowPublished = true;
- continue;
- }
-
publishedWorkflowDefinition.IsPublished = false;
workflowDefinitionsToSave.Add(publishedWorkflowDefinition);
}
@@ -183,8 +166,8 @@ public class DefaultWorkflowDefinitionStorePopulator : IWorkflowDefinitionStoreP
workflowDefinition.Description = workflow.WorkflowMetadata.Description;
workflowDefinition.Name = workflow.WorkflowMetadata.Name;
workflowDefinition.ToolVersion = workflow.WorkflowMetadata.ToolVersion;
- workflowDefinition.IsLatest = !olderWorkflowLatest && workflow.Publication.IsLatest;
- workflowDefinition.IsPublished = !olderWorkflowPublished && workflow.Publication.IsPublished;
+ workflowDefinition.IsLatest = workflow.Publication.IsLatest;
+ workflowDefinition.IsPublished = workflow.Publication.IsPublished;
workflowDefinition.IsReadonly = workflow.IsReadonly;
workflowDefinition.IsSystem = workflow.IsSystem;
workflowDefinition.CustomProperties = workflow.CustomProperties;
@@ -199,13 +182,14 @@ public class DefaultWorkflowDefinitionStorePopulator : IWorkflowDefinitionStoreP
workflowDefinition.MaterializerContext = materializerContextJson;
workflowDefinition.MaterializerName = materializedWorkflow.MaterializerName;
+ // Temporary measure to try and find the root cause of https://github.com/elsa-workflows/elsa-core/issues/5033
if (existingDefinitionVersion is null
&& workflowDefinitionsToSave.Any(w => w.Id == workflowDefinition.Id))
+ _logger.LogError("Trying to create duplicate workflows with id {workflowId}", workflowDefinition.Id);
+ else
{
- _logger.LogError("Trying to create a new workflow with existing id {workflowId}", workflowDefinition.Id);
- return;
+ workflowDefinitionsToSave.Add(workflowDefinition);
}
- workflowDefinitionsToSave.Add(workflowDefinition);
var duplicates = workflowDefinitionsToSave.GroupBy(wd => wd.Id)
.Where(g => g.Count() > 1)
diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj b/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj
deleted file mode 100644
index 071265b87..000000000
--- a/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- net8.0
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/Services/DefaultWorkflowDefinitionStorePopulatorTests.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/Services/DefaultWorkflowDefinitionStorePopulatorTests.cs
deleted file mode 100644
index 2a94bd71f..000000000
--- a/test/unit/Elsa.Workflows.Runtime.UnitTests/Services/DefaultWorkflowDefinitionStorePopulatorTests.cs
+++ /dev/null
@@ -1,188 +0,0 @@
-using Elsa.Common.Contracts;
-using Elsa.Workflows.Activities;
-using Elsa.Workflows.Contracts;
-using Elsa.Workflows.Management.Contracts;
-using Elsa.Workflows.Management.Entities;
-using Elsa.Workflows.Management.Filters;
-using Elsa.Workflows.Models;
-using Elsa.Workflows.Runtime.Contracts;
-using Elsa.Workflows.Runtime.Models;
-using Elsa.Workflows.Runtime.Services;
-using Microsoft.Extensions.Logging;
-using NSubstitute;
-
-namespace Elsa.Workflows.Runtime.UnitTests.Services;
-
-public class DefaultWorkflowDefinitionStorePopulatorTests
-{
- private readonly IWorkflowDefinitionStore _storeMock;
- private readonly DefaultWorkflowDefinitionStorePopulator _populator;
-
- public DefaultWorkflowDefinitionStorePopulatorTests()
- {
- _storeMock = Substitute.For();
- _populator = new DefaultWorkflowDefinitionStorePopulator(() => new List(),
- Substitute.For(),
- _storeMock,
- Substitute.For(),
- Substitute.For(),
- Substitute.For(),
- Substitute.For(),
- Substitute.For>());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_NewWorkflowDefinition_AddsWorkflowDefinition()
- {
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 1, "1")}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
-
- await _storeMock.Received(1).SaveManyAsync(Arg.Any>(), Arg.Any());
- await _storeMock.Received(1).SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "1"
- && wd.DefinitionId == "a"
- && wd.Version == 1)), Arg.Any());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_ExistingWorkflowDefinition_KeepsExistingWorkflow()
- {
- _storeMock.FindManyAsync(Arg.Any(), Arg.Any())
- .Returns(new List
- {
- new()
- {
- Id = "1",
- DefinitionId = "a",
- Version = 1,
- Inputs = new List{new(){Name = "InputA"}}
- }
- });
-
- var workflow = new MaterializedWorkflow(new Workflow
- {
- Identity = new WorkflowIdentity("a", 1, "1"),
- Inputs = new List{new (){Name = "A"}}
- }, "Test", "Test");
-
- await _populator.AddAsync(workflow);
-
- await _storeMock.DidNotReceive().SaveManyAsync(Arg.Any>(), Arg.Any());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_NewWorkflowDefinitionVersion_AddsWorkflowDefinition()
- {
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 2, "2")}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
-
- await _storeMock.Received(1).SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "2"
- && wd.DefinitionId == "a"
- && wd.Version == 2)), Arg.Any());
-
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_NewWorkflowDefinitionVersionAsLatestAndPublished_UpdatesOlderDefinitions()
- {
- _storeMock.FindManyAsync(Arg.Any(), Arg.Any())
- .Returns(new List
- {
- new()
- {
- Id = "1",
- DefinitionId = "a",
- Version = 1,
- IsLatest = true,
- IsPublished = true
- }
- });
-
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 2, "2")}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
-
- await _storeMock.Received(1).SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "1"
- && wd.IsLatest == false
- && wd.IsPublished == false)), Arg.Any());
-
- await _storeMock.Received(1).SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "2"
- && wd.DefinitionId == "a"
- && wd.Version == 2
- && wd.IsLatest == true
- && wd.IsPublished == true)), Arg.Any());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_NewWorkflowDefinitionVersionWithSameId_IsIgnored()
- {
- _storeMock.FindManyAsync(Arg.Any(), Arg.Any())
- .Returns(new List
- {
- new()
- {
- Id = "1",
- DefinitionId = "a",
- Version = 1,
- }
- });
-
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 2, "1")}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
- await _storeMock.DidNotReceive().SaveManyAsync(Arg.Any>(), Arg.Any());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_OlderVersionAsLatest_ExistingVersionShouldRemainLatest()
- {
- _storeMock.FindManyAsync(Arg.Any(), Arg.Any())
- .Returns(new List
- {
- new()
- {
- Id = "2",
- DefinitionId = "a",
- Version = 2,
- IsLatest = true
- }
- });
-
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 1, "1"), Publication = new WorkflowPublication(true, true)}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
- await _storeMock.DidNotReceive().SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "2")), Arg.Any());
- await _storeMock.Received().SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "1" && wd.IsLatest == false)), Arg.Any());
- }
-
- [Fact]
- public async Task AddOrUpdateCoreAsync_OlderVersionAsPublished_ShouldNotBeUpdated()
- {
- _storeMock.FindManyAsync(Arg.Any(), Arg.Any())
- .Returns(new List
- {
- new()
- {
- Id = "2",
- DefinitionId = "a",
- Version = 2,
- IsPublished = true
- }
- });
-
- var workflow = new MaterializedWorkflow(new Workflow{Identity = new WorkflowIdentity("a", 1, "1"), Publication = new WorkflowPublication(true, true)}, "Test", "Test");
-
- await _populator.AddAsync(workflow);
- await _storeMock.DidNotReceive().SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "2")), Arg.Any());
- await _storeMock.Received().SaveManyAsync(Arg.Is>(l =>
- l.Any(wd => wd.Id == "1" && wd.IsPublished == false)), Arg.Any());
- }
-}
\ No newline at end of file
diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/Usings.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/Usings.cs
deleted file mode 100644
index 8c927eb74..000000000
--- a/test/unit/Elsa.Workflows.Runtime.UnitTests/Usings.cs
+++ /dev/null
@@ -1 +0,0 @@
-global using Xunit;
\ No newline at end of file