1
+ using Microsoft . Extensions . DependencyInjection ;
2
+ using Xunit ;
3
+
4
+ namespace Atc . Cosmos . EventStore . Cqrs . Tests . Functional ;
5
+
6
+ #nullable enable
7
+
8
+ [ Trait ( "Category" , "Functional" ) ]
9
+ public class CommandHandlerTests : IAsyncLifetime
10
+ {
11
+ private CqrsTestHost host = null ! ;
12
+
13
+ [ Fact ]
14
+ public async Task Result_from_CommandHandler_must_be_returned ( )
15
+ {
16
+ var tick = DateTime . UtcNow . Ticks ;
17
+ var commandResult = await host . Services . GetRequiredService < ICommandProcessorFactory > ( )
18
+ . Create < MakeTimeTickCommand > ( )
19
+ . ExecuteAsync ( new MakeTimeTickCommand ( tick ) , CancellationToken . None ) ;
20
+
21
+ Assert . NotNull ( commandResult ) ;
22
+ Assert . NotNull ( commandResult . Response ) ;
23
+ Assert . Equal ( tick , commandResult . Response ) ;
24
+ }
25
+
26
+ [ Fact ]
27
+ public async Task CommandHandler_can_consume_existing_events ( )
28
+ {
29
+ // Produce some events by making time tick
30
+ await MakeTimeTick ( host ) ;
31
+ await MakeTimeTick ( host ) ;
32
+ await MakeTimeTick ( host ) ;
33
+
34
+ // Query events
35
+ var result = await host . Services . GetRequiredService < ICommandProcessorFactory > ( )
36
+ . Create < QueryTimeTickCommand > ( )
37
+ . ExecuteAsync ( new QueryTimeTickCommand ( ) , CancellationToken . None ) ;
38
+
39
+ var events = Assert . IsType < List < ( TimeTickedEvent Evt , EventMetadata Metadata ) >> ( result . Response ) ;
40
+ Assert . Equal ( 3 , events . Count ) ;
41
+
42
+ static async Task MakeTimeTick ( CqrsTestHost host )
43
+ {
44
+ var tick = DateTime . UtcNow . Ticks ;
45
+ var commandProcessorFactory = host . Services . GetRequiredService < ICommandProcessorFactory > ( ) ;
46
+ _ = await commandProcessorFactory
47
+ . Create < MakeTimeTickCommand > ( )
48
+ . ExecuteAsync ( new MakeTimeTickCommand ( tick ) , CancellationToken . None ) ;
49
+ }
50
+ }
51
+
52
+ [ Fact ]
53
+ public async Task CommandHandler_that_consumes_events_works_when_no_existing_events_are_present ( )
54
+ {
55
+ // Query events - none exists
56
+ var result = await host . Services . GetRequiredService < ICommandProcessorFactory > ( )
57
+ . Create < QueryTimeTickCommand > ( )
58
+ . ExecuteAsync ( new QueryTimeTickCommand ( ) , CancellationToken . None ) ;
59
+
60
+ var events = Assert . IsType < List < ( TimeTickedEvent Evt , EventMetadata Metadata ) >> ( result . Response ) ;
61
+ Assert . Empty ( events ) ;
62
+ }
63
+
64
+ [ Fact ]
65
+ public async Task Command_that_uses_RequiredVersion_Exists_must_result_in_NotFound_when_no_existing_events_are_present ( )
66
+ {
67
+ // Query events - must fail as non exists
68
+ var result = await host . Services . GetRequiredService < ICommandProcessorFactory > ( )
69
+ . Create < QueryExistingTimeTickCommand > ( )
70
+ . ExecuteAsync ( new QueryExistingTimeTickCommand ( ) , CancellationToken . None ) ;
71
+
72
+ Assert . Equal ( ResultType . NotFound , result . Result ) ;
73
+ }
74
+
75
+ public async Task InitializeAsync ( )
76
+ {
77
+ host = new CqrsTestHost ( ) ;
78
+ await host . StartAsync ( ) ;
79
+ }
80
+
81
+ public async Task DisposeAsync ( )
82
+ {
83
+ await host . DisposeAsync ( ) ;
84
+ }
85
+ }
0 commit comments