@@ -238,6 +238,120 @@ public async Task
238
238
. MustHaveHappenedOnceExactly ( ) ;
239
239
}
240
240
241
+ [ Fact ( DisplayName = "RunExecuteMiddleware should run nothing when no middleware" ) ]
242
+ public void RunExecuteMiddleware_should_run_nothing_when_no_middleware ( )
243
+ {
244
+ // Act
245
+ Func < Task > action = async ( ) => await Runner . RunExecuteMiddleware ( Workflow , Definition ) ;
246
+
247
+ // Assert
248
+ action . ShouldNotThrow ( ) ;
249
+ }
250
+
251
+ [ Fact ( DisplayName = "RunExecuteMiddleware should run middleware when one middleware" ) ]
252
+ public async Task RunExecuteMiddleware_should_run_middleware_when_one_middleware ( )
253
+ {
254
+ // Arrange
255
+ var middleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow ) ;
256
+ Middleware . Add ( middleware ) ;
257
+
258
+ // Act
259
+ await Runner . RunExecuteMiddleware ( Workflow , Definition ) ;
260
+
261
+ // Assert
262
+ A
263
+ . CallTo ( HandleMethodFor ( middleware ) )
264
+ . MustHaveHappenedOnceExactly ( ) ;
265
+ }
266
+
267
+ [ Fact ( DisplayName = "RunExecuteMiddleware should run all middleware when multiple middleware" ) ]
268
+ public async Task RunExecuteMiddleware_should_run_all_middleware_when_multiple_middleware ( )
269
+ {
270
+ // Arrange
271
+ var middleware1 = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 1 ) ;
272
+ var middleware2 = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 2 ) ;
273
+ var middleware3 = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 3 ) ;
274
+ Middleware . AddRange ( new [ ] { middleware1 , middleware2 , middleware3 } ) ;
275
+
276
+ // Act
277
+ await Runner . RunPostMiddleware ( Workflow , Definition ) ;
278
+
279
+ // Assert
280
+ A
281
+ . CallTo ( HandleMethodFor ( middleware3 ) )
282
+ . MustHaveHappenedOnceExactly ( )
283
+ . Then ( A
284
+ . CallTo ( HandleMethodFor ( middleware2 ) )
285
+ . MustHaveHappenedOnceExactly ( ) )
286
+ . Then ( A
287
+ . CallTo ( HandleMethodFor ( middleware1 ) )
288
+ . MustHaveHappenedOnceExactly ( ) ) ;
289
+ }
290
+
291
+ [ Fact ( DisplayName = "RunExecuteMiddleware should run middleware in ExecuteWorkflow and PostWorkflow phase" ) ]
292
+ public async Task RunExecuteMiddleware_should_run_middleware_in_ExecuteWorkflow_and_PostWorkflow_phase ( )
293
+ {
294
+ // Arrange
295
+ var executeMiddleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 1 ) ;
296
+ var postMiddleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . PostWorkflow , 2 ) ;
297
+ var preMiddleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . PreWorkflow , 3 ) ;
298
+ Middleware . AddRange ( new [ ] { preMiddleware , postMiddleware , executeMiddleware } ) ;
299
+
300
+ // Act
301
+ // TODO: add same test when workflow not completed
302
+ await Runner . RunExecuteMiddleware ( Workflow , Definition ) ;
303
+
304
+ // Assert
305
+ A
306
+ . CallTo ( HandleMethodFor ( executeMiddleware ) )
307
+ . MustHaveHappenedOnceExactly ( )
308
+ . Then ( A
309
+ . CallTo ( HandleMethodFor ( postMiddleware ) )
310
+ . MustHaveHappenedOnceExactly ( ) ) ;
311
+
312
+ A . CallTo ( HandleMethodFor ( preMiddleware ) ) . MustNotHaveHappened ( ) ;
313
+ }
314
+
315
+ [ Fact ( DisplayName = "RunExecuteMiddleware should call top level error handler when middleware throws" ) ]
316
+ public async Task RunExecuteMiddleware_should_call_top_level_error_handler_when_middleware_throws ( )
317
+ {
318
+ // Arrange
319
+ var middleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 1 ) ;
320
+ A . CallTo ( HandleMethodFor ( middleware ) ) . ThrowsAsync ( new ApplicationException ( "Something went wrong" ) ) ;
321
+ Middleware . AddRange ( new [ ] { middleware } ) ;
322
+
323
+ // Act
324
+ await Runner . RunExecuteMiddleware ( Workflow , Definition ) ;
325
+
326
+ // Assert
327
+ A
328
+ . CallTo ( HandleMethodFor ( TopLevelErrorHandler ) )
329
+ . MustHaveHappenedOnceExactly ( ) ;
330
+ }
331
+
332
+ [ Fact ( DisplayName =
333
+ "RunExecuteMiddleware should call error handler on workflow def when middleware throws and def has handler defined" ) ]
334
+ public async Task
335
+ RunExecuteMiddleware_should_call_error_handler_on_workflow_def_when_middleware_throws_and_def_has_handler ( )
336
+ {
337
+ // Arrange
338
+ var middleware = BuildWorkflowMiddleware ( WorkflowMiddlewarePhase . ExecuteWorkflow , 1 ) ;
339
+ A . CallTo ( HandleMethodFor ( middleware ) ) . ThrowsAsync ( new ApplicationException ( "Something went wrong" ) ) ;
340
+ Middleware . AddRange ( new [ ] { middleware } ) ;
341
+ Definition . OnExecuteMiddlewareError = typeof ( IDefLevelErrorHandler ) ;
342
+
343
+ // Act
344
+ await Runner . RunExecuteMiddleware ( Workflow , Definition ) ;
345
+
346
+ // Assert
347
+ A
348
+ . CallTo ( HandleMethodFor ( TopLevelErrorHandler ) )
349
+ . MustNotHaveHappened ( ) ;
350
+ A
351
+ . CallTo ( HandleMethodFor ( DefLevelErrorHandler ) )
352
+ . MustHaveHappenedOnceExactly ( ) ;
353
+ }
354
+
241
355
#region Helpers
242
356
243
357
private IWorkflowMiddleware BuildWorkflowMiddleware (
0 commit comments