public void ReThrows_Exception_Given_Unhandled_Exception_Is_Thrown_When_Sending_OutboundMessage()
        {
            _mockSender.Setup(s => s.SendAsync(It.IsAny <Message>())).ThrowsAsync(new DivideByZeroException());

            Func <Task> sendAction = async() => await _outboundGateway.SendAsync(OutboundMessage <MyEvent> .FromEntity(MyEvent.Default)).ConfigureAwait(false);

            sendAction.Should().Throw <DivideByZeroException>();
        }
        public async Task SendAsync <TMessage>(
            TMessage messageEntity,
            IDictionary <string, object> userProperties = null) where TMessage : class
        {
            var message = GenerateMessage(OutboundMessage <TMessage> .FromEntity(messageEntity, userProperties));
            var sw      = Stopwatch.StartNew();
            await _sender.SendAsync(message).ConfigureAwait(false);

            TrackDependency(sw, nameof(SendAsync), userProperties);
            _logger.LogDebug(LogEventIds.OutboundGatewaySentSingle, $"Sent single message of type {typeof(TMessage).Name}");
        }
        public async Task SendMultipleAsync <TMessage>(
            IEnumerable <TMessage> messageEntities,
            IDictionary <string, object> userProperties = null) where TMessage : class
        {
            var messageList = messageEntities
                              .Select(m => GenerateMessage(OutboundMessage <TMessage> .FromEntity(m, userProperties)))
                              .ToList();
            var sw = Stopwatch.StartNew();
            await _sender.SendAsync(messageList).ConfigureAwait(false);

            TrackDependency(sw, nameof(SendMultipleAsync), userProperties);
            _logger.LogDebug(LogEventIds.OutboundGatewaySentMultiple, $"Sent {messageList.Count} messages of type {typeof(TMessage).Name}");
        }
        public async Task Include_Custom_Properties_Given_Valid_Entity_When_Sending_OutboundMessage(string key, string value)
        {
            var messageProps = new Dictionary <string, object>
            {
                { key, value },
                { "Extra", "Prop" }
            };

            await _outboundGateway.SendAsync(OutboundMessage <MyEvent> .FromEntity(MyEvent.Default, messageProps)).ConfigureAwait(false);

            _mockSender.Verify(s => s.SendAsync(It.Is <Message>(
                                                    m => m.UserProperties.ContainsKey(key) && (string)m.UserProperties[key] == value &&
                                                    m.UserProperties.ContainsKey("Extra") && (string)m.UserProperties["Extra"] == "Prop")),
                               Times.Once);
        }
        public async Task Measure_Dependency_Duration_Given_Successful_Sending_When_Sending_OutboundMessage()
        {
            await _outboundGateway.SendAsync(OutboundMessage <MyEvent> .FromEntity(MyEvent.Default)).ConfigureAwait(false);

            _mockInstrumentor.Verify(
                s => s.TrackDependency(
                    LogEventIds.OutboundGatewayMeasuredElapsedSingle,
                    It.IsAny <long>(),
                    It.IsAny <DateTimeOffset>(),
                    MessageSendingGateway <MyEndpointConfig> .AzureServiceBusDependencyType,
                    _options.EntityPath,
                    "SendAsync",
                    null,
                    true,
                    It.IsAny <IDictionary <string, object> >()),
                Times.Once);
        }
        public async Task Attempt_To_Serialise_Message_From_Expected_Type_Given_Valid_Entity_When_Sending_OutboundMessage()
        {
            await _outboundGateway.SendAsync(OutboundMessage <MyEvent> .FromEntity(MyEvent.Default)).ConfigureAwait(false);

            _mockSerialiser.Verify(s => s.Serialise(MyEvent.Default), Times.Once);
        }
        public async Task Send_Serialised_Message_Given_Valid_Message_When_Sending_OutboundMessage()
        {
            await _outboundGateway.SendAsync(OutboundMessage <MyEvent> .FromEntity(MyEvent.Default)).ConfigureAwait(false);

            _mockSender.Verify(s => s.SendAsync(It.Is <Message>(m => m.Body == SerialisedBytes)), Times.Once);
        }