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