public async Task Complete_Removes_Staging_Queue_If_Empty()
        {
            // Arrange
            var nameProvider = new DelayedDeliveryTableNameProvider();

            await CreateTimeoutTable(nameProvider.GetDelayedDeliveryTableName(endpointName));

            var timeoutTarget = new ASQTarget(connectionString, nameProvider);

            await using var migrator = await timeoutTarget.PrepareTargetEndpointBatchMigrator(endpointName);

            await migrator.StageBatch(new List <TimeoutData>
            {
                new TimeoutData
                {
                    Id      = "SomeID",
                    Headers = new Dictionary <string, string>
                    {
                        { "NServiceBus.MessageId", "SomeMessageId" }
                    },
                    Destination = "SomeDestination",
                    State       = new byte[2],
                    Time        = new DateTime(2021, 12, 12, 12, 12, 12, DateTimeKind.Utc)
                },
                new TimeoutData
                {
                    Id      = "SomeOtherId",
                    Headers = new Dictionary <string, string>
                    {
                        { "NServiceBus.MessageId", "SomeOtherMessageId" }
                    },
                    Destination = "SomeOtherDestination",
                    State       = new byte[2],
                    Time        = new DateTime(2021, 12, 12, 12, 13, 13, DateTimeKind.Utc)
                },
            }, 1);

            await migrator.CompleteBatch(1);

            // Act
            await timeoutTarget.Complete(endpointName);

            // Assert
            var stagingTableExists = await DoesTableExist(nameProvider.GetStagingTableName(endpointName));

            Assert.IsFalse(stagingTableExists);
        }
        public async Task Complete_Throws_If_Messages_Are_Still_Staged()
        {
            // Arrange
            var nameProvider = new DelayedDeliveryTableNameProvider();

            await CreateTimeoutTable(nameProvider.GetDelayedDeliveryTableName(endpointName));

            var timeoutTarget = new ASQTarget(connectionString, nameProvider);

            await using var migrator = await timeoutTarget.PrepareTargetEndpointBatchMigrator(endpointName);

            var numberStaged = await migrator.StageBatch(new List <TimeoutData>
            {
                new TimeoutData
                {
                    Id      = "SomeID",
                    Headers = new Dictionary <string, string>
                    {
                        { "NServiceBus.MessageId", "SomeMessageId" }
                    },
                    Destination = "SomeDestination",
                    State       = new byte[2],
                    Time        = new DateTime(2021, 12, 12, 12, 12, 12, DateTimeKind.Utc)
                },
                new TimeoutData
                {
                    Id      = "SomeOtherId",
                    Headers = new Dictionary <string, string>
                    {
                        { "NServiceBus.MessageId", "SomeOtherMessageId" }
                    },
                    Destination = "SomeOtherDestination",
                    State       = new byte[2],
                    Time        = new DateTime(2021, 12, 12, 12, 13, 13, DateTimeKind.Utc)
                },
            }, 1);

            // Assert
            Assert.ThrowsAsync <Exception>(async() =>
            {
                // Act
                await timeoutTarget.Complete(endpointName);
            });
        }