public async Task Should_Store_Registered_Query_Handler_In_Container()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);

                var container = new Container();

                container.Register <IQueryAsyncHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter); // Async handler resolver

                const string data = nameof(Should_Store_Registered_Query_Handler_In_Container);

                QueryHandlerDelegate <string> queryHandlerDelegate = resolver.ResolveQueryHandler <QuerySomething, string>();

                Assert.NotNull(queryHandlerDelegate);

                var registeredQueryHandler = container.GetInstance <IQueryAsyncHandler <QuerySomething, string> >();

                var query = new QuerySomething(data);

                var result1 = await queryHandlerDelegate.Invoke(query);

                var result2 = await registeredQueryHandler.HandleAsync(query);

                Assert.Equal(data, result1);
                Assert.Equal(data, result2);
                Assert.Equal(result1, result2);
            }
예제 #2
0
            public Task Should_Throw_When_Cancelled()
            {
                return(Assert.ThrowsAnyAsync <OperationCanceledException>(async() =>
                {
                    var queryHandler = new TestQueryHandler(_testOutputHelper);
                    var registration = new QueryHandlerRegistration();
                    registration.Register(() => (IQueryAsyncHandler <QuerySomethingWithDelay, string>)queryHandler);

                    var cts = new CancellationTokenSource();

                    var dispatcher = new QueryDispatcher(registration);
                    Task task = dispatcher.DispatchAsync <QuerySomethingWithDelay, string>(new QuerySomethingWithDelay("This will be cancelled", 3000), cts.Token);

                    cts.Cancel();

                    try
                    {
                        await task;
                    }
                    catch (Exception ex)
                    {
                        _testOutputHelper.WriteLine(ex.ToString());
                        throw;
                    }
                }));
            }
예제 #3
0
            public async Task Should_Invoke_Registered_Query_Handler_In_Container_When_Dispatched_Multiple_Times()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);
                container.Register <IQueryAsyncHandler <QuerySomethingWithNonReferenceTypeResult, int> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter);

                const string data1 = "Test message 1.";
                const string data2 = "Test message 2.";
                const int    data3 = 1;

                var dispatcher = new QueryDispatcher(resolver);
                var result1    = dispatcher.DispatchAsync <QuerySomething, string>(new QuerySomething(data1));
                var result2    = dispatcher.DispatchAsync <QuerySomething, string>(new QuerySomething(data2));
                var result3    = dispatcher.DispatchAsync <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(data3));

                await Task.WhenAll(result1, result2, result3);

                Assert.Equal(data1, await result1);
                Assert.Equal(data2, await result2);
                Assert.Equal(data3, await result3);
            }
            public async Task ShouldResolveQueryHandlersFromContainer()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);

                var container = new Container();

                container.Register <IQueryAsyncHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter); // Async handler resolver

                const string data = nameof(ShouldResolveQueryHandlersFromContainer);

                QueryHandlerDelegate <string> queryHandlerDelegate = resolver.ResolveQueryHandler <QuerySomething, string>();

                queryHandlerDelegate.Should().NotBeNull();

                var registeredQueryHandler = container.GetInstance <IQueryAsyncHandler <QuerySomething, string> >();

                var query = new QuerySomething(data);

                var result1 = await queryHandlerDelegate.Invoke(query);

                var result2 = await registeredQueryHandler.HandleAsync(query);

                result1.Should().Be(data);
                result2.Should().Be(data);
                result1.Should().Be(result1);
            }
예제 #5
0
        public async Task QueryAsyncCorrectlyUsesQueryHandler()
        {
            var configuration = new DomainConfiguration();
            var modelHandler  = new TestModelHandler();
            var modelMapper   = new TestModelMapper();
            var queryHandler  = new TestQueryHandler();

            configuration.SetHookPoint(typeof(IModelHandler), modelHandler);
            configuration.SetHookPoint(typeof(IModelMapper), modelMapper);
            configuration.SetHookPoint(typeof(IQueryHandler), queryHandler);
            configuration.EnsureCommitted();
            var context = new DomainContext(configuration);

            modelHandler.DomainContext = context;
            modelHandler.Model         = new EdmModel();
            queryHandler.DomainContext = context;
            queryHandler.Results       = new string[] { "Test" };

            var queryRequest = new QueryRequest(
                Domain.Source <string>(context, "Test"), true);
            var queryResult = await Domain.QueryAsync(context, queryRequest);

            Assert.True(queryResult.Results.Cast <string>()
                        .SequenceEqual(new string[] { "Test" }));
        }
예제 #6
0
            public void ShouldCheckForCorrectQueryType()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryHandler <QuerySomethingWithDelay, string>)queryHandler);

                QueryHandlerDelegate <string> queryHandlerDelegate = registration.ResolveQueryHandler <QuerySomethingWithDelay, string>();

                queryHandlerDelegate.Should().NotBeNull();

                const string data = nameof(ShouldCheckForCorrectQueryType);

                Func <Task> action = async() =>
                {
                    try
                    {
                        await queryHandlerDelegate.Invoke(new QuerySomething(data));
                    }
                    catch (Exception ex)
                    {
                        _testOutputHelper.WriteLine(ex.ToString());
                        throw;
                    }
                };

                action.Should().Throw <ArgumentException>();
            }
            public async Task ShouldInvokeRegisteredQueryHandlerInContainerWhenDispatchedMultipleTimes()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);
                container.Register <IQueryAsyncHandler <QuerySomethingWithNonReferenceTypeResult, int> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter);

                const string data1 = "Test message 1.";
                const string data2 = "Test message 2.";
                const int    data3 = 1;

                var dispatcher = new QueryDispatcher(resolver);
                var result1    = dispatcher.DispatchAsync <QuerySomething, string>(new QuerySomething(data1));
                var result2    = dispatcher.DispatchAsync <QuerySomething, string>(new QuerySomething(data2));
                var result3    = dispatcher.DispatchAsync <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(data3));

                await Task.WhenAll(result1, result2, result3);

                (await result1).Should().Be(data1);
                (await result2).Should().Be(data2);
                (await result3).Should().Be(data3);
            }
            public Task Should_Check_For_Correct_Query_Type()
            {
                return(Assert.ThrowsAnyAsync <ArgumentException>(async() =>
                {
                    var queryHandler = new TestQueryHandler(_testOutputHelper);
                    var registration = new QueryHandlerRegistration();
                    registration.Register(() => (IQueryHandler <QuerySomethingWithDelay, string>)queryHandler);

                    QueryHandlerDelegate <string> queryHandlerDelegate = registration.ResolveQueryHandler <QuerySomethingWithDelay, string>();

                    Assert.NotNull(queryHandlerDelegate);

                    const string data = nameof(Should_Check_For_Correct_Query_Type);

                    try
                    {
                        await queryHandlerDelegate.Invoke(new QuerySomething(data));
                    }
                    catch (Exception ex)
                    {
                        _testOutputHelper.WriteLine(ex.ToString());
                        throw;
                    }
                }));
            }
예제 #9
0
            public async Task Should_Allow_Registered_Query_Handlers_With_Non_Reference_Type_Query_Results()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryHandler <QuerySomethingWithNonReferenceTypeResult, int>)queryHandler);

                var dispatcher = new QueryDispatcher(registration);
                var result     = await dispatcher.DispatchAsync <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(1973));

                Assert.Equal(1973, result);
            }
            public async Task ShouldAllowRegisteredQueryHandlersWithNonReferenceTypeQueryResults()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryHandler <QuerySomethingWithNonReferenceTypeResult, int>)queryHandler);

                var dispatcher = new QueryDispatcher(registration);
                var result     = await dispatcher.DispatchAsync <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(1973));

                result.Should().Be(1973);
            }
        public void AuditDecorator_Calls_Query()
        {
            var queryHandler = new TestQueryHandler();
            var query        = new TestQuery("Value");
            var decorator    = new AuditDecorator <TestQuery, string>(_context, _serializer)
            {
                Handler = queryHandler
            };

            var result = decorator.Execute(query);

            result.Should().Be("Results");
        }
예제 #12
0
            public void Should_Invoke_Registered_Query_Handler()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomething, string>)queryHandler);

                const string data = nameof(Should_Invoke_Registered_Query_Handler);

                var dispatcher = new QueryDispatcher(registration);
                var result     = dispatcher.Dispatch <QuerySomething, string>(new QuerySomething(data));

                Assert.Equal(result, data);
            }
예제 #13
0
        public async Task ExecuteAsync_WhenHandlerIsRegistered_ExecutesHandler()
        {
            var handler = new TestQueryHandler();

            var serviceLocator = Substitute.For <IServiceProvider>();

            serviceLocator.GetService(typeof(IQueryHandler <TestQuery, Result>))
            .Returns(handler);

            var queryProcessor = new QueryDispatcher(serviceLocator);
            var result         = await queryProcessor.ExecuteAsync(new TestQuery("1"));

            result.Should().Be(new Result("1"));
        }
            public void ShouldInvokeRegisteredQueryHandler()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomething, string>)queryHandler);

                const string data = nameof(ShouldInvokeRegisteredQueryHandler);

                var dispatcher = new QueryDispatcher(registration);
                var result     = dispatcher.Dispatch <QuerySomething, string>(new QuerySomething(data));

                result.Should().Be(data);
            }
예제 #15
0
            public void Should_Allow_Registered_Query_Handlers_In_Container_With_Non_Reference_Type_Query_Results()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomethingWithNonReferenceTypeResult, int> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter); // Async handler resolver
                var dispatcher       = new QueryDispatcher(resolver);

                var result = dispatcher.Dispatch <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(1973));

                Assert.Equal(1973, result);
            }
            public void ShouldAllowRegisteredQueryHandlersInContainerWithNonReferenceTypeQueryResults()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomethingWithNonReferenceTypeResult, int> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter); // Async handler resolver
                var dispatcher       = new QueryDispatcher(resolver);

                var result = dispatcher.Dispatch <QuerySomethingWithNonReferenceTypeResult, int>(new QuerySomethingWithNonReferenceTypeResult(1973));

                result.Should().Be(1973);
            }
        public async Task Given_TestQuery_When_SendAsync_Then_ResultIsReturned()
        {
            //Arrange
            var query = new TestQuery
            {
                ReturnValue = "ReturnValue"
            };
            var queryHandler             = new TestQueryHandler();
            Func <Type, object> resolver = type => { return(queryHandler); };
            var queryBus = new QueryBus(resolver);
            //Act
            var result = await queryBus.SendAsync(query, CancellationToken.None);

            //Assert
            Assert.That(result, Is.EqualTo(query.ReturnValue));
        }
            public void ShouldPropagateExceptionFromQueryHandler()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomethingWithException, string>)queryHandler);
                var dispatcher = new LoggingQueryDispatcher(new QueryDispatcher(registration), _outputHelper);

                Func <Task> action = () =>
                {
                    return(dispatcher.DispatchAsync <QuerySomethingWithException, string>(
                               new QuerySomethingWithException("This will cause an exception.")));
                };

                action.Should().Throw <TestQueryHandlerException>();
            }
            public async Task ShouldInvokeRegisteredQueryHandlerWithCancellationToken()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomethingWithDelay, string>)queryHandler);

                var cts = new CancellationTokenSource();

                var dispatcher = new QueryDispatcher(registration);

                const string data = nameof(ShouldInvokeRegisteredQueryHandlerWithCancellationToken);

                var result = await dispatcher.DispatchAsync <QuerySomethingWithDelay, string>(new QuerySomethingWithDelay(data, 500), cts.Token);

                result.Should().Be(data);
            }
            public void ShouldInvokeRegisteredQueryHandlerInContainer()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var container    = new Container();

                container.Register <IQueryHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryHandlerResolver(containerAdapter); // Sync handler resolver

                const string data = nameof(ShouldInvokeRegisteredQueryHandlerInContainer);

                var dispatcher = new QueryDispatcher(resolver);
                var result     = dispatcher.Dispatch <QuerySomething, string>(new QuerySomething(data));

                result.Should().Be(data);
            }
        public void AuditDecorator_Succeeds()
        {
            var queryHandler = new TestQueryHandler();
            var query        = new TestQuery("Value");
            var decorator    = new AuditDecorator <TestQuery, string>(_context, _serializer)
            {
                Handler = queryHandler
            };

            decorator.Execute(query);

            _context.QueryExecutions.Should().HaveCount(1);
            _context.QueryExecutions.First().Date.Should().BeCloseTo(DateTime.UtcNow, 1000);
            _context.QueryExecutions.First().QueryType.Should().Be("AzurePlayground.QueryHandlers.Tests.Decorators.AuditDecoratorTests+TestQuery");
            _context.QueryExecutions.First().QueryData.Should().Be(_serializer.SerializeToJson(query));
            _context.CallsToSaveChanges.Should().Be(1);
        }
예제 #22
0
            public async Task ShouldRegisterAllQueryHandlers()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomething, string>)queryHandler);

                QueryHandlerDelegate <string> queryHandlerDelegate = registration.ResolveQueryHandler <QuerySomething, string>();

                var query = new QuerySomething(nameof(ShouldRegisterAllQueryHandlers));

                var result1 = await queryHandler.HandleAsync(query);

                var result2 = await queryHandlerDelegate.Invoke(query);

                result1.Should().Be(result2);
            }
예제 #23
0
            public async Task Should_Invoke_Registered_Query_Handler_With_Cancellation_Token()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryAsyncHandler <QuerySomethingWithDelay, string>)queryHandler);

                var cts = new CancellationTokenSource();

                var dispatcher = new QueryDispatcher(registration);

                const string data = nameof(Should_Invoke_Registered_Query_Handler_With_Cancellation_Token);

                var result = await dispatcher.DispatchAsync <QuerySomethingWithDelay, string>(new QuerySomethingWithDelay(data, 500), cts.Token);

                Assert.Equal(data, result);
            }
예제 #24
0
            public void Should_Invoke_Registered_Query_Handler_In_Container()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var container    = new Container();

                container.Register <IQueryHandler <QuerySomething, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryHandlerResolver(containerAdapter); // Sync handler resolver

                const string data = nameof(Should_Invoke_Registered_Query_Handler_In_Container);

                var dispatcher = new QueryDispatcher(resolver);
                var result     = dispatcher.Dispatch <QuerySomething, string>(new QuerySomething(data));

                Assert.Equal(data, result);
            }
            public async Task ShouldInvokeRegisteredQueryHandlerInContainerWithCancellationToken()
            {
                var queryHandler = new TestQueryHandler(_outputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomethingWithDelay, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter);
                var dispatcher       = new QueryDispatcher(resolver);

                var          cts  = new CancellationTokenSource();
                const string data = nameof(ShouldInvokeRegisteredAttributeQueryHandlerWithCancellationToken);

                var result = await dispatcher.DispatchAsync <QuerySomethingWithDelay, string>(new QuerySomethingWithDelay(data, 500), cts.Token);

                result.Should().Be(data);
            }
예제 #26
0
        public async Task ExecutesQueries()
        {
            // Arrange
            var id      = Guid.NewGuid();
            var handler = new TestQueryHandler();

            _handlerRegistry.Register <TestQueryA, TestQueryA.Response, TestQueryHandler>();
            _handlerFactory.Setup(x => x.Create <dynamic>(typeof(TestQueryHandler))).Returns(handler);

            // Act
            var response = await _queryProcessor.ExecuteAsync(new TestQueryA(id));

            // Assert
            response.ShouldNotBeNull();
            response.Id.ShouldBe(id);
            handler.Context.ShouldNotBeNull();
            handler.Context.Bag.ShouldContainKeyAndValue("id", id);
        }
예제 #27
0
        public void ExecutesQueries()
        {
            // Arrange
            var id      = Guid.NewGuid();
            var handler = new TestQueryHandler();

            _handlerRegistry.Register <TestQueryA, Guid, TestQueryHandler>();
            _handlerFactory.Setup(x => x.Create(typeof(TestQueryHandler))).Returns(handler);

            // Act
            var result = _queryProcessor.Execute(new TestQueryA(id));

            // Assert
            result.ShouldBe(id);
            handler.Context.ShouldNotBeNull();
            handler.Context.Bag.ShouldContainKeyAndValue("id", id);
            _handlerFactory.Verify(x => x.Release(handler), Times.Once);
        }
예제 #28
0
            public async Task Should_Invoke_Registered_Query_Handler_In_Container_With_Cancellation_Token()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);
                var container    = new Container();

                container.Register <IQueryAsyncHandler <QuerySomethingWithDelay, string> >(() => queryHandler, Lifestyle.Singleton);

                var containerAdapter = new SimpleInjectorContainerAdapter(container);
                var resolver         = new ContainerQueryAsyncHandlerResolver(containerAdapter);
                var dispatcher       = new QueryDispatcher(resolver);

                var          cts  = new CancellationTokenSource();
                const string data = nameof(Should_Invoke_Registered_Attribute_Query_Handler_With_Cancellation_Token);

                var result = await dispatcher.DispatchAsync <QuerySomethingWithDelay, string>(new QuerySomethingWithDelay(data, 500), cts.Token);

                Assert.Equal(data, result);
            }
        public async Task Given_TestQuery_When_SendAsync_Then_ResultIsReturned()
        {
            //Arrange
            var services = new ServiceCollection();
            var query    = new TestQuery
            {
                ReturnValue = "ReturnValue"
            };
            var queryHandler = new TestQueryHandler();

            services.AddScoped <IQueryHandler <TestQuery, string> >(provider => queryHandler);
            var serviceProvider = services.BuildServiceProvider();
            var queryBus        = new QueryBus(serviceProvider.GetService);
            //Act
            var result = await queryBus.SendAsync(query, CancellationToken.None);

            //Assert
            Assert.That(result, Is.EqualTo(query.ReturnValue));
        }
예제 #30
0
            public async Task ShouldInvokeTheActualRegisteredQueryHandler()
            {
                var queryHandler = new TestQueryHandler(_testOutputHelper);

                var registration = new QueryHandlerRegistration();

                registration.Register(() => (IQueryHandler <QuerySomething, string>)queryHandler);

                QueryHandlerDelegate <string> queryHandlerDelegate = registration.ResolveQueryHandler <QuerySomething, string>();

                queryHandlerDelegate.Should().NotBeNull();

                const string data = nameof(ShouldInvokeTheActualRegisteredQueryHandler);

                // Invoke.
                await queryHandlerDelegate.Invoke(new QuerySomething(data));

                queryHandler.HandledQueries.Should().HaveCount(1);
                queryHandler.HasHandledQuery <QuerySomething>().Should().BeTrue();
            }