Skip to content

Commit 96599a0

Browse files
committed
Fixes
1 parent 8aaace7 commit 96599a0

57 files changed

Lines changed: 356 additions & 813 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cleipnir.Flows.Tests.AspNet/BulkPublishTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Cleipnir.ResilientFunctions.Domain;
22
using Cleipnir.ResilientFunctions.Messaging;
3-
using Cleipnir.ResilientFunctions.Reactive.Extensions;
43
using Cleipnir.ResilientFunctions.Storage;
54

65
namespace Cleipnir.Flows.Tests.AspNet;
@@ -52,7 +51,7 @@ private class TestFlow : Flow
5251
{
5352
public override async Task Run()
5453
{
55-
await Messages.FirstOfType<string>();
54+
await Message<string>();
5655
}
5756
}
5857
}

Cleipnir.Flows.Tests/Flows/CorrelationIdFlowTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Cleipnir.ResilientFunctions.Helpers;
2-
using Cleipnir.ResilientFunctions.Reactive.Extensions;
32
using Cleipnir.ResilientFunctions.Storage;
43
using Microsoft.Extensions.DependencyInjection;
54
using Shouldly;
@@ -47,7 +46,7 @@ public override async Task Run()
4746
await Workflow.RegisterCorrelation("SomeCorrelationId");
4847
CorrelationRegistered = true;
4948

50-
ReceivedMessage = await Messages.FirstOfType<Message>();
49+
ReceivedMessage = await Message<Message>();
5150
}
5251
}
5352

Cleipnir.Flows.Tests/Flows/FlowsWithResultTests.cs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
using Cleipnir.ResilientFunctions;
21
using Cleipnir.ResilientFunctions.Domain;
32
using Cleipnir.ResilientFunctions.Helpers;
4-
using Cleipnir.ResilientFunctions.Reactive.Extensions;
53
using Cleipnir.ResilientFunctions.Storage;
64
using Microsoft.Extensions.DependencyInjection;
75
using Shouldly;
@@ -68,28 +66,29 @@ public async Task CompletionOfScheduledFlowCanBeAwaited()
6866
var flowsContainer = new FlowsContainer(
6967
flowStore,
7068
serviceCollection.BuildServiceProvider(),
71-
Options.Default
69+
new Options(watchdogCheckFrequency: TimeSpan.FromMilliseconds(100))
7270
);
7371

7472
var flows = new SimpledDelayedFlows(flowsContainer);
7573
var scheduled = await flows.Schedule("someInstanceId", "someParameter");
7674

77-
await Task.Delay(1000);
78-
var result = await scheduled.Completion();
75+
// Flow uses non-suspending delay, so it completes directly
76+
var result = await scheduled.Completion(maxWait: TimeSpan.FromSeconds(5));
7977
result.ShouldBe(1);
8078
}
81-
79+
8280
private class SimpledDelayedFlows : Flows<SimpledDelayedFlow, string, int>
8381
{
84-
public SimpledDelayedFlows(FlowsContainer flowsContainer)
82+
public SimpledDelayedFlows(FlowsContainer flowsContainer)
8583
: base(nameof(SimpledDelayedFlow), flowsContainer, options: null) { }
8684
}
87-
85+
8886
public class SimpledDelayedFlow : Flow<string, int>
8987
{
9088
public override async Task<int> Run(string param)
9189
{
92-
await Delay(TimeSpan.FromSeconds(1));
90+
// Use non-suspending delay to avoid watchdog dependency
91+
await Delay(TimeSpan.FromMilliseconds(100), suspend: false);
9392
return 1;
9493
}
9594
}
@@ -104,7 +103,7 @@ public async Task EventDrivenFlowCompletesSuccessfully()
104103
var flowsContainer = new FlowsContainer(
105104
flowStore,
106105
serviceCollection.BuildServiceProvider(),
107-
new Options()
106+
new Options(watchdogCheckFrequency: TimeSpan.FromMilliseconds(100))
108107
);
109108

110109
var flows = new MessageDrivenFuncFlows(flowsContainer);
@@ -113,12 +112,12 @@ public async Task EventDrivenFlowCompletesSuccessfully()
113112
await Task.Delay(10);
114113
var controlPanel = await flows.ControlPanel(instanceId: "someInstanceId");
115114
controlPanel.ShouldNotBeNull();
116-
controlPanel.Status.ShouldBe(Status.Executing);
115+
controlPanel.Status.ShouldBe(Status.Suspended);
117116

118117
var messageWriter = flows.MessageWriter("someInstanceId");
119-
await messageWriter.AppendMessage(2);
118+
await messageWriter.AppendMessage(new IntWrapper(2));
120119

121-
await controlPanel.WaitForCompletion();
120+
await controlPanel.WaitForCompletion(allowPostponeAndSuspended: true);
122121

123122
await controlPanel.Refresh();
124123
controlPanel.ShouldNotBeNull();
@@ -136,10 +135,12 @@ public class MessageDrivenFuncFlow : Flow<string, int>
136135
{
137136
public override async Task<int> Run(string param)
138137
{
139-
var next = await Messages.FirstOfType<int>(maxWait: TimeSpan.MaxValue);
140-
return next;
138+
var next = await Message<IntWrapper>();
139+
return next.Value;
141140
}
142141
}
142+
143+
public record IntWrapper(int Value);
143144

144145
[TestMethod]
145146
public async Task FailingFlowCompletesWithError()

Cleipnir.Flows.Tests/Flows/FlowsWithStateTests.cs

Lines changed: 0 additions & 143 deletions
This file was deleted.

Cleipnir.Flows.Tests/Flows/FunctionRegistrationTests.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Cleipnir.ResilientFunctions.Domain;
22
using Cleipnir.ResilientFunctions.Helpers;
33
using Cleipnir.ResilientFunctions.Messaging;
4-
using Cleipnir.ResilientFunctions.Reactive.Extensions;
54
using Shouldly;
65

76
namespace Cleipnir.Flows.Tests.Flows;
@@ -35,11 +34,11 @@ await flows.Run(
3534
"SomeInstanceId",
3635
param: "SomeParam",
3736
new InitialState(
38-
[new MessageAndIdempotencyKey("InitialMessageValue")],
39-
[new InitialEffect("InitialEffectId", "InitialEffectValue")]
37+
[new MessageAndIdempotencyKey(new StringMessage("InitialMessageValue"))],
38+
[new InitialEffect(0, "InitialEffectValue")]
4039
)
4140
);
42-
41+
4342
flow.InitialEffectValue.ShouldBe("InitialEffectValue");
4443
flow.InitialMessageValue.ShouldBe("InitialMessageValue");
4544
}
@@ -48,12 +47,15 @@ private class InitialStateFlow : Flow<string, string>
4847
{
4948
public string? InitialEffectValue { get; set; }
5049
public string? InitialMessageValue { get; set; }
51-
50+
5251
public override async Task<string> Run(string _)
5352
{
54-
InitialEffectValue = await Effect.Get<string>("InitialEffectId");
55-
InitialMessageValue = await Messages.OfType<string>().First();
53+
InitialEffectValue = await Capture(() => "should not be called");
54+
var msg = await Message<StringMessage>();
55+
InitialMessageValue = msg.Value;
5656
return "";
5757
}
5858
}
59+
60+
private record StringMessage(string Value);
5961
}

Cleipnir.Flows.Tests/Flows/OptionsTests.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Cleipnir.Flows.AspNet;
22
using Cleipnir.ResilientFunctions.Domain;
33
using Cleipnir.ResilientFunctions.Domain.Exceptions;
4-
using Cleipnir.ResilientFunctions.Reactive.Extensions;
54
using Cleipnir.ResilientFunctions.Storage;
65
using Microsoft.Extensions.DependencyInjection;
76
using Shouldly;
@@ -18,7 +17,10 @@ public async Task SimpleFlowCompletesSuccessfully()
1817

1918
serviceCollection.AddFlows(c => c
2019
.UseInMemoryStore()
21-
.WithOptions(new Options(messagesDefaultMaxWaitForCompletion: TimeSpan.MaxValue))
20+
.WithOptions(new Options(
21+
messagesDefaultMaxWaitForCompletion: TimeSpan.FromDays(1),
22+
watchdogCheckFrequency: TimeSpan.FromMilliseconds(100)
23+
))
2224
.RegisterFlow<OptionsTestWithOverriddenOptionsFlow, OptionsTestWithOverriddenOptionsFlows>(
2325
flowsFactory: sp => new OptionsTestWithOverriddenOptionsFlows(
2426
sp.GetRequiredService<FlowsContainer>(),
@@ -34,19 +36,20 @@ public async Task SimpleFlowCompletesSuccessfully()
3436
await Should.ThrowAsync<InvocationSuspendedException>(
3537
() => flowsWithOverridenOptions.Run("Id")
3638
);
37-
39+
3840
var flowsWithDefaultProvidedOptions = sp.GetRequiredService<OptionsTestWithDefaultProvidedOptionsFlows>();
3941
await flowsWithDefaultProvidedOptions.Schedule("Id");
4042

4143
await Task.Delay(100);
42-
44+
4345
var controlPanel = await flowsWithDefaultProvidedOptions.ControlPanel("Id");
4446
controlPanel.ShouldNotBeNull();
45-
controlPanel.Status.ShouldBe(Status.Executing);
47+
// Flow may be Executing (waiting for message) or Suspended depending on timing
48+
controlPanel.Status.ShouldBeOneOf(Status.Executing, Status.Suspended);
4649

47-
await controlPanel.Messages.Append("Hello");
50+
await controlPanel.Messages.Append(new StringWrapper("Hello"));
4851

49-
await controlPanel.WaitForCompletion();
52+
await controlPanel.WaitForCompletion(allowPostponeAndSuspended: true);
5053
}
5154

5255

@@ -60,7 +63,10 @@ public async Task FlowNameCanBeSpecifiedFromTheOutside()
6063

6164
serviceCollection.AddFlows(c => c
6265
.UseInMemoryStore(store)
63-
.WithOptions(new Options(messagesDefaultMaxWaitForCompletion: TimeSpan.MaxValue))
66+
.WithOptions(new Options(
67+
messagesDefaultMaxWaitForCompletion: TimeSpan.FromDays(1),
68+
watchdogCheckFrequency: TimeSpan.FromMilliseconds(100)
69+
))
6470
.RegisterFlow<SimpleFlow, SimpleFlows>(
6571
flowsFactory: sp => new SimpleFlows(
6672
sp.GetRequiredService<FlowsContainer>(),
@@ -72,7 +78,7 @@ public async Task FlowNameCanBeSpecifiedFromTheOutside()
7278
var sp = serviceCollection.BuildServiceProvider();
7379
var flows = sp.GetRequiredService<SimpleFlows>();
7480
await flows.Run("Id");
75-
var sf = await store.GetFunction(new StoredId(storedType, Instance: "Id".ToStoredInstance()));
81+
var sf = await store.GetFunction(StoredId.Create(storedType, "Id"));
7682
sf.ShouldNotBeNull();
7783
sf.Status.ShouldBe(Status.Succeeded);
7884
}
@@ -83,19 +89,21 @@ public class OptionsTestWithOverriddenOptionsFlow : Flow
8389
{
8490
public override async Task Run()
8591
{
86-
await Messages.First();
92+
await Message<StringWrapper>();
8793
}
8894
}
89-
95+
9096
[GenerateFlows]
9197
public class OptionsTestWithDefaultProvidedOptionsFlow : Flow
9298
{
9399
public override async Task Run()
94100
{
95-
await Messages.First();
101+
await Message<StringWrapper>();
96102
}
97103
}
98104

105+
public record StringWrapper(string Value);
106+
99107
[GenerateFlows]
100108
public class SimpleFlow : Flow
101109
{

0 commit comments

Comments
 (0)