Skip to content

Commit 0238e79

Browse files
Add tests to verify v9 behavior for sagas with custom finders (#812)
* Add custom finder test to v9 * Add tests to verify v9 behavior for sagas with custom finders * Move version override * AutomaticVersionRange="false" * Order * Remove unneeded package --------- Co-authored-by: Brandon Ording <bording@gmail.com>
1 parent 8c02fa3 commit 0238e79

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
namespace NServiceBus.Testing.Tests.Sagas;
2+
3+
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Extensibility;
7+
using NServiceBus.Sagas;
8+
using NUnit.Framework;
9+
using Persistence;
10+
11+
[TestFixture]
12+
public class CustomFinder
13+
{
14+
[Test]
15+
public void TestSagaWithCustomFinderForMessageStartingTheSaga()
16+
{
17+
var exception = Assert.Throws<Exception>(() => new TestableSaga<SagaWithCustomFinderStarting, SagaWithCustomFinderStarting.SagaData>());
18+
19+
Assert.That(exception?.Message, Contains.Substring("Message type OrderBilled can start the saga SagaWithCustomFinderStarting (the saga implements IAmStartedByMessages<OrderBilled>) but does not map that message to saga data"));
20+
}
21+
22+
[Test]
23+
public async Task TestSagaWithCustomFinderForMessageNotStartingTheSaga()
24+
{
25+
var testableSaga = new TestableSaga<SagaWithCustomFinderNotStarting, SagaWithCustomFinderNotStarting.SagaData>();
26+
27+
var placeResult = await testableSaga.Handle(new OrderPlaced { OrderId = "abc" });
28+
29+
var exception = Assert.ThrowsAsync<Exception>(async () => await testableSaga.Handle(new OrderBilled { OrderId = "abc" }));
30+
31+
Assert.Multiple(() =>
32+
{
33+
Assert.That(placeResult.Completed, Is.False);
34+
Assert.That(placeResult.SagaDataSnapshot.Placed, Is.True);
35+
Assert.That(placeResult.SagaDataSnapshot.Billed, Is.False);
36+
Assert.That(exception?.Message, Contains.Substring("No mapped value found from message, could not look up saga data"));
37+
});
38+
}
39+
40+
public class SagaWithCustomFinderStarting : Saga<SagaWithCustomFinderStarting.SagaData>,
41+
IAmStartedByMessages<OrderPlaced>,
42+
#pragma warning disable NSB0006
43+
IAmStartedByMessages<OrderBilled>
44+
#pragma warning restore NSB0006
45+
{
46+
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<SagaData> mapper) =>
47+
mapper.MapSaga(saga => saga.OrderId)
48+
.ToMessage<OrderPlaced>(msg => msg.OrderId);
49+
50+
public class MyFinder : ISagaFinder<SagaData, OrderBilled>
51+
{
52+
public Task<SagaData> FindBy(OrderBilled message, ISynchronizedStorageSession storageSession, IReadOnlyContextBag context, CancellationToken cancellationToken = new CancellationToken()) => throw new NotImplementedException();
53+
}
54+
55+
public Task Handle(OrderPlaced message, IMessageHandlerContext context) => Task.FromResult(Data.Placed = true);
56+
57+
public Task Handle(OrderBilled message, IMessageHandlerContext context) => Task.FromResult(Data.Billed = true);
58+
59+
public class SagaData : ContainSagaData
60+
{
61+
public string OrderId { get; set; }
62+
public bool Placed { get; set; }
63+
public bool Billed { get; set; }
64+
}
65+
}
66+
67+
public class SagaWithCustomFinderNotStarting : Saga<SagaWithCustomFinderNotStarting.SagaData>,
68+
IAmStartedByMessages<OrderPlaced>,
69+
IHandleMessages<OrderBilled>
70+
{
71+
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<SagaData> mapper) =>
72+
mapper.MapSaga(saga => saga.OrderId)
73+
.ToMessage<OrderPlaced>(msg => msg.OrderId);
74+
75+
public class MyFinder : ISagaFinder<SagaData, OrderBilled>
76+
{
77+
public Task<SagaData> FindBy(OrderBilled message, ISynchronizedStorageSession storageSession, IReadOnlyContextBag context, CancellationToken cancellationToken = new CancellationToken()) => throw new NotImplementedException();
78+
}
79+
80+
public Task Handle(OrderPlaced message, IMessageHandlerContext context) => Task.FromResult(Data.Placed = true);
81+
82+
public Task Handle(OrderBilled message, IMessageHandlerContext context) => Task.FromResult(Data.Billed = true);
83+
84+
public class SagaData : ContainSagaData
85+
{
86+
public string OrderId { get; set; }
87+
public bool Placed { get; set; }
88+
public bool Billed { get; set; }
89+
}
90+
}
91+
92+
public class OrderPlaced : IEvent
93+
{
94+
public string OrderId { get; set; }
95+
}
96+
97+
public class OrderBilled : IEvent
98+
{
99+
public string OrderId { get; set; }
100+
}
101+
102+
public class OrderShipped : IEvent
103+
{
104+
public string OrderId { get; set; }
105+
}
106+
}

0 commit comments

Comments
 (0)