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