Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Once an order is created, you can retrieve the details of the order using this endpoint.
        /// </summary>
        /// <remarks>
        ///     https://gateway.sezzle.com/v1/orders/{order_reference_id}
        /// </remarks>
        /// <returns></returns>
        public async Task <OrderDetailsResponse> GetDetailsAsync(OrderDetailsRequest orderDetailsRequest)
        {
            var tokenTask = _authenticationEndpoint.CreateTokenAsync();

            //build in the shipping information to true for all requests.  doesn't hurt to have it.
            var requestUrl = UrlStringExtensions.FormatRequestUrl(_baseConfiguration.ApiUrl, $"/orders/{orderDetailsRequest.OrderReferenceId}?include-shipping-info=true");

            var token = await tokenTask;
            //send null into the client; we have manually added the necessary request data to parameters and url.
            var response = await _sezzleHttpClient.GetAsync <OrderDetailsRequestBody, OrderDetailsResponse>(token.Token, requestUrl, null, null);

            return(response);
        }
Ejemplo n.º 3
0
        public async override Task <OrderDetailsReply> GetOrderDetails(OrderDetailsRequest request, Grpc.Core.ServerCallContext context)
        {
            var order = await db.Orders
                        .Where(o => o.OrderId == request.OrderId)
                        .Where(o => o.UserId == request.UserId)
                        .Include(o => o.DeliveryLocation)
                        .Include(o => o.Pizzas).ThenInclude(p => p.Special)
                        .Include(o => o.Pizzas).ThenInclude(p => p.Toppings).ThenInclude(t => t.Topping)
                        .SingleOrDefaultAsync();

            var reply = new OrderDetailsReply
            {
                Order = order?.ToGrpc()
            };

            return(reply);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        public BaseResponse UpdateOrderDetail(OrderDetailsRequest request)
        {
            BaseResponse orderDetailResponse = new BaseResponse();

            try
            {
                var orderID = repository.UpdateOrderDetail(request.orderDetail);
                orderDetailResponse.Success = true;
            }
            catch (Exception ex)
            {
                orderDetailResponse.Success    = false;
                orderDetailResponse.Message    = ex.Message;
                orderDetailResponse.StackTrace = ex.StackTrace;
            }

            return(orderDetailResponse);
        }
Ejemplo n.º 6
0
        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>();
        }
Ejemplo n.º 7
0
        /// <inheritdoc/>
        public async Task <ServiceResult <OrderDto> > GetOrderDetails(OrderDetailsRequest request)
        {
            var customer = await _context.Customers.FindAsync(request.CustomerId);

            if (customer == null)
            {
                var error = $"Пользователь с id = {request.CustomerId} не найден";
                _logger.LogError(error);
                return(new ServiceResult <OrderDto>(isSuccess: false, errors: new string[] { error }));
            }

            var order = customer.Orders.Where(o => o.Id == request.OrderNumber).FirstOrDefault();

            if (order == null)
            {
                var error = $"Заказ с id = {request.OrderNumber} не найден";
                _logger.LogError(error);
                return(new ServiceResult <OrderDto>(isSuccess: false, errors: new string[] { error }));
            }

            return(new ServiceResult <OrderDto>(
                       item: _mapper.Map <OrderDto>(order),
                       isSuccess: true));
        }
Ejemplo n.º 8
0
        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 OrderDetailRequestBuilder(OrderDetailsRequest orderDetailsDto)
 {
     _OrderDetailsDto = orderDetailsDto;
 }
Ejemplo n.º 10
0
 public BaseResponse UpdateOrderDetail(OrderDetailsRequest request)
 {
     return(service.UpdateOrderDetail(request));
 }
Ejemplo n.º 11
0
 public BaseResponse CreateOrderDetail(OrderDetailsRequest request)
 {
     return(service.InsertOrderDetail(request));
 }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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>();
        }