public async Task Should_be_able_to_execute_query_sucessfully() { var scope = Substitute.For <IHandlerScope>(); var result = new OneResult(); var handler = new OneQueryHandler(result); scope.Create(typeof(IQueryHandler <OneQuery, OneResult>)).Returns(new[] { handler }); var sut = new MessageInvoker(scope); var context = new ExecuteQueriesInvocationContext(ClaimsPrincipal.Current, sut); await sut.ProcessAsync(context, new OneQuery()); context.Replies.First().Body.Should().BeSameAs(result); }
public void Should_abort_if_multiple_query_handlers_have_been_registered() { var scope = Substitute.For <IHandlerScope>(); var result = new OneResult(); var handler = new OneQueryHandler(result); scope.Create(typeof(IQueryHandler <OneQuery, OneResult>)).Returns(new[] { handler, handler }); var sut = new MessageInvoker(scope); var context = new ExecuteQueriesInvocationContext(ClaimsPrincipal.Current, sut); Func <Task> actual = () => sut.ProcessAsync(context, new OneQuery()); actual.Should().Throw <OnlyOneQueryHandlerAllowedException>(); }
public async Task Should_invoke_second_level_queries_directly() { var scope = Substitute.For <IHandlerScope>(); var result = new OneResult(); QueryTwoResult expected = null; var handler = new OneQueryHandler(result, (messageContext, query) => { expected = messageContext.QueryAsync(new QueryTwo()).GetAwaiter().GetResult(); }); var result2 = new QueryTwoResult(); var handler2 = new QueryTwoHandler(result2); scope.Create(typeof(IQueryHandler <OneQuery, OneResult>)).Returns(new[] { handler }); scope.Create(typeof(IQueryHandler <QueryTwo, QueryTwoResult>)).Returns(new[] { handler2 }); var sut = new MessageInvoker(scope); var context = new ExecuteQueriesInvocationContext(ClaimsPrincipal.Current, sut); await sut.ProcessAsync(context, new OneQuery()); expected.Should().BeSameAs(result2, "because it should not be enqueued as queries that comes from the queue"); context.Replies.Count.Should().Be(1, "because only result from first queue should be enqueued"); context.Replies.First().Body.Should().Be(result); context.Messages.Should().BeEmpty("because no messages were enqueued by the handlers"); }