diff --git a/src/modules/Elsa.Hangfire/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Hangfire/Extensions/ModuleExtensions.cs index b28069d4e..ab493f267 100644 --- a/src/modules/Elsa.Hangfire/Extensions/ModuleExtensions.cs +++ b/src/modules/Elsa.Hangfire/Extensions/ModuleExtensions.cs @@ -1,5 +1,6 @@ using Elsa.Features.Services; using Elsa.Hangfire.Features; +using Elsa.Scheduling; using Elsa.Scheduling.Features; using Elsa.Workflows.Runtime.Features; using JetBrains.Annotations; @@ -20,7 +21,7 @@ public static class ModuleExtensions { return module.Use(configure); } - + /// /// Configures Hangfire to use SQL Server storage. Only use this feature if you are not configuring Hangfire yourself. /// @@ -29,7 +30,7 @@ public static class ModuleExtensions feature.Module.Use(configure); return feature; } - + /// /// Configures Hangfire to use SQLite storage. Only use this feature if you are not configuring Hangfire yourself. /// @@ -38,7 +39,7 @@ public static class ModuleExtensions feature.Module.Use(configure); return feature; } - + /// /// Installs a Hangfire implementation for . /// @@ -47,7 +48,7 @@ public static class ModuleExtensions feature.Module.Use(configure); return feature; } - + /// /// Installs a Hangfire implementation for . /// diff --git a/src/modules/Elsa.Hangfire/Features/HangfireSchedulerFeature.cs b/src/modules/Elsa.Hangfire/Features/HangfireSchedulerFeature.cs index 6c2c50bd6..ae24e6499 100644 --- a/src/modules/Elsa.Hangfire/Features/HangfireSchedulerFeature.cs +++ b/src/modules/Elsa.Hangfire/Features/HangfireSchedulerFeature.cs @@ -3,6 +3,7 @@ using Elsa.Features.Attributes; using Elsa.Features.Services; using Elsa.Hangfire.Handlers; using Elsa.Hangfire.Services; +using Elsa.Scheduling; using Elsa.Scheduling.Features; using Elsa.Workflows.Contracts; using Microsoft.Extensions.DependencyInjection; diff --git a/src/modules/Elsa.Quartz/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Quartz/Extensions/ModuleExtensions.cs index d1bd0d35e..e3191924e 100644 --- a/src/modules/Elsa.Quartz/Extensions/ModuleExtensions.cs +++ b/src/modules/Elsa.Quartz/Extensions/ModuleExtensions.cs @@ -1,5 +1,6 @@ using Elsa.Features.Services; using Elsa.Quartz.Features; +using Elsa.Scheduling; using Elsa.Scheduling.Features; // ReSharper disable once CheckNamespace @@ -17,7 +18,7 @@ public static class ModuleExtensions { return module.Use(configure); } - + /// /// Installs a Quartz.NET implementation for . /// diff --git a/src/modules/Elsa.Quartz/Features/QuartzSchedulerFeature.cs b/src/modules/Elsa.Quartz/Features/QuartzSchedulerFeature.cs index fe9030786..dc4a7c0eb 100644 --- a/src/modules/Elsa.Quartz/Features/QuartzSchedulerFeature.cs +++ b/src/modules/Elsa.Quartz/Features/QuartzSchedulerFeature.cs @@ -4,6 +4,7 @@ using Elsa.Features.Services; using Elsa.Quartz.Handlers; using Elsa.Quartz.Jobs; using Elsa.Quartz.Services; +using Elsa.Scheduling; using Elsa.Scheduling.Features; using Elsa.Workflows.Contracts; using Microsoft.Extensions.DependencyInjection; diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/ExecutionState/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/ExecutionState/Endpoint.cs index 96ccc853d..b8cbe8623 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/ExecutionState/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowInstances/ExecutionState/Endpoint.cs @@ -1,6 +1,6 @@ using Elsa.Abstractions; using Elsa.Extensions; -using Elsa.Workflows.Management.Contracts; +using Elsa.Workflows.Management; using JetBrains.Annotations; namespace Elsa.Workflows.Api.Endpoints.WorkflowInstances.ExecutionState; diff --git a/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowDefinitionStorePopulator.cs b/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowDefinitionStorePopulator.cs index 8b0f93481..1eabb75bd 100644 --- a/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowDefinitionStorePopulator.cs +++ b/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowDefinitionStorePopulator.cs @@ -1,4 +1,5 @@ using Elsa.Workflows.Management; +using Elsa.Workflows.Management.Entities; namespace Elsa.Workflows.Runtime; diff --git a/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowExecutionContextStore.cs b/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowExecutionContextStore.cs deleted file mode 100644 index 0c833861e..000000000 --- a/src/modules/Elsa.Workflows.Runtime/Contracts/IWorkflowExecutionContextStore.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Elsa.Workflows.Runtime; - -/// -/// Stores records. -/// -public interface IWorkflowExecutionContextStore -{ - /// - /// Saves a record of the . - /// - /// The to save. - Task SaveAsync(WorkflowExecutionContext context); - - /// - /// Finds a with the specified ID. - /// - /// The matching entity or null if no match was found. - Task FindAsync(string workflowExecutionContextId); - - /// - /// Deletes the record of the with the specified ID if it exists. - /// - Task DeleteAsync(string workflowExecutionContextId); -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs index 7359d7236..2fbfb917c 100644 --- a/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs +++ b/src/modules/Elsa.Workflows.Runtime/Features/WorkflowRuntimeFeature.cs @@ -18,6 +18,7 @@ using Elsa.Workflows.Runtime.Handlers; using Elsa.Workflows.Runtime.HostedServices; using Elsa.Workflows.Runtime.Options; using Elsa.Workflows.Runtime.Providers; +using Elsa.Workflows.Runtime.Services; using Elsa.Workflows.Runtime.Stores; using Medallion.Threading; using Medallion.Threading.FileSystem; @@ -67,9 +68,6 @@ public class WorkflowRuntimeFeature : FeatureBase /// A factory that instantiates an . public Func ActivityExecutionLogStore { get; set; } = sp => sp.GetRequiredService(); - /// A factory that instantiates an . - public Func WorkflowExecutionContextStore { get; set; } = sp => sp.GetRequiredService(); - /// A factory that instantiates an . public Func DistributedLockProvider { get; set; } = _ => new FileDistributedSynchronizationProvider(new DirectoryInfo(Path.Combine(Environment.CurrentDirectory, "App_Data/locks"))); @@ -174,7 +172,6 @@ public class WorkflowRuntimeFeature : FeatureBase .AddScoped(WorkflowRuntime) .AddScoped(WorkflowDispatcher) .AddScoped(WorkflowCancellationDispatcher) - .AddScoped(WorkflowExecutionContextStore) .AddScoped(RunTaskDispatcher) .AddScoped(WorkflowExecutionLogSink) .AddSingleton(BackgroundActivityScheduler) @@ -235,7 +232,6 @@ public class WorkflowRuntimeFeature : FeatureBase .AddMemoryStore() .AddMemoryStore() .AddMemoryStore() - .AddMemoryStore() // Distributed locking. .AddSingleton(DistributedLockProvider) @@ -253,7 +249,6 @@ public class WorkflowRuntimeFeature : FeatureBase .AddNotificationHandler() .AddNotificationHandler() .AddNotificationHandler() - .AddNotificationHandler() .AddNotificationHandler() .AddNotificationHandler() diff --git a/src/modules/Elsa.Workflows.Runtime/Handlers/CancelBackgroundActivities.cs b/src/modules/Elsa.Workflows.Runtime/Handlers/CancelBackgroundActivities.cs index f37b9855f..67067e6c9 100644 --- a/src/modules/Elsa.Workflows.Runtime/Handlers/CancelBackgroundActivities.cs +++ b/src/modules/Elsa.Workflows.Runtime/Handlers/CancelBackgroundActivities.cs @@ -1,6 +1,5 @@ using Elsa.Extensions; using Elsa.Mediator.Contracts; -using Elsa.Workflows.Contracts; using Elsa.Workflows.Runtime.Middleware.Activities; using Elsa.Workflows.Runtime.Notifications; using Elsa.Workflows.Runtime.Stimuli; diff --git a/src/modules/Elsa.Workflows.Runtime/Handlers/InvalidateWorkflowsCache.cs b/src/modules/Elsa.Workflows.Runtime/Handlers/InvalidateWorkflowsCache.cs index d2d52613c..34b3ef696 100644 --- a/src/modules/Elsa.Workflows.Runtime/Handlers/InvalidateWorkflowsCache.cs +++ b/src/modules/Elsa.Workflows.Runtime/Handlers/InvalidateWorkflowsCache.cs @@ -1,5 +1,5 @@ using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Contracts; +using Elsa.Workflows.Management; using Elsa.Workflows.Runtime.Notifications; using JetBrains.Annotations; diff --git a/src/modules/Elsa.Workflows.Runtime/Handlers/RefreshActivityRegistry.cs b/src/modules/Elsa.Workflows.Runtime/Handlers/RefreshActivityRegistry.cs index 607751270..5d6054534 100644 --- a/src/modules/Elsa.Workflows.Runtime/Handlers/RefreshActivityRegistry.cs +++ b/src/modules/Elsa.Workflows.Runtime/Handlers/RefreshActivityRegistry.cs @@ -2,7 +2,6 @@ using Elsa.Mediator.Contracts; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity; using Elsa.Workflows.Management.Contracts; -using Elsa.Workflows.Management.Entities; using Elsa.Workflows.Runtime.Notifications; using JetBrains.Annotations; @@ -15,7 +14,7 @@ public class RefreshActivityRegistry(IWorkflowDefinitionActivityRegistryUpdater /// public async Task HandleAsync(WorkflowDefinitionsReloaded notification, CancellationToken cancellationToken) { - foreach (var reloadedWorkflowDefinition in notification.ReloadedWorkflowDefinitions) + foreach (var reloadedWorkflowDefinition in notification.ReloadedWorkflowDefinitions) await UpdateDefinition(reloadedWorkflowDefinition.DefinitionVersionId, reloadedWorkflowDefinition.UsableAsActivity); } diff --git a/src/modules/Elsa.Workflows.Runtime/Handlers/WorkflowExecutionContextNotificationsHandler.cs b/src/modules/Elsa.Workflows.Runtime/Handlers/WorkflowExecutionContextNotificationsHandler.cs deleted file mode 100644 index a4bc67d0d..000000000 --- a/src/modules/Elsa.Workflows.Runtime/Handlers/WorkflowExecutionContextNotificationsHandler.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Elsa.Mediator.Contracts; -using Elsa.Workflows.Management.Notifications; -using Elsa.Workflows.Notifications; - -namespace Elsa.Workflows.Runtime.Handlers; - -/// -/// Deletes workflow execution log records in response to the notification. -/// -internal class WorkflowExecutionContextNotificationsHandler : - INotificationHandler, - INotificationHandler -{ - private readonly IWorkflowExecutionContextStore _store; - - /// - /// Initializes a new instance of the class. - /// - public WorkflowExecutionContextNotificationsHandler(IWorkflowExecutionContextStore store) - { - _store = store; - } - - /// - public Task HandleAsync(WorkflowExecuting notification, CancellationToken cancellationToken) - { - return _store.SaveAsync(notification.WorkflowExecutionContext); - } - - /// - public Task HandleAsync(WorkflowExecuted notification, CancellationToken cancellationToken) - { - return _store.DeleteAsync(notification.WorkflowExecutionContext.Id); - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Services/MemoryWorkflowExecutionContextStore.cs b/src/modules/Elsa.Workflows.Runtime/Services/MemoryWorkflowExecutionContextStore.cs deleted file mode 100644 index 139f05e4f..000000000 --- a/src/modules/Elsa.Workflows.Runtime/Services/MemoryWorkflowExecutionContextStore.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Elsa.Common.Services; -using Elsa.Workflows.Runtime.Stores; - -namespace Elsa.Workflows.Runtime; - -/// -/// Stores in memory. -/// -public class MemoryWorkflowExecutionContextStore : IWorkflowExecutionContextStore -{ - private readonly MemoryStore _store; - - /// - /// Initializes a new instance of the class. - /// - public MemoryWorkflowExecutionContextStore(MemoryStore store) - { - _store = store; - } - - /// - public Task SaveAsync(WorkflowExecutionContext context) - { - _store.Save(context, x => x.Id); - return Task.CompletedTask; - } - - /// - public Task FindAsync(string workflowExecutionContextId) - { - var result = _store.Find((context) => context.Id == workflowExecutionContextId); - return Task.FromResult(result); - } - - /// - public Task DeleteAsync(string workflowExecutionContextId) - { - _store.Delete(workflowExecutionContextId); - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Runtime/Services/StoreWorkflowExecutionLogSink.cs b/src/modules/Elsa.Workflows.Runtime/Services/StoreWorkflowExecutionLogSink.cs index 5aa5f87c7..51011eb52 100644 --- a/src/modules/Elsa.Workflows.Runtime/Services/StoreWorkflowExecutionLogSink.cs +++ b/src/modules/Elsa.Workflows.Runtime/Services/StoreWorkflowExecutionLogSink.cs @@ -14,7 +14,7 @@ public class StoreWorkflowExecutionLogSink(IWorkflowExecutionLogStore store, IWo public async Task PersistExecutionLogsAsync(WorkflowExecutionContext context, CancellationToken cancellationToken) { var records = extractor.ExtractWorkflowExecutionLogs(context).ToList(); - await store.AddManyAsync(records, context.CancellationTokens.SystemCancellationToken); - await notificationSender.SendAsync(new WorkflowExecutionLogUpdated(context), context.CancellationTokens.SystemCancellationToken); + await store.AddManyAsync(records, context.CancellationToken); + await notificationSender.SendAsync(new WorkflowExecutionLogUpdated(context), context.CancellationToken); } } \ No newline at end of file diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/Abstractions/AppComponentTest.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/Abstractions/AppComponentTest.cs index 6f43dbb51..3f5d3e35a 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/Abstractions/AppComponentTest.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/Abstractions/AppComponentTest.cs @@ -1,6 +1,5 @@ using Elsa.Workflows.ComponentTests.Helpers.Fixtures; using Microsoft.Extensions.DependencyInjection; -using Xunit; namespace Elsa.Workflows.ComponentTests; @@ -12,13 +11,13 @@ public abstract class AppComponentTest(App app) : IDisposable protected Infrastructure Infrastructure { get; } = app.Infrastructure; protected IServiceScope Scope { get; } = app.WorkflowServer.Services.CreateScope(); - protected virtual void OnDispose() - { - } - void IDisposable.Dispose() { Scope.Dispose(); OnDispose(); } + + protected virtual void OnDispose() + { + } } \ No newline at end of file diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/App.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/App.cs index bd6102fae..921f99441 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/App.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/App.cs @@ -1,7 +1,5 @@ using Elsa.Workflows.ComponentTests.Helpers.Fixtures; using Hangfire.Annotations; -using JetBrains.Annotations; -using Xunit; namespace Elsa.Workflows.ComponentTests; diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs index eb1caed0e..b8515884c 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/Fixtures/WorkflowServer.cs @@ -1,7 +1,6 @@ using System.Net.Http.Headers; using System.Reflection; using Elsa.Alterations.Extensions; -using Elsa.Common.Contracts; using Elsa.EntityFrameworkCore.Extensions; using Elsa.EntityFrameworkCore.Modules.Alterations; using Elsa.EntityFrameworkCore.Modules.Identity; @@ -17,6 +16,8 @@ using Elsa.Testing.Shared.Services; using Elsa.Workflows.ComponentTests.Consumers; using Elsa.Workflows.ComponentTests.Helpers.Materializers; using Elsa.Workflows.ComponentTests.Helpers.Services; +using Elsa.Workflows.ComponentTests.Helpers.WorkflowProviders; +using Elsa.Workflows.Management; using Elsa.Workflows.Runtime.Distributed.Extensions; using FluentStorage; using Hangfire.Annotations; diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/Materializers/TestWorkflowMaterializer.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/Materializers/TestWorkflowMaterializer.cs index e011422c4..eaa7143a8 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/Materializers/TestWorkflowMaterializer.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/Materializers/TestWorkflowMaterializer.cs @@ -1,13 +1,13 @@ using Elsa.Workflows.Activities; using Elsa.Workflows.ComponentTests.Helpers.WorkflowProviders; -using Elsa.Workflows.Management.Contracts; +using Elsa.Workflows.Management; using Elsa.Workflows.Management.Entities; -using Elsa.Workflows.Runtime.Contracts; +using Elsa.Workflows.Runtime; namespace Elsa.Workflows.ComponentTests.Helpers.Materializers; /// A workflow materializer that deserializes workflows created from . -public class TestWorkflowMaterializer(IEnumerable workflowProviders) : IWorkflowMaterializer +public class TestWorkflowMaterializer(IEnumerable workflowProviders) : IWorkflowMaterializer { /// The name of the materializer. public const string MaterializerName = "Test"; diff --git a/test/component/Elsa.Workflows.ComponentTests/Helpers/WorkflowProviders/TestWorkflowProvider.cs b/test/component/Elsa.Workflows.ComponentTests/Helpers/WorkflowProviders/TestWorkflowProvider.cs index 5473cf8eb..8e0ec4f31 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Helpers/WorkflowProviders/TestWorkflowProvider.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Helpers/WorkflowProviders/TestWorkflowProvider.cs @@ -1,12 +1,12 @@ -using Elsa.Workflows.Runtime.Contracts; -using Elsa.Workflows.Runtime.Models; +using Elsa.Workflows.Runtime; namespace Elsa.Workflows.ComponentTests.Helpers.WorkflowProviders; -public class TestWorkflowProvider : IWorkflowProvider +public class TestWorkflowProvider : IWorkflowsProvider { - public string Name => "Test"; public ICollection MaterializedWorkflows { get; set; } = new List(); + public string Name => "Test"; + public ValueTask> GetWorkflowsAsync(CancellationToken cancellationToken = default) { return new(MaterializedWorkflows); diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Variables/CountdownWorkflowTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Variables/CountdownWorkflowTests.cs index d9a5f4d24..b9445855e 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/Variables/CountdownWorkflowTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/Variables/CountdownWorkflowTests.cs @@ -2,7 +2,6 @@ using Elsa.Expressions.Helpers; using Elsa.Extensions; using Elsa.Workflows.ComponentTests.Scenarios.Variables.Workflows; using Elsa.Workflows.Management; -using Elsa.Workflows.Management.Contracts; using Elsa.Workflows.Models; using Elsa.Workflows.Runtime; using Elsa.Workflows.Runtime.Entities; diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/AutoUpdateTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/AutoUpdateTests.cs index d6dcb9d2b..1f337a481 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/AutoUpdateTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/AutoUpdateTests.cs @@ -2,7 +2,6 @@ using Elsa.Http.Contracts; using Elsa.Testing.Shared; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management; -using Elsa.Workflows.Management.Contracts; using Elsa.Workflows.Runtime.Filters; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; @@ -11,37 +10,36 @@ namespace Elsa.Workflows.ComponentTests.Scenarios.WorkflowActivities; public class AutoUpdateTests : AppComponentTest { - private readonly IMemoryCache _cache; - private readonly IHasher _hasher; - private readonly IWorkflowDefinitionCacheManager _definitionCacheManager; - private readonly IWorkflowDefinitionPublisher _publisher; - private readonly ISignalManager _signalManager; - private readonly ITriggerChangeTokenSignalEvents _changeTokenEvents; - private readonly IHttpWorkflowsCacheManager _httpCacheManager; - private readonly IWorkflowDefinitionCacheManager _workflowCacheManager; - - private string? _httpChangeToken; - private string? _triggerChangeToken; - private string? _graphChangeToken; - - private static readonly object HttpChangeTokenSignal = new(); - private static readonly object TriggerChangeTokenSignal = new(); - private static readonly object GraphChangeTokenSignal = new(); - private const string ParentDefinitionVersionId = "4b584e249fdca951"; private const string ParentDefinitionId = "878770f04439a55d"; private const string ChildDefinitionId = "f353742a9ef6af4"; + private static readonly object HttpChangeTokenSignal = new(); + private static readonly object TriggerChangeTokenSignal = new(); + private static readonly object GraphChangeTokenSignal = new(); + private readonly IMemoryCache _cache; + private readonly ITriggerChangeTokenSignalEvents _changeTokenEvents; + private readonly IWorkflowDefinitionCacheManager _definitionCacheManager; + private readonly IHasher _hasher; + private readonly IHttpWorkflowsCacheManager _httpCacheManager; + private readonly IWorkflowDefinitionPublisher _publisher; + private readonly ISignalManager _signalManager; + private readonly IWorkflowDefinitionCacheManager _workflowCacheManager; + private string? _graphChangeToken; + + private string? _httpChangeToken; + private string? _triggerChangeToken; + public AutoUpdateTests(App app) : base(app) { _cache = Scope.ServiceProvider.GetRequiredService(); _hasher = Scope.ServiceProvider.GetRequiredService(); _definitionCacheManager = Scope.ServiceProvider.GetRequiredService(); _publisher = Scope.ServiceProvider.GetRequiredService(); - + _httpCacheManager = Scope.ServiceProvider.GetRequiredService(); _workflowCacheManager = Scope.ServiceProvider.GetRequiredService(); - + _signalManager = Scope.ServiceProvider.GetRequiredService(); _changeTokenEvents = Scope.ServiceProvider.GetRequiredService(); _changeTokenEvents.ChangeTokenSignalTriggered += OnChangeTokenSignalTriggered; @@ -53,7 +51,7 @@ public class AutoUpdateTests : AppComponentTest //Run workflow to make sure the all required items for running the workflow are in the cache var client = WorkflowServer.CreateHttpWorkflowClient(); await client.GetStringAsync("test-cache-invalidation"); - + //Make sure the items are in the cache var hash = _httpCacheManager.ComputeBookmarkHash("/test-cache-invalidation", "get"); Assert.True(_cache.TryGetValue($"http-workflow:{hash}", out _)); @@ -67,15 +65,15 @@ public class AutoUpdateTests : AppComponentTest var parentVersionCacheKey = _definitionCacheManager.CreateWorkflowVersionCacheKey(ParentDefinitionVersionId); Assert.True(_cache.TryGetValue(parentVersionCacheKey, out _)); - + //Set change tokens _httpChangeToken = _workflowCacheManager.CreateWorkflowDefinitionChangeTokenKey(ParentDefinitionId); _triggerChangeToken = _httpCacheManager.GetTriggerChangeTokenKey(hash); _graphChangeToken = _workflowCacheManager.CreateWorkflowDefinitionChangeTokenKey(ParentDefinitionId); - + //(Act) Save the draft version of the child workflow and update the references await _publisher.PublishAsync(ChildDefinitionId); - + //Wait till the notifications for updating the cache have been send and check the cache. await _signalManager.WaitAsync(HttpChangeTokenSignal); await _signalManager.WaitAsync(TriggerChangeTokenSignal); @@ -92,10 +90,12 @@ public class AutoUpdateTests : AppComponentTest { _signalManager.Trigger(HttpChangeTokenSignal, args); } + if (args.Key == _triggerChangeToken) { _signalManager.Trigger(TriggerChangeTokenSignal, args); } + if (args.Key == _graphChangeToken) { _signalManager.Trigger(GraphChangeTokenSignal, args); diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/DeleteWorkflowTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/DeleteWorkflowTests.cs index 439a38397..10754e1cd 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/DeleteWorkflowTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/DeleteWorkflowTests.cs @@ -1,20 +1,20 @@ using Elsa.Testing.Shared; +using Elsa.Workflows.ComponentTests.Scenarios.WorkflowActivities.Workflows; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management; -using Elsa.Workflows.Management.Contracts; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Workflows.ComponentTests.Scenarios.WorkflowActivities; public class DeleteWorkflowTests : AppComponentTest { - private readonly ISignalManager _signalManager; - private readonly IWorkflowDefinitionEvents _workflowDefinitionEvents; + private static readonly object WorkflowDeletedSignal = new(); private readonly IServiceScope _scope1; private readonly IServiceScope _scope2; private readonly IServiceScope _scope3; - private static readonly object WorkflowDeletedSignal = new(); - + private readonly ISignalManager _signalManager; + private readonly IWorkflowDefinitionEvents _workflowDefinitionEvents; + public DeleteWorkflowTests(App app) : base(app) { _scope1 = app.Cluster.Pod1.Services.CreateScope(); @@ -30,28 +30,28 @@ public class DeleteWorkflowTests : AppComponentTest public async Task DeleteWorkflow() { EnsureWorkflowInRegistry(_scope1, Workflows.DeleteWorkflow.Type); - + var workflowDefinitionManager = _scope1.ServiceProvider.GetRequiredService(); await workflowDefinitionManager.DeleteByDefinitionIdAsync(Workflows.DeleteWorkflow.DefinitionId); - + WorkflowTypeDeletedFromRegistry(_scope1, Workflows.DeleteWorkflow.Type); } - + [Fact(Skip = "Clustered tests are interfering with other event driven tests")] public async Task DeleteWorkflow_Clustered() { - EnsureWorkflowInRegistry(_scope1, Workflows.DeleteWorkflowClustered.Type); - EnsureWorkflowInRegistry(_scope2, Workflows.DeleteWorkflowClustered.Type); - EnsureWorkflowInRegistry(_scope3, Workflows.DeleteWorkflowClustered.Type); - + EnsureWorkflowInRegistry(_scope1, DeleteWorkflowClustered.Type); + EnsureWorkflowInRegistry(_scope2, DeleteWorkflowClustered.Type); + EnsureWorkflowInRegistry(_scope3, DeleteWorkflowClustered.Type); + var workflowDefinitionManager = _scope1.ServiceProvider.GetRequiredService(); - await workflowDefinitionManager.DeleteByDefinitionIdAsync(Workflows.DeleteWorkflowClustered.DefinitionId); - - WorkflowTypeDeletedFromRegistry(_scope1, Workflows.DeleteWorkflowClustered.Type); - + await workflowDefinitionManager.DeleteByDefinitionIdAsync(DeleteWorkflowClustered.DefinitionId); + + WorkflowTypeDeletedFromRegistry(_scope1, DeleteWorkflowClustered.Type); + await _signalManager.WaitAsync(WorkflowDeletedSignal); - WorkflowTypeDeletedFromRegistry(_scope2, Workflows.DeleteWorkflowClustered.Type); - WorkflowTypeDeletedFromRegistry(_scope3, Workflows.DeleteWorkflowClustered.Type); + WorkflowTypeDeletedFromRegistry(_scope2, DeleteWorkflowClustered.Type); + WorkflowTypeDeletedFromRegistry(_scope3, DeleteWorkflowClustered.Type); } private static void EnsureWorkflowInRegistry(IServiceScope scope, string type) diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/SaveWorkflowTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/SaveWorkflowTests.cs index ddfc36918..c5f4b2781 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/SaveWorkflowTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowActivities/SaveWorkflowTests.cs @@ -1,7 +1,6 @@ using Elsa.Workflows.Contracts; using Elsa.Workflows.Management; using Elsa.Workflows.Management.Activities.WorkflowDefinitionActivity; -using Elsa.Workflows.Management.Contracts; using Elsa.Workflows.Management.Models; using Elsa.Workflows.Models; using Microsoft.Extensions.DependencyInjection; @@ -18,11 +17,11 @@ public class SaveWorkflowTests(App app) : AppComponentTest(app) public async Task ActivityRegistry(string name, bool usableAsActivity, bool publish, bool expectedInRegistry, bool isBrowsable) { var activityRegistry = Scope.ServiceProvider.GetRequiredService(); - + var descriptor = activityRegistry.Find(name); if (descriptor is not null) activityRegistry.Remove(typeof(WorkflowDefinitionActivityProvider), descriptor); - + var importer = Scope.ServiceProvider.GetRequiredService(); var request = new SaveWorkflowDefinitionRequest { @@ -39,7 +38,7 @@ public class SaveWorkflowTests(App app) : AppComponentTest(app) Publish = publish }; await importer.ImportAsync(request); - + descriptor = activityRegistry.Find(name); if (expectedInRegistry) @@ -49,7 +48,7 @@ public class SaveWorkflowTests(App app) : AppComponentTest(app) } else { - Assert.Null(descriptor); + Assert.Null(descriptor); } } } \ No newline at end of file diff --git a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowDefinitionReload/ReloadWorkflowTests.cs b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowDefinitionReload/ReloadWorkflowTests.cs index 9a0fea9ca..fff7410ef 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowDefinitionReload/ReloadWorkflowTests.cs +++ b/test/component/Elsa.Workflows.ComponentTests/Scenarios/WorkflowDefinitionReload/ReloadWorkflowTests.cs @@ -5,10 +5,8 @@ using Elsa.Workflows.ComponentTests.Helpers.Materializers; using Elsa.Workflows.ComponentTests.Helpers.WorkflowProviders; using Elsa.Workflows.Contracts; using Elsa.Workflows.Management; -using Elsa.Workflows.Management.Contracts; -using Elsa.Workflows.Management.Materializers; +using Elsa.Workflows.Runtime; using Elsa.Workflows.Runtime.Contracts; -using Elsa.Workflows.Runtime.Models; using Humanizer; using Microsoft.Extensions.DependencyInjection; @@ -16,12 +14,12 @@ namespace Elsa.Workflows.ComponentTests.Scenarios.WorkflowDefinitionReload; public class ReloadWorkflowTests : AppComponentTest { - private readonly IWorkflowDefinitionManager _workflowDefinitionManager; - private readonly IWorkflowDefinitionsReloader _workflowDefinitionsReloader; - private readonly IWorkflowBuilderFactory _workflowBuilderFactory; - private readonly TestWorkflowProvider _testWorkflowProvider; - private readonly IWorkflowDefinitionService _workflowDefinitionService; private readonly IActivityRegistry _activityRegistry; + private readonly TestWorkflowProvider _testWorkflowProvider; + private readonly IWorkflowBuilderFactory _workflowBuilderFactory; + private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowDefinitionService _workflowDefinitionService; + private readonly IWorkflowDefinitionsReloader _workflowDefinitionsReloader; public ReloadWorkflowTests(App app) : base(app) { @@ -30,8 +28,8 @@ public class ReloadWorkflowTests : AppComponentTest _workflowBuilderFactory = Scope.ServiceProvider.GetRequiredService(); _workflowDefinitionService = Scope.ServiceProvider.GetRequiredService(); _activityRegistry = Scope.ServiceProvider.GetRequiredService(); - var workflowProviders = Scope.ServiceProvider.GetRequiredService>(); - _testWorkflowProvider = (TestWorkflowProvider)workflowProviders.First(x => x is TestWorkflowProvider); + var workflowsProviders = Scope.ServiceProvider.GetRequiredService>(); + _testWorkflowProvider = (TestWorkflowProvider)workflowsProviders.First(x => x is TestWorkflowProvider); } [Fact] @@ -52,53 +50,53 @@ public class ReloadWorkflowTests : AppComponentTest var definitionId = Guid.NewGuid().ToString(); var definitionVersionId1 = Guid.NewGuid().ToString(); var workflowV1 = await BuildWorkflowAsync(definitionId, definitionVersionId1, 1); - + // Set up the initial workflow version. _testWorkflowProvider.MaterializedWorkflows = [workflowV1]; await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync(); var definitionV1 = await _workflowDefinitionService.FindWorkflowGraphAsync(definitionId, VersionOptions.Latest); Assert.Equal(definitionVersionId1, definitionV1!.Workflow.Identity.Id); - + // Simulate the workflow provider to have a new version available. var definitionVersionId2 = Guid.NewGuid().ToString(); var workflowV2 = await BuildWorkflowAsync(definitionId, definitionVersionId2, 2); _testWorkflowProvider.MaterializedWorkflows = [workflowV1, workflowV2]; - + // Reload the workflow definitions. await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync(); - + // Assert that the workflow definition service finds the updated workflow version. var definitionV2 = await _workflowDefinitionService.FindWorkflowGraphAsync(definitionId, VersionOptions.Latest); Assert.Equal(definitionVersionId2, definitionV2!.Workflow.Identity.Id); } - + [Fact] public async Task Reloading_AfterUpdatingSourceProvider_ShouldRefreshActivityRegistry() { var definitionId = Guid.NewGuid().ToString(); var definitionVersionId1 = Guid.NewGuid().ToString(); var workflowV1 = await BuildWorkflowAsync(definitionId, definitionVersionId1, 1); - + // Set up the initial workflow version. _testWorkflowProvider.MaterializedWorkflows = [workflowV1]; await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync(); var activityTypeName = workflowV1.Workflow.Name.Pascalize(); - var activityV1 = _activityRegistry.Find(activityTypeName); + var activityV1 = _activityRegistry.Find(activityTypeName); Assert.Equal(1, activityV1!.Version); - + // Simulate the workflow provider to have a new version available. var definitionVersionId2 = Guid.NewGuid().ToString(); var workflowV2 = await BuildWorkflowAsync(definitionId, definitionVersionId2, 2); _testWorkflowProvider.MaterializedWorkflows = [workflowV1, workflowV2]; - + // Reload the workflow definitions. await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync(); - + // Assert that the activity registry contains a new activity descriptor representing the new workflow version. var activityV2 = _activityRegistry.Find(activityTypeName)!; Assert.Equal(2, activityV2.Version); } - + private async Task BuildWorkflowAsync(string definitionId, string definitionVersionId, int version) { var builder = _workflowBuilderFactory.CreateBuilder();