2323
2424using System ;
2525using System . Collections . Generic ;
26+ using System . Linq ;
2627using System . Threading ;
2728using System . Threading . Tasks ;
2829using EventFlow . Aggregates ;
2930using EventFlow . Core ;
3031using EventFlow . Core . Caching ;
31- using EventFlow . Sagas ;
3232using EventFlow . Sagas . AggregateSagas ;
3333using EventFlow . TestHelpers ;
34+ using EventFlow . TestHelpers . Aggregates . Events ;
3435using EventFlow . TestHelpers . Aggregates . Sagas ;
3536using Moq ;
3637using NUnit . Framework ;
@@ -40,26 +41,25 @@ namespace EventFlow.Tests.UnitTests.Sagas.AggregateSagas
4041 [ Category ( Categories . Unit ) ]
4142 public class SagaAggregateStoreTests : TestsFor < SagaAggregateStore >
4243 {
44+ private ThingySagaId _thingySagaId ;
45+ private Mock < ThingySaga > _thingySaga ;
46+
4347 [ SetUp ]
4448 public void SetUp ( )
4549 {
50+ _thingySagaId = A < ThingySagaId > ( ) ;
51+ _thingySaga = InjectMock < ThingySaga > ( _thingySagaId ) ;
52+
4653 Inject < IMemoryCache > ( A < MemoryCache > ( ) ) ;
4754 }
4855
4956 [ Test ]
5057 public async Task AggregateStore_UpdateAsync_IsInvoked ( )
5158 {
5259 // Arrange
53- var aggregateStoreMock = InjectMock < IAggregateStore > ( ) ;
5460 var thingySagaId = A < ThingySagaId > ( ) ;
5561 var sourceId = A < SourceId > ( ) ;
56- aggregateStoreMock
57- . Setup ( s => s . UpdateAsync (
58- thingySagaId ,
59- sourceId ,
60- It . IsAny < Func < ThingySaga , CancellationToken , Task > > ( ) ,
61- It . IsAny < CancellationToken > ( ) ) )
62- . ReturnsAsync ( new List < IDomainEvent > ( ) ) ;
62+ var aggregateStoreMock = ArrangeAggregateStoreMock ( thingySagaId , sourceId , A < bool > ( ) ) ;
6363
6464 // Act
6565 await Sut . UpdateAsync (
@@ -78,5 +78,50 @@ await Sut.UpdateAsync(
7878 It . IsAny < CancellationToken > ( ) ) ,
7979 Times . Once ) ;
8080 }
81+
82+ [ TestCase ( true ) ]
83+ [ TestCase ( false ) ]
84+ public async Task CommandBus_PublishAsync_IsInvoked ( bool eventsAreEmitted )
85+ {
86+ // Arrange
87+ var thingySagaId = A < ThingySagaId > ( ) ;
88+ var sourceId = A < SourceId > ( ) ;
89+ ArrangeAggregateStoreMock ( thingySagaId , sourceId , eventsAreEmitted ) ;
90+
91+ // Act
92+ await Sut . UpdateAsync (
93+ thingySagaId ,
94+ typeof ( ThingySaga ) ,
95+ sourceId ,
96+ ( s , c ) => Task . FromResult ( 0 ) ,
97+ CancellationToken . None ) ;
98+
99+ // Assert
100+ _thingySaga . Verify (
101+ s => s . PublishAsync ( It . IsAny < ICommandBus > ( ) , It . IsAny < CancellationToken > ( ) ) ,
102+ Times . AtLeastOnce ) ;
103+ }
104+
105+ private Mock < IAggregateStore > ArrangeAggregateStoreMock (
106+ ThingySagaId thingySagaId ,
107+ ISourceId sourceId ,
108+ bool returnsDomainEvents )
109+ {
110+ var aggregateStoreMock = InjectMock < IAggregateStore > ( ) ;
111+ var domainEvents = ManyDomainEvents < ThingyPingEvent > ( returnsDomainEvents ? 3 : 0 )
112+ . Cast < IDomainEvent > ( )
113+ . ToList ( ) ;
114+
115+ aggregateStoreMock
116+ . Setup ( s => s . UpdateAsync (
117+ thingySagaId ,
118+ sourceId ,
119+ It . IsAny < Func < ThingySaga , CancellationToken , Task > > ( ) ,
120+ It . IsAny < CancellationToken > ( ) ) )
121+ . Callback < ThingySagaId , ISourceId , Func < ThingySaga , CancellationToken , Task > , CancellationToken > (
122+ ( id , sid , f , c ) => f ( _thingySaga . Object , CancellationToken . None ) . Wait ( c ) )
123+ . ReturnsAsync ( domainEvents ) ;
124+ return aggregateStoreMock ;
125+ }
81126 }
82127}
0 commit comments