public async Task SendAsync_UsesTransaction()
        {
            // Arrange
            await InitializeDatabaseAsync();
            var provider = new SqlServerServiceBroker(connection);
            var handle = await BeginDialogAsync();

            // Act
            using (var transaction = await provider.BeginTransactionAsync())
            {
                await provider.SendAsync(new SendArguments(handle));
                transaction.Rollback();
            }

            var received = await connection.QueryAsync("SELECT * FROM [TargetQueue] WITH (NOLOCK)");

            // Assert
            Assert.Empty(received);
        }
        public async Task SendAsync_RespectsMessageBody()
        {
            // Arrange
            await InitializeDatabaseAsync();
            var provider = new SqlServerServiceBroker(connection);
            var handle = await BeginDialogAsync();
            var body = "Quoth the Sandler, Barrymore";

            // Act
            await provider.SendAsync(new SendArguments(handle)
            {
                MessageBody = body,
            });
            var received = await connection.QueryAsync("SELECT CAST(message_body AS nvarchar(max)) AS message_body FROM [TargetQueue] WITH (NOLOCK)");

            // Assert
            Assert.Equal(body, received.Single().message_body);
        }
        public async Task SendAsync_RespectsMultipleConversationHandles()
        {
            // Arrange
            await InitializeDatabaseAsync();
            var provider = new SqlServerServiceBroker(connection);
            var handle1 = await BeginDialogAsync();
            var handle2 = await BeginDialogAsync();

            // Act
            await provider.SendAsync(new SendArguments(handle1, handle2));
            var received = await connection.QueryAsync("SELECT * FROM [TargetQueue] WITH (NOLOCK)");

            // Assert
            Assert.Equal(2, received.Count());
        }
        public async Task SendAsync_RespectsMessageType()
        {
            // Arrange
            await InitializeDatabaseAsync();
            var provider = new SqlServerServiceBroker(connection);
            var handle = await provider.BeginDialogAsync(
                new BeginDialogArguments("InitiatorService", "TargetService")
                {
                    ContractName = "TestContract",
                });

            // Act
            await provider.SendAsync(new SendArguments(handle)
            {
                MessageTypeName = "TestMessageType",
            });
            var received = await connection.QueryAsync("SELECT * FROM [TargetQueue] WITH (NOLOCK)");

            // Assert
            Assert.Equal("TestMessageType", received.Single().message_type_name);
        }
        public async Task SendAsync_ArgumentsCannotBeNull()
        {
            // Arrange
            var provider = new SqlServerServiceBroker(connection);

            // Act
            Func<Task> call = async () => await provider.SendAsync(null);

            // Assert
            await Assert.ThrowsAsync<ArgumentNullException>("arguments", call);
        }