public async Task do_not_throw_target_invocation_exception_upon_failure()
        {
            var       container = Substitute.For <IContainer>();
            var       scope     = Substitute.For <IContainerScope>();
            var       query     = new TestQuery();
            var       handler   = Substitute.For <IQueryHandler <TestQuery, string> >();
            Exception actual    = null;

            container.CreateScope().Returns(scope);
            handler.When(x => x.ExecuteAsync(query)).Do(x => { throw new DataException(); });
            scope.ResolveAll(null).ReturnsForAnyArgs(new[] { handler });

            var sut = new IocQueryBus(container);

            try
            {
                await sut.QueryAsync(query);
            }
            catch (Exception exception)
            {
                actual = exception;
            }

            actual.Should().BeOfType <DataException>();
        }
        public IQueryBus CreateQueryBus(IContainer container)
        {
            var bus = new IocQueryBus(container);

            bus.QueryExecuted += (sender, args) => { CloseUnitOfWorks(args.Scope); };
            return(bus);
        }
 /// <summary>
 ///     Initializes a new instance of the <see cref="IocBusBuilder" /> class.
 /// </summary>
 /// <param name="container">The container.</param>
 public IocBusBuilder(IContainer container)
 {
     if (container == null) throw new ArgumentNullException("container");
     _container = container;
     CommandBus = new IocCommandBus(_container);
     RequestBus = new IocRequestReplyBus(container);
     EventBus = new IocEventBus(container);
     QueryBus = new IocQueryBus(container);
 }
        public void must_have_one_handler_to_be_able_to_execute_query()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();

            container.CreateScope().Returns(scope);
            scope.ResolveAll(null).ReturnsForAnyArgs(new IQueryHandler <TestQuery, string> [0]);

            var    sut = new IocQueryBus(container);
            Action x   = () => sut.QueryAsync(new TestQuery()).Wait();

            x.Should().Throw <CqsHandlerMissingException>();
        }
        public async Task handler_is_being_invoked()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();
            var handler   = Substitute.For <IQueryHandler <TestQuery, string> >();
            var query     = new TestQuery();

            container.CreateScope().Returns(scope);
            scope.ResolveAll(null).ReturnsForAnyArgs(new[] { handler });

            var sut = new IocQueryBus(container);
            await sut.QueryAsync(query);

            handler.Received().ExecuteAsync(query);
        }
        public async Task should_dispose_scope_when_done()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();

            container.CreateScope().Returns(scope);
            scope.ResolveAll(null).ReturnsForAnyArgs(new[]
            {
                Substitute.For <IQueryHandler <TestQuery, string> >(),
            });

            var sut = new IocQueryBus(container);
            await sut.QueryAsync(new TestQuery());

            scope.Received().Dispose();
        }
        public void may_only_have_one_query_handler_to_avoid_ambiguity()
        {
            var container = Substitute.For <IContainer>();
            var scope     = Substitute.For <IContainerScope>();

            container.CreateScope().Returns(scope);
            scope.ResolveAll(null).ReturnsForAnyArgs(new[]
            {
                Substitute.For <IQueryHandler <TestQuery, string> >(),
                Substitute.For <IQueryHandler <TestQuery, string> >()
            });

            var    sut = new IocQueryBus(container);
            Action x   = () => sut.QueryAsync(new TestQuery()).Wait();

            x.Should().Throw <OnlyOneHandlerAllowedException>();
        }