public static async Task PublishUserStripePaymentIntentPaymentFailedIntegrationEventAsync(
            this IServiceBusPublisher publisher,
            UserId userId,
            TransactionId transactionId
            )
        {
            var integrationEvent = new UserStripePaymentIntentPaymentFailedIntegrationEvent
            {
                UserId        = userId,
                TransactionId = transactionId
            };

            await publisher.PublishAsync(integrationEvent);
        }
        public async Task HandleAsync_WhenUserDepositFailedIntegrationEventIsValid_ShouldBeCompletedTask()
        {
            // Arrange
            var userId = new UserId();

            var account = new MoneyAccountDecorator(new Account(userId, new List <Transaction>()));

            var transaction = account.Deposit(Money.OneHundred);

            transaction.MarkAsFailed();

            var mockLogger = new MockLogger <UserStripePaymentIntentPaymentFailedIntegrationEventHandler>();

            TestMock.AccountService.Setup(accountRepository => accountRepository.AccountExistsAsync(userId)).ReturnsAsync(true).Verifiable();

            TestMock.AccountService.Setup(accountRepository => accountRepository.FindAccountAsync(userId)).ReturnsAsync(account).Verifiable();

            TestMock.AccountService
            .Setup(accountService => accountService.MarkAccountTransactionAsFailedAsync(account, transaction.Id, It.IsAny <CancellationToken>()))
            .ReturnsAsync(account.Transactions.First().Cast <Transaction>())
            .Verifiable();

            var handler = new UserStripePaymentIntentPaymentFailedIntegrationEventHandler(
                TestMock.AccountService.Object,
                TestMapper,
                TestMock.ServiceBusPublisher.Object,
                mockLogger.Object);

            var integrationEvent = new UserStripePaymentIntentPaymentFailedIntegrationEvent
            {
                UserId        = userId,
                TransactionId = transaction.Id
            };

            // Act
            await handler.HandleAsync(integrationEvent);

            // Assert
            TestMock.AccountService.Verify(accountRepository => accountRepository.AccountExistsAsync(userId), Times.Once);
            TestMock.AccountService.Verify(accountRepository => accountRepository.FindAccountAsync(userId), Times.Once);

            TestMock.AccountService.Verify(
                accountService => accountService.MarkAccountTransactionAsFailedAsync(account, transaction.Id, It.IsAny <CancellationToken>()),
                Times.Once);

            mockLogger.Verify(Times.Once());
        }