public void CreateTranscientHandler_InstancianteEachTime()
        {
            // Arrange
            var config = new ProcessorConfiguration();

            config.DefaultHandlerLifetime = HandlerLifetime.Transient;
            ICommandHandlerActivator activator   = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request1    = new CommandHandlerRequest(config, this.command.Object);
            CommandHandlerRequest    request2    = new CommandHandlerRequest(config, this.command.Object);
            CommandHandlerDescriptor descriptor  = new CommandHandlerDescriptor(config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            // Act
            var handler1 = activator.Create(request1, descriptor);
            var handler2 = activator.Create(request1, descriptor);
            var handler3 = activator.Create(request2, descriptor);
            var handler4 = activator.Create(request1, descriptor2);

            // Assert
            Assert.NotNull(handler1);
            Assert.NotNull(handler2);
            Assert.NotNull(handler3);
            Assert.NotNull(handler4);
            Assert.NotSame(handler1, handler2);
            Assert.NotSame(handler1, handler3);
            Assert.NotSame(handler1, handler4);
            Assert.NotSame(handler2, handler3);
            Assert.NotSame(handler2, handler4);
            Assert.NotSame(handler3, handler4);
        }
        public void WhenCreatingHandlerThrowExceptionThenRethowsInvalidOperationException()
        {
            // Arrange
            ICommandHandlerActivator activator  = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request    = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            this.dependencyResolver
            .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
            .Throws <CommandHandlerNotFoundException>();
            bool exceptionRaised = false;

            // Act
            try
            {
                activator.Create(request, descriptor);
            }
            catch (InvalidOperationException)
            {
                exceptionRaised = true;
            }

            // Assert
            Assert.True(exceptionRaised);
        }
        public void WhenCreatingHandlerFromTwoDescriptorsAndDependencyResolverThenGetActivatorDepencyResolver()
        {
            // Assign
            ICommandHandlerActivator activator   = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request     = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor1 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            int[] i = { 0 };
            this.dependencyResolver
            .When(() => i[0] < 1)
            .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
            .Returns(null)
            .Callback(() => i[0]++);
            this.dependencyResolver
            .When(() => i[0] >= 1)
            .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
            .Returns(new SimpleCommandHandler());

            // Act
            activator.Create(request, descriptor1);
            ICommandHandler commandHandler = activator.Create(request, descriptor2);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(0, descriptor2.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Exactly(2));
        }
        public void WhenCreatingHandlerWithoutParametersThenThrowsArgumentNullException()
        {
            // Assign
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            // Act
            // Assert
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(null, null), "request");
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(null, descriptor), "request");
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(request, null), "descriptor");
        }
        public void WhenCreatingHandlerWithoutParametersThenThrowsArgumentNullException()
        {
            // Assign
            ICommandHandlerActivator activator  = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request    = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            // Act
            // Assert
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(null, null), "request");
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(null, descriptor), "request");
            ExceptionAssert.ThrowsArgumentNull(() => activator.Create(request, null), "descriptor");
        }
        public void WhenCreatingHandlerFromActivatorThenReturnsHandler()
        {
            // Assign
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            this.dependencyResolver.Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler))).Returns(null);

            // Act
            ICommandHandler commandHandler = activator.Create(request, descriptor);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(0, descriptor.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Once());
        }
        public void WhenCreatingHandlerFromActivatorThenReturnsHandler()
        {
            // Assign
            ICommandHandlerActivator activator  = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request    = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            this.dependencyResolver.Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler))).Returns(null);

            // Act
            ICommandHandler commandHandler = activator.Create(request, descriptor);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(0, descriptor.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Once());
        }
        public void WhenCreatingHandlerFromTwoDescriptorsThenFastCacheIsNotUsed()
        {
            // Assign
            ICommandHandlerActivator activator   = new DefaultCommandHandlerActivator();
            CommandHandlerRequest    request1    = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerRequest    request2    = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor1 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            this.dependencyResolver.Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler))).Returns(null);

            // Act
            activator.Create(request1, descriptor1);
            ICommandHandler commandHandler = activator.Create(request2, descriptor2);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(1, descriptor2.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Exactly(2));
        }
        public void CreateTranscientHandler_InstancianteEachTime()
        {
            // Arrange
            var config = new ProcessorConfiguration();
            config.DefaultHandlerLifetime = HandlerLifetime.Transient;
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request1 = new CommandHandlerRequest(config, this.command.Object);
            CommandHandlerRequest request2 = new CommandHandlerRequest(config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            // Act
            var handler1 = activator.Create(request1, descriptor);
            var handler2 = activator.Create(request1, descriptor);
            var handler3 = activator.Create(request2, descriptor);
            var handler4 = activator.Create(request1, descriptor2);

            // Assert
            Assert.NotNull(handler1);
            Assert.NotNull(handler2);
            Assert.NotNull(handler3);
            Assert.NotNull(handler4);
            Assert.NotSame(handler1, handler2);
            Assert.NotSame(handler1, handler3);
            Assert.NotSame(handler1, handler4);
            Assert.NotSame(handler2, handler3);
            Assert.NotSame(handler2, handler4);
            Assert.NotSame(handler3, handler4);
        }
        public void WhenCreatingHandlerThrowExceptionThenRethowsInvalidOperationException()
        {
            // Arrange
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));

            this.dependencyResolver
                .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
                .Throws<CommandHandlerNotFoundException>();
            bool exceptionRaised = false;

            // Act
            try
            {
                activator.Create(request, descriptor);
            }
            catch (InvalidOperationException)
            {
                exceptionRaised = true;
            }

            // Assert
            Assert.True(exceptionRaised);
        }
        public void WhenCreatingHandlerFromTwoDescriptorsAndDependencyResolverThenGetActivatorDepencyResolver()
        {
            // Assign
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor1 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            int[] i = { 0 };
            this.dependencyResolver
                .When(() => i[0] < 1)
                .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
                .Returns(null)
                .Callback(() => i[0]++);
            this.dependencyResolver
                .When(() => i[0] >= 1)
                .Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler)))
                .Returns(new SimpleCommandHandler());

            // Act
            activator.Create(request, descriptor1);
            ICommandHandler commandHandler = activator.Create(request, descriptor2);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(0, descriptor2.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Exactly(2));
        }
        public void WhenCreatingHandlerFromTwoDescriptorsThenGetActivatorFromProperties()
        {
            // Assign
            ICommandHandlerActivator activator = new DefaultCommandHandlerActivator();
            CommandHandlerRequest request1 = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerRequest request2 = new CommandHandlerRequest(this.config, this.command.Object);
            CommandHandlerDescriptor descriptor1 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            CommandHandlerDescriptor descriptor2 = new CommandHandlerDescriptor(this.config, typeof(SimpleCommand), typeof(SimpleCommandHandler));
            this.dependencyResolver.Setup(resolver => resolver.GetService(typeof(SimpleCommandHandler))).Returns(null);

            // Act
            activator.Create(request1, descriptor1);
            activator.Create(request2, descriptor2);
            ICommandHandler commandHandler = activator.Create(request2, descriptor2);

            // Assert
            Assert.NotNull(commandHandler);
            Assert.IsType(typeof(SimpleCommandHandler), commandHandler);
            Assert.Equal(1, descriptor2.Properties.Count);
            this.dependencyResolver.Verify(resolver => resolver.GetService(typeof(SimpleCommandHandler)), Times.Exactly(2));
        }