public async Task Should_delete_staging_table_when_empty()
        {
            await using var connection = new SqlConnection(connectionString);
            await connection.OpenAsync();

            var sut = new MsmqTarget(new TestLoggingAdapter(), connectionString, schema);

            await MsmqQueueCreator.CreateStagingQueue(connection, MsmqSqlConstants.TimeoutMigrationStagingTable, schema, connection.Database, preview : false);

            await sut.Complete(ExistingEndpointName);

            var sqlStatement = $"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '{MsmqSqlConstants.TimeoutMigrationStagingTable}' AND TABLE_CATALOG = '{databaseName}'";

            await using var command = new SqlCommand(sqlStatement, connection)
                        {
                            CommandType = CommandType.Text
                        };
            var result = await command.ExecuteScalarAsync().ConfigureAwait(false) as int?;

            Assert.That(result, Is.EqualTo(0));
        }
        public async Task Should_delete_staging_queue_when_completing()
        {
            var endpointName = "FakeEndpoint";
            var sut          = new MsmqTarget(new TestLoggingAdapter(), connectionString, schema);

            await using var endpointTarget = await sut.PrepareTargetEndpointBatchMigrator(endpointName);

            await sut.Complete(endpointName);

            await using var connection = new SqlConnection(connectionString);
            await connection.OpenAsync();

            await using var command = connection.CreateCommand();
            command.CommandText     = string.Format(@"
   SELECT COUNT(*)
   FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_SCHEMA = '{1}' AND TABLE_NAME = '{0}' AND TABLE_CATALOG = '{2}'
", MsmqSqlConstants.TimeoutMigrationStagingTable, schema, databaseName);
            var result = await command.ExecuteScalarAsync() as int?;

            Assert.That(Convert.ToBoolean(result), Is.False);
        }
        public async Task Should_throw_when_staging_table_not_empty()
        {
            await using var connection = new SqlConnection(connectionString);
            await connection.OpenAsync();

            var sut = new MsmqTarget(new TestLoggingAdapter(), connectionString, schema);

            await MsmqQueueCreator.CreateStagingQueue(connection, MsmqSqlConstants.TimeoutMigrationStagingTable, schema, connection.Database, preview : false);

            var sql =
                $"INSERT INTO {schema}.{MsmqSqlConstants.TimeoutMigrationStagingTable} VALUES('id', 'destination', NULL, DATEADD(DAY, 1, GETDATE()), CAST('headers' AS VARBINARY(MAX)), 0)";

            await using var command = new SqlCommand(sql, connection)
                        {
                            CommandType = CommandType.Text
                        };
            await command.ExecuteNonQueryAsync();

            Assert.ThrowsAsync <Exception>(async() =>
            {
                await sut.Complete(ExistingEndpointName);
            });
        }