elsa-core/test/unit/Elsa.Persistence.VNext.UnitTests/WorkflowRuntimePersistenceEvaluatorTests.cs
Sipke Schoorstra c16995014c
Add Persistence vNext provider-neutral POC
Adds the Persistence vNext proof of concept, including provider-neutral schema/document abstractions, relational and document provider POCs, Elsa integration, runtime-defined entities, physicalization planning, workflow runtime evaluation, and focused tests.
2026-06-02 21:05:21 +02:00

99 lines
3.7 KiB
C#

using Elsa.Persistence.VNext.Runtime.Evaluation;
namespace Elsa.Persistence.VNext.UnitTests;
public class WorkflowRuntimePersistenceEvaluatorTests
{
private readonly WorkflowRuntimePersistenceEvaluator _evaluator = new();
[Fact]
public void Evaluator_AdoptsMetadataStoreWithProviderContractTests()
{
var candidate = new WorkflowRuntimePersistenceCandidate(
"WorkflowDefinitions",
WorkflowRuntimePersistenceArea.Management,
WorkflowRuntimePersistenceWorkload.Metadata,
RequiresDistributedLocking: false,
RequiresOrderedAppend: false,
HasRepresentativeBenchmark: false,
HasProviderContractTests: true);
var decision = _evaluator.Evaluate(candidate);
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.AdoptVNext, decision.Kind);
Assert.Contains("Metadata workloads fit", decision.Reasons.Single());
}
[Fact]
public void Evaluator_DefersHotDistributedLookupWithoutBenchmarkEvidence()
{
var candidate = new WorkflowRuntimePersistenceCandidate(
"Bookmarks",
WorkflowRuntimePersistenceArea.Bookmarks,
WorkflowRuntimePersistenceWorkload.HotLookup,
RequiresDistributedLocking: true,
RequiresOrderedAppend: false,
HasRepresentativeBenchmark: false,
HasProviderContractTests: true);
var decision = _evaluator.Evaluate(candidate);
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.DeferUntilBenchmarked, decision.Kind);
Assert.Contains("benchmark and lock/concurrency evidence", decision.Reasons.Single());
}
[Fact]
public void Evaluator_AllowsPhysicalizedHotLookupWhenEvidenceExists()
{
var candidate = new WorkflowRuntimePersistenceCandidate(
"Triggers",
WorkflowRuntimePersistenceArea.Triggers,
WorkflowRuntimePersistenceWorkload.HotLookup,
RequiresDistributedLocking: true,
RequiresOrderedAppend: false,
HasRepresentativeBenchmark: true,
HasProviderContractTests: true);
var decision = _evaluator.Evaluate(candidate);
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.AdoptWithPhysicalization, decision.Kind);
Assert.Contains("physicalization policy", decision.RequiredEvidence.Single());
}
[Fact]
public void Evaluator_KeepsQueueWorkloadSpecialized()
{
var candidate = new WorkflowRuntimePersistenceCandidate(
"BookmarkQueue",
WorkflowRuntimePersistenceArea.Bookmarks,
WorkflowRuntimePersistenceWorkload.Queue,
RequiresDistributedLocking: true,
RequiresOrderedAppend: false,
HasRepresentativeBenchmark: true,
HasProviderContractTests: true);
var decision = _evaluator.Evaluate(candidate);
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.KeepSpecializedProvider, decision.Kind);
Assert.Contains("Queue workloads need", decision.Reasons.Single());
}
[Fact]
public void Evaluator_KeepsOrderedLogSpecialized()
{
var candidate = new WorkflowRuntimePersistenceCandidate(
"WorkflowExecutionLog",
WorkflowRuntimePersistenceArea.ExecutionLogs,
WorkflowRuntimePersistenceWorkload.AppendOnlyLog,
RequiresDistributedLocking: false,
RequiresOrderedAppend: true,
HasRepresentativeBenchmark: true,
HasProviderContractTests: true);
var decision = _evaluator.Evaluate(candidate);
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.KeepSpecializedProvider, decision.Kind);
Assert.Contains("ordered append", decision.Reasons.Single());
}
}