public async Task FullCheckoutWorkflowWithMerchantCompletesEqualsFalse_Positive() { //** Create the Checkout/Order var checkouts = CreateCheckoutClient(); var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var createCheckoutRequest = GenerateValidCreateCheckoutRequest(orderReferenceId, false); createCheckoutRequest.MerchantCompletes = false; var checkoutResponse = await checkouts.CreateAsync(createCheckoutRequest); // ** get order details. //verify that order is in customer NotPaid status. var orders = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var orderDetailsRequest = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; // ** check order status. get order details before user has been redirected to the checkout URL var orderDetailsBeforeUserChecksOut = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeUserChecksOut.OrderStatus, Enums.OrderStatusEnum.S0010OrderCreated); //***********Existing Customer goes to checkout And completes checkout _sezzleCheckoutAutomationHelper.CompleteCheckoutClientSide(checkoutResponse.CheckoutUrl, base.GetCustomerLoginCredentials(), createCheckoutRequest.CheckoutCompleteUrl); Console.WriteLine($"OrderId = '{orderReferenceId}'"); // verify order status - since we passed "merchantcompletes=false" earlier, the order is completed as soon as the user clicks 'submit'_checkoutLoginPhoneNumber //get order details. order should now be complete, meaning sezzle has captured the funds and we are guaranteed the full amount. var orderDetailsAfterMerchantCompletesCheckout = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(Enums.OrderStatusEnum.S0030FundsCapturedAllDoneBoomshakalakaYippiekiyay, orderDetailsAfterMerchantCompletesCheckout.OrderStatus); }
public async Task CanGetOrderDetailsWithShipping() { // TODO: Ignore and find a way to pipe in a valid order reference id //arrange var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var order = await CreateOrder(orderReferenceId); var orders = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var request = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; //act var orderDetails = await orders.GetDetailsAsync(request); Console.WriteLine(JsonConvert.SerializeObject(orderDetails, Formatting.Indented)); //assert Assert.IsNotNull(orderDetails); Assert.IsNotNull(orderDetails.Customer); //this is all we care about right now is that these details that we passed in are coming back. //note to self, these get "reset" when someone logs into the sezzle and hits this checkout URL Assert.AreEqual(_testCustomerDetails.FirstName, orderDetails.Customer.FirstName); Assert.AreEqual(_testCustomerDetails.LastName, orderDetails.Customer.LastName); Assert.AreEqual(_testCustomerDetails.Email, orderDetails.Customer.Email); Assert.AreEqual(_testCustomerDetails.Phone, orderDetails.Customer.Phone); //also verify that certain fields are set correctly. Assert.NotNull(orderDetails); Assert.AreEqual(Enums.OrderStatusEnum.S0010OrderCreated, orderDetails.OrderStatus); //verify this enum gets deserialized correctly Assert.AreEqual(Enums.CheckoutCurrencyCodeEnum.USD, orderDetails.CurrencyCode); //customer detail does not coming back in either postman nor our library. //todo: shipping address object comes back, but is currently blank. //Assert.IsNotNull(orderDetails.ShippingAddress); //this is still broken. //Assert.IsNotEmpty(orderDetails.ShippingAddress.Name); }
public async Task FullWorkflowWithMerchantCompletesEqualsTrue_AttemptToCompleteCheckoutWithoutCustomerCompleting_Negative() { //** Create the Checkout/Order var checkouts = CreateCheckoutClient(); var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var createCheckoutRequest = GenerateValidCreateCheckoutRequest(orderReferenceId, false); createCheckoutRequest.MerchantCompletes = true; var checkoutResponse = await checkouts.CreateAsync(createCheckoutRequest); // ** get order details. //verify that order is in customer NotPaid status. var orders = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var orderDetailsRequest = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; // ** check order status. get order details before user has been redirected to the checkout URL var orderDetailsBeforeUserChecksOut = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeUserChecksOut.OrderStatus, Enums.OrderStatusEnum.S0010OrderCreated); Func <Task> act = async() => { //merchant completes the checkout/order. (we had used merchantcompletes=true) var completeCheckoutRequest = new CompleteCheckoutRequest() { LocalOrderId = orderReferenceId }; var response = await checkouts.CompleteAsync(completeCheckoutRequest); }; //exception is thrown from sezzle because you cannot complete a checkout that has not been completed by user. act.Should().Throw <SezzleErrorResponseException>(); }
public async Task CanCreateOrder_CustomerCompletes_MerchantCompletes_RefundPartial() { //arrange var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var checkoutEndpoint = new CheckoutEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var createCheckoutRequest = GenerateValidCreateCheckoutRequest(orderReferenceId); createCheckoutRequest.MerchantCompletes = true; //makes it easier to script completion of checkout by a user. createCheckoutRequest.RequiresShippingInfo = false; var completeCheckoutRequest = new CompleteCheckoutRequest() { LocalOrderId = createCheckoutRequest.OrderReferenceId }; var ordersEndpoint = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var request = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; //create refund request var refundAmount = 123; var partialRefundRequest = new OrderRefundRequest() { Amount = new Price() { AmountInCents = refundAmount, Currency = Enums.CheckoutCurrencyCodeEnum.USD }, IsFullRefund = false, OrderReferenceId = orderReferenceId, RefundId = $"gh_refund_{DateTime.UtcNow.Ticks.ToString()}", RefundReason = "some reason here" }; //act //10 create order var order = await checkoutEndpoint.CreateAsync(createCheckoutRequest); Console.WriteLine(JsonConvert.SerializeObject(order, Formatting.Indented)); //20 get order details var orderDetails = await ordersEndpoint.GetDetailsAsync(request); Console.WriteLine(JsonConvert.SerializeObject(orderDetails, Formatting.Indented)); //30 (user completes checkout - use selenium) complete the checkout //todo: use selenium to complete the checkout through user workflow. //40 merchant completes the checkout. var completedCheckout = await checkoutEndpoint.CompleteAsync(completeCheckoutRequest); //partial refund var refundResponse = await ordersEndpoint.RefundAsync(partialRefundRequest); //test #1, verify order refund is processed and returns data as sent in. Assert.AreEqual(refundAmount, refundResponse.Amount.AmountInCents); Assert.AreEqual(partialRefundRequest.RefundId, refundResponse.RefundId); //get order details again. the order value should have changed by the amount refunded. var orderDetails2 = await ordersEndpoint.GetDetailsAsync(request); //test #2, verify order amount has changed after refund //todo: this ammount does not actually change like I expected it to. Perhaps there is a missing endpoint where we can see what modified the order (refunds). //long expectedOrderAmountAfterRefund = orderDetails.AmountInCents - refundAmount; //Assert.AreEqual(expectedOrderAmountAfterRefund, orderDetails2.AmountInCents); }
public async Task FullWorkflowWithMerchantCompletesEqualsTrue_ThenRefundFullAmount_Positive() { //** Create the Checkout/Order var checkouts = CreateCheckoutClient(); var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var createCheckoutRequest = GenerateValidCreateCheckoutRequest(orderReferenceId, false); createCheckoutRequest.MerchantCompletes = true; var checkoutResponse = await checkouts.CreateAsync(createCheckoutRequest); Console.WriteLine(checkoutResponse.CheckoutUrl); // ** get order details. //verify that order is in customer NotPaid status. var orders = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var orderDetailsRequest = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; // ** check order status. get order details before user has been redirected to the checkout URL var orderDetailsBeforeUserChecksOut = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeUserChecksOut.OrderStatus, Enums.OrderStatusEnum.S0010OrderCreated); //***********Existing Customer goes to checkout And completes checkout _sezzleCheckoutAutomationHelper.CompleteCheckoutClientSide(checkoutResponse.CheckoutUrl, base.GetCustomerLoginCredentials(), createCheckoutRequest.CheckoutCompleteUrl); // verify order status is now in the checked out status var orderDetailsBeforeMerchantCompletesCheckout = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeMerchantCompletesCheckout.OrderStatus, Enums.OrderStatusEnum.S0020UserHasCheckedOut); //merchant completes the checkout/order. (we had used merchantcompletes=true) var completeCheckoutRequest = new CompleteCheckoutRequest() { LocalOrderId = orderReferenceId }; await checkouts.CompleteAsync(completeCheckoutRequest); //get order details. order should now be complete, meaning sezzle has captured the funds and we are guaranteed the full amount. var orderDetailsAfterMerchantCompletesCheckout = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(Enums.OrderStatusEnum.S0030FundsCapturedAllDoneBoomshakalakaYippiekiyay, orderDetailsAfterMerchantCompletesCheckout.OrderStatus); //**********************up to now, that is just a standard order. //now we refund var refundAmount = createCheckoutRequest.AmountInCents; var refundRequest = new OrderRefundRequest() { Amount = new Price() { AmountInCents = refundAmount, Currency = Enums.CheckoutCurrencyCodeEnum.USD }, OrderReferenceId = orderReferenceId, IsFullRefund = false, RefundId = Guid.NewGuid().ToString(), RefundReason = "unit test reason" }; var refundResponse = await orders.RefundAsync(refundRequest); //verifies amount was refunded Assert.AreEqual(refundAmount, refundResponse.Amount.AmountInCents); //get order status and verify that it is equal to the full original amount. there are no endpoints that get the history of the refunds at this time. var orderStatusAfterPartialRefund = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(createCheckoutRequest.AmountInCents, orderStatusAfterPartialRefund.AmountInCents); }
public async Task FullWorkflowWithMerchantCompletesEqualsTrue_ThenRefundInvalidAmount_Negative() { //** Create the Checkout/Order var checkouts = CreateCheckoutClient(); var orderReferenceId = DateTime.UtcNow.Ticks.ToString(); var createCheckoutRequest = GenerateValidCreateCheckoutRequest(orderReferenceId, false); createCheckoutRequest.MerchantCompletes = true; var checkoutResponse = await checkouts.CreateAsync(createCheckoutRequest); Console.WriteLine(checkoutResponse.CheckoutUrl); // ** get order details. //verify that order is in customer NotPaid status. var orders = new OrdersEndpoint(_baseConfiguration, _authenticationClient, GetDefaultSezzleHttpClient()); var orderDetailsRequest = new OrderDetailsRequest() { IncludeShippingInfo = true, OrderReferenceId = orderReferenceId }; // ** check order status. get order details before user has been redirected to the checkout URL var orderDetailsBeforeUserChecksOut = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeUserChecksOut.OrderStatus, Enums.OrderStatusEnum.S0010OrderCreated); //***********Existing Customer goes to checkout And completes checkout _sezzleCheckoutAutomationHelper.CompleteCheckoutClientSide(checkoutResponse.CheckoutUrl, base.GetCustomerLoginCredentials(), createCheckoutRequest.CheckoutCompleteUrl); // verify order status is now in the checked out status var orderDetailsBeforeMerchantCompletesCheckout = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(orderDetailsBeforeMerchantCompletesCheckout.OrderStatus, Enums.OrderStatusEnum.S0020UserHasCheckedOut); //merchant completes the checkout/order. (we had used merchantcompletes=true) var completeCheckoutRequest = new CompleteCheckoutRequest() { LocalOrderId = orderReferenceId }; await checkouts.CompleteAsync(completeCheckoutRequest); //get order details. order should now be complete, meaning sezzle has captured the funds and we are guaranteed the full amount. var orderDetailsAfterMerchantCompletesCheckout = await orders.GetDetailsAsync(orderDetailsRequest); Assert.AreEqual(Enums.OrderStatusEnum.S0030FundsCapturedAllDoneBoomshakalakaYippiekiyay, orderDetailsAfterMerchantCompletesCheckout.OrderStatus); //**********************up to now, that is just a standard order. // try to refund an amount greater than the initial checkout amount. Verify our framework throws an exception. Func <Task> act = async() => { //set the refund amount to 1 cent over the entire order. var refundAmount = createCheckoutRequest.AmountInCents + 1; var refundRequest = new OrderRefundRequest() { Amount = new Price() { AmountInCents = refundAmount, Currency = Enums.CheckoutCurrencyCodeEnum.USD }, OrderReferenceId = orderReferenceId, IsFullRefund = false, RefundId = Guid.NewGuid().ToString(), RefundReason = "unit test reason" }; var refundResponse = await orders.RefundAsync(refundRequest); }; //exception is thrown from sezzle because you cannot complete a checkout that has not been completed by user. act.Should().Throw <SezzleErrorResponseException>(); }