public async Task CreateLinkAjaPayment_ReturnsSuccess()
        {
            var danaExternId = "Test:EWallet-LinkAja:1234:ExternId";

            var connectionMock = new Mock<IXenditHttpConnection>();

            connectionMock
                .Setup(c => c.SendRequestBodyAsync<XenditBaseRequest, XenditEWalletCreatePaymentResponse>(
                    It.IsAny<Method>(),
                    It.IsAny<string>(),
                    It.IsAny<XenditBaseRequest>()))
                .ReturnsAsync(new XenditEWalletCreatePaymentResponse());

            var eWalletClient = new XenditEWalletClient(connectionMock.Object);

            var linkAja = new XenditEWalletCreateLinkAjaPaymentRequest
            {
                ExternalId = danaExternId,
            };

            var eWalletPayment = await eWalletClient.CreateLinkAjaPaymentAsync(linkAja);

            connectionMock.Verify(c => c.SendRequestBodyAsync<XenditEWalletCreateLinkAjaPaymentRequest, XenditEWalletCreatePaymentResponse>(
                Method.POST,
                "/ewallets",
                linkAja), Times.Once);
        }
        public async Task GetPaymentStatus_ReturnsSuccess()
        {
            var paymentExternId = "Test:EWallet:1234:ExternId";
            var eWalletType = XenditEWalletType.OVO;

            var connectionMock = new Mock<IXenditHttpConnection>();

            connectionMock
                .Setup(c => c.SendRequestAsync<XenditEWalletCreatePaymentResponse>(
                    It.IsAny<Method>(),
                    It.IsAny<string>()))
                .ReturnsAsync(new XenditEWalletCreatePaymentResponse());

            var eWalletClient = new XenditEWalletClient(connectionMock.Object);

            var paymentStatus = await eWalletClient.GetPaymentStatusAsync(paymentExternId, eWalletType);

            connectionMock.Verify(c => c.SendRequestAsync<XenditEWalletCreatePaymentResponse>(
                Method.GET,
                $"/ewallets?external_id={paymentExternId}&ewallet_type={eWalletType}"), Times.Once);
        }
        public async Task CreateOvoPayment_ReturnsSuccess(string apiVersion)
        {
            var ovoExternId = "Test:EWallet-OVO:1234:ExternId";

            var connectionMock = new Mock<IXenditHttpConnection>();

            connectionMock
                .Setup(c => c.SendRequestBodyAsync<XenditBaseRequest, XenditEWalletCreatePaymentResponse>(
                    It.IsAny<Method>(),
                    It.IsAny<string>(),
                    It.IsAny<XenditBaseRequest>()))
                .ReturnsAsync(new XenditEWalletCreatePaymentResponse());

            var eWalletClient = new XenditEWalletClient(connectionMock.Object);

            // Difference semantic between null and empty string for header.
            var expectedRequestHeader = new Dictionary<string, string>();

            if (apiVersion != null)
            {
                expectedRequestHeader.Add("X-API-VERSION", apiVersion);
            }

            var ovo = new XenditEWalletCreateOvoPaymentRequest
            {
                ApiVersion = apiVersion,
                ExternalId = ovoExternId,
            };

            var eWalletPayment = await eWalletClient.CreateOvoPaymentAsync(ovo);

            connectionMock.Verify(c => c.SendRequestBodyAsync<XenditEWalletCreateOvoPaymentRequest, XenditEWalletCreatePaymentResponse>(
                Method.POST,
                "/ewallets",
                expectedRequestHeader,
                ovo), Times.Once);
        }