public void when_publishing_message_without_context_it_should_fail()
        {
            var publisher = new VentureMessagePublisher(new FakeMessageRouter());
            // ReSharper disable once AssignNullToNotNullAttribute - it's a test against null.
            Func <Task> sut = () => publisher.Publish(new object(), context: null);

            sut.Should().Throw <ArgumentNullException>().Where(exception => exception.ParamName.Equals("context"), "context is required");
        }
        public void when_publishing_null_as_message_it_should_fail()
        {
            var         publisher = new VentureMessagePublisher(new FakeMessageRouter());
            Func <Task> sut       = () => publisher.Publish <object>(
                // ReSharper disable once AssignNullToNotNullAttribute - it's a test against null.
                message: null,
                new VentureOutgoingMessageHandlingContext(
                    new object(),
                    DateTimeOffset.UtcNow,
                    _stringCreator.Get(length: 10),
                    _stringCreator.Get(length: 10),
                    _stringCreator.Get(length: 10)));

            sut.Should().Throw <ArgumentNullException>().Where(exception => exception.ParamName.Equals("message"), "message is required");
        }
        public async Task when_message_id_is_not_specified_it_should_generate_it()
        {
            var messageRouter = new FakeMessageRouter();
            var sut           = new VentureMessagePublisher(messageRouter);
            var message       = new object();
            var correlationId = _stringCreator.Get(length: 10);
            var causationId   = _stringCreator.Get(length: 10);
            var messageId     = _stringCreator.Get(length: 10);

            await sut.Publish(
                message,
                new VentureOutgoingMessageHandlingContext(
                    message,
                    DateTimeOffset.UtcNow,
                    correlationId,
                    causationId,
                    messageId));

            messageRouter.Message.Should().BeSameAs(message, "it should pass message without changes");
            messageRouter.CorrelationId.Should().BeSameAs(correlationId, "it should pass correlation ID without changes");
            messageRouter.CausationId.Should().BeSameAs(causationId, "it should pass causation ID without changes");
            messageRouter.MessageId.Should().NotBeNullOrWhiteSpace("message ID should be generated");
        }
        public async Task when_publishing_message_it_should_route_it_using_message_router_with_parameters_unchanged()
        {
            var messageRouter = new FakeMessageRouter();
            var sut           = new VentureMessagePublisher(messageRouter);
            var message       = new object();
            var correlationId = _stringCreator.Get(length: 10);
            var causationId   = _stringCreator.Get(length: 10);
            var messageId     = _stringCreator.Get(length: 10);

            await sut.Publish(
                message,
                new VentureOutgoingMessageHandlingContext(
                    message,
                    DateTimeOffset.UtcNow,
                    correlationId,
                    causationId,
                    messageId));

            messageRouter.Message.Should().BeSameAs(message, "it should pass message without changes");
            messageRouter.CorrelationId.Should().BeSameAs(correlationId, "it should pass correlation ID without changes");
            messageRouter.CausationId.Should().BeSameAs(causationId, "it should pass causation ID without changes");
            messageRouter.MessageId.Should().BeSameAs(messageId, "it should pass message ID without changes");
        }