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); }
/// <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); }
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); }
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 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); }
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>(); }
/// <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)); }
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; }
public BaseResponse UpdateOrderDetail(OrderDetailsRequest request) { return(service.UpdateOrderDetail(request)); }
public BaseResponse CreateOrderDetail(OrderDetailsRequest request) { return(service.InsertOrderDetail(request)); }
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>(); }