Exemplo n.º 1
0
        public async Task CanPayPaymentRequestWhenPossible()
        {
            using (var tester = ServerTester.Create())
            {
                await tester.StartAsync();

                var user = tester.NewAccount();
                user.GrantAccess();
                user.RegisterDerivationScheme("BTC");

                var paymentRequestController = user.GetController <PaymentRequestController>();

                Assert.IsType <NotFoundResult>(await paymentRequestController.PayPaymentRequest(Guid.NewGuid().ToString()));


                var request = new UpdatePaymentRequestViewModel()
                {
                    Title       = "original juice",
                    Currency    = "BTC",
                    Amount      = 1,
                    StoreId     = user.StoreId,
                    Description = "description"
                };
                var response = Assert
                               .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
                               .RouteValues.First();

                var invoiceId = Assert
                                .IsType <OkObjectResult>(await paymentRequestController.PayPaymentRequest(response.Value.ToString(), false)).Value
                                .ToString();

                var actionResult = Assert
                                   .IsType <RedirectToActionResult>(await paymentRequestController.PayPaymentRequest(response.Value.ToString()));

                Assert.Equal("Checkout", actionResult.ActionName);
                Assert.Equal("Invoice", actionResult.ControllerName);
                Assert.Contains(actionResult.RouteValues, pair => pair.Key == "Id" && pair.Value.ToString() == invoiceId);

                var invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);
                Assert.Equal(1, invoice.Price);

                request = new UpdatePaymentRequestViewModel()
                {
                    Title       = "original juice with expiry",
                    Currency    = "BTC",
                    Amount      = 1,
                    ExpiryDate  = DateTime.Today.Subtract(TimeSpan.FromDays(2)),
                    StoreId     = user.StoreId,
                    Description = "description"
                };

                response = Assert
                           .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
                           .RouteValues.First();

                Assert
                .IsType <BadRequestObjectResult>(await paymentRequestController.PayPaymentRequest(response.Value.ToString(), false));
            }
        }
Exemplo n.º 2
0
        public async Task CanCreateViewUpdateAndDeletePaymentRequest()
        {
            using (var tester = ServerTester.Create())
            {
                await tester.StartAsync();

                var user = tester.NewAccount();
                user.GrantAccess();
                user.RegisterDerivationScheme("BTC");

                var user2 = tester.NewAccount();
                user2.GrantAccess();

                var paymentRequestController      = user.GetController <PaymentRequestController>();
                var guestpaymentRequestController = user2.GetController <PaymentRequestController>();

                var request = new UpdatePaymentRequestViewModel()
                {
                    Title       = "original juice",
                    Currency    = "BTC",
                    Amount      = 1,
                    StoreId     = user.StoreId,
                    Description = "description"
                };
                var id = (Assert
                          .IsType <RedirectToActionResult>(await paymentRequestController.EditPaymentRequest(null, request)).RouteValues.Values.First().ToString());



                //permission guard for guests editing
                Assert
                .IsType <NotFoundResult>(await guestpaymentRequestController.EditPaymentRequest(id));

                request.Title = "update";
                Assert.IsType <RedirectToActionResult>(await paymentRequestController.EditPaymentRequest(id, request));

                Assert.Equal(request.Title, Assert.IsType <ViewPaymentRequestViewModel>(Assert.IsType <ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model).Title);

                Assert.False(string.IsNullOrEmpty(id));

                Assert.IsType <ViewPaymentRequestViewModel>(Assert
                                                            .IsType <ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model);

                //Archive

                Assert
                .IsType <RedirectToActionResult>(await paymentRequestController.TogglePaymentRequestArchival(id));
                Assert.True(Assert.IsType <ViewPaymentRequestViewModel>(Assert.IsType <ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model).Archived);

                Assert.Empty(Assert.IsType <ListPaymentRequestsViewModel>(Assert.IsType <ViewResult>(await paymentRequestController.GetPaymentRequests()).Model).Items);
                //unarchive
                Assert
                .IsType <RedirectToActionResult>(await paymentRequestController.TogglePaymentRequestArchival(id));

                Assert.False(Assert.IsType <ViewPaymentRequestViewModel>(Assert.IsType <ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model).Archived);

                Assert.Single(Assert.IsType <ListPaymentRequestsViewModel>(Assert.IsType <ViewResult>(await paymentRequestController.GetPaymentRequests()).Model).Items);
            }
        }
        public async Task <IActionResult> EditPaymentRequest(string id, UpdatePaymentRequestViewModel viewModel)
        {
            if (string.IsNullOrEmpty(viewModel.Currency) ||
                _Currencies.GetCurrencyData(viewModel.Currency, false) == null)
            {
                ModelState.AddModelError(nameof(viewModel.Currency), "Invalid currency");
            }

            var data = await _PaymentRequestRepository.FindPaymentRequest(id, GetUserId());

            if (data == null && !string.IsNullOrEmpty(id))
            {
                return(NotFound());
            }

            if (!ModelState.IsValid)
            {
                viewModel.Stores = new SelectList(await _StoreRepository.GetStoresByUserId(GetUserId()),
                                                  nameof(StoreData.Id),
                                                  nameof(StoreData.StoreName), data?.StoreDataId);

                return(View(viewModel));
            }

            if (data == null)
            {
                data = new PaymentRequestData();
            }

            data.StoreDataId = viewModel.StoreId;
            var blob = data.GetBlob();

            blob.Title                     = viewModel.Title;
            blob.Email                     = viewModel.Email;
            blob.Description               = viewModel.Description;
            blob.Amount                    = viewModel.Amount;
            blob.ExpiryDate                = viewModel.ExpiryDate?.ToUniversalTime();
            blob.Currency                  = viewModel.Currency;
            blob.EmbeddedCSS               = viewModel.EmbeddedCSS;
            blob.CustomCSSLink             = viewModel.CustomCSSLink;
            blob.AllowCustomPaymentAmounts = viewModel.AllowCustomPaymentAmounts;

            data.SetBlob(blob);
            if (string.IsNullOrEmpty(id))
            {
                data.Created = DateTimeOffset.UtcNow;
            }
            data = await _PaymentRequestRepository.CreateOrUpdatePaymentRequest(data);

            _EventAggregator.Publish(new PaymentRequestUpdated()
            {
                Data             = data,
                PaymentRequestId = data.Id,
            });

            TempData[WellKnownTempData.SuccessMessage] = "Saved";
            return(RedirectToAction("EditPaymentRequest", new { id = data.Id }));
        }
Exemplo n.º 4
0
        public void CanCreateViewUpdateAndDeletePaymentRequest()
        {
            using (var tester = ServerTester.Create())
            {
                tester.Start();
                var user = tester.NewAccount();
                user.GrantAccess();
                user.RegisterDerivationScheme("BTC");

                var user2 = tester.NewAccount();
                user2.GrantAccess();

                var paymentRequestController      = user.GetController <PaymentRequestController>();
                var guestpaymentRequestController = user2.GetController <PaymentRequestController>();

                var request = new UpdatePaymentRequestViewModel()
                {
                    Title       = "original juice",
                    Currency    = "BTC",
                    Amount      = 1,
                    StoreId     = user.StoreId,
                    Description = "description"
                };
                var id = (Assert
                          .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result).RouteValues.Values.First().ToString());



                //permission guard for guests editing
                Assert
                .IsType <NotFoundResult>(guestpaymentRequestController.EditPaymentRequest(id).Result);

                request.Title = "update";
                Assert.IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(id, request).Result);

                Assert.Equal(request.Title, Assert.IsType <ViewPaymentRequestViewModel>(Assert.IsType <ViewResult>(paymentRequestController.ViewPaymentRequest(id).Result).Model).Title);

                Assert.False(string.IsNullOrEmpty(id));

                Assert.IsType <ViewPaymentRequestViewModel>(Assert
                                                            .IsType <ViewResult>(paymentRequestController.ViewPaymentRequest(id).Result).Model);

                //Delete

                Assert.IsType <ConfirmModel>(Assert
                                             .IsType <ViewResult>(paymentRequestController.RemovePaymentRequestPrompt(id).Result).Model);


                Assert.IsType <RedirectToActionResult>(paymentRequestController.RemovePaymentRequest(id).Result);

                Assert
                .IsType <NotFoundResult>(paymentRequestController.ViewPaymentRequest(id).Result);
            }
        }
Exemplo n.º 5
0
        public async Task CanCancelPaymentWhenPossible()
        {
            using (var tester = ServerTester.Create())
            {
                tester.Start();
                var user = tester.NewAccount();
                user.GrantAccess();
                user.RegisterDerivationScheme("BTC");

                var paymentRequestController = user.GetController <PaymentRequestController>();


                Assert.IsType <NotFoundResult>(await
                                               paymentRequestController.CancelUnpaidPendingInvoice(Guid.NewGuid().ToString(), false));


                var request = new UpdatePaymentRequestViewModel()
                {
                    Title       = "original juice",
                    Currency    = "BTC",
                    Amount      = 1,
                    StoreId     = user.StoreId,
                    Description = "description"
                };
                var response = Assert
                               .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
                               .RouteValues.First();

                var paymentRequestId = response.Value.ToString();

                var invoiceId = Assert
                                .IsType <OkObjectResult>(await paymentRequestController.PayPaymentRequest(paymentRequestId, false)).Value
                                .ToString();

                var actionResult = Assert
                                   .IsType <RedirectToActionResult>(await paymentRequestController.PayPaymentRequest(response.Value.ToString()));

                Assert.Equal("Checkout", actionResult.ActionName);
                Assert.Equal("Invoice", actionResult.ControllerName);
                Assert.Contains(actionResult.RouteValues, pair => pair.Key == "Id" && pair.Value.ToString() == invoiceId);

                var invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);
                Assert.Equal(InvoiceState.ToString(InvoiceStatus.New), invoice.Status);
                Assert.IsType <OkObjectResult>(await
                                               paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));

                invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);
                Assert.Equal(InvoiceState.ToString(InvoiceStatus.Invalid), invoice.Status);


                Assert.IsType <BadRequestObjectResult>(await
                                                       paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));
            }
        }
        public IActionResult EditPaymentRequest(string storeId, string payReqId)
        {
            var store          = GetCurrentStore();
            var paymentRequest = GetCurrentPaymentRequest();

            if (paymentRequest == null && !string.IsNullOrEmpty(payReqId))
            {
                return(NotFound());
            }

            var vm = new UpdatePaymentRequestViewModel(paymentRequest)
            {
                StoreId = store.Id
            };

            vm.Currency ??= store.GetStoreBlob().DefaultCurrency;

            return(View(nameof(EditPaymentRequest), vm));
        }
        public async Task <IActionResult> EditPaymentRequest(string payReqId, UpdatePaymentRequestViewModel viewModel)
        {
            if (!string.IsNullOrEmpty(viewModel.Currency) &&
                _Currencies.GetCurrencyData(viewModel.Currency, false) == null)
            {
                ModelState.AddModelError(nameof(viewModel.Currency), "Invalid currency");
            }
            if (string.IsNullOrEmpty(viewModel.Currency))
            {
                viewModel.Currency = null;
            }
            var store          = GetCurrentStore();
            var paymentRequest = GetCurrentPaymentRequest();

            if (paymentRequest == null && !string.IsNullOrEmpty(payReqId))
            {
                return(NotFound());
            }

            if (paymentRequest?.Archived is true && viewModel.Archived)
            {
                ModelState.AddModelError(string.Empty, "You cannot edit an archived payment request.");
            }

            if (!ModelState.IsValid)
            {
                return(View(nameof(EditPaymentRequest), viewModel));
            }

            var data = paymentRequest ?? new PaymentRequestData();

            data.StoreDataId = viewModel.StoreId;
            data.Archived    = viewModel.Archived;

            var blob = data.GetBlob();

            blob.Title                     = viewModel.Title;
            blob.Email                     = viewModel.Email;
            blob.Description               = viewModel.Description;
            blob.Amount                    = viewModel.Amount;
            blob.ExpiryDate                = viewModel.ExpiryDate?.ToUniversalTime();
            blob.Currency                  = viewModel.Currency ?? store.GetStoreBlob().DefaultCurrency;
            blob.EmbeddedCSS               = viewModel.EmbeddedCSS;
            blob.CustomCSSLink             = viewModel.CustomCSSLink;
            blob.AllowCustomPaymentAmounts = viewModel.AllowCustomPaymentAmounts;

            data.SetBlob(blob);
            if (string.IsNullOrEmpty(payReqId))
            {
                data.Created = DateTimeOffset.UtcNow;
            }

            data = await _PaymentRequestRepository.CreateOrUpdatePaymentRequest(data);

            _EventAggregator.Publish(new PaymentRequestUpdated {
                Data = data, PaymentRequestId = data.Id,
            });

            TempData[WellKnownTempData.SuccessMessage] = "Saved";
            return(RedirectToAction(nameof(EditPaymentRequest), new { storeId = store.Id, payReqId = data.Id }));
        }
Exemplo n.º 8
0
        public async Task CanCancelPaymentWhenPossible()
        {
            using var tester = CreateServerTester();
            await tester.StartAsync();

            var user = tester.NewAccount();

            user.GrantAccess();
            user.RegisterDerivationScheme("BTC");

            var paymentRequestController = user.GetController <UIPaymentRequestController>();

            Assert.IsType <NotFoundResult>(await
                                           paymentRequestController.CancelUnpaidPendingInvoice(Guid.NewGuid().ToString(), false));

            var request = new UpdatePaymentRequestViewModel()
            {
                Title       = "original juice",
                Currency    = "BTC",
                Amount      = 1,
                StoreId     = user.StoreId,
                Description = "description"
            };
            var response = Assert
                           .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
                           .RouteValues.Last();
            var invoiceId = response.Value.ToString();
            await paymentRequestController.PayPaymentRequest(invoiceId, false);

            Assert.IsType <BadRequestObjectResult>(await
                                                   paymentRequestController.CancelUnpaidPendingInvoice(invoiceId, false));

            request.AllowCustomPaymentAmounts = true;

            response = Assert
                       .IsType <RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
                       .RouteValues.Last();

            var paymentRequestId = response.Value.ToString();

            invoiceId = Assert
                        .IsType <OkObjectResult>(await paymentRequestController.PayPaymentRequest(paymentRequestId, false))
                        .Value
                        .ToString();

            var actionResult = Assert
                               .IsType <RedirectToActionResult>(
                await paymentRequestController.PayPaymentRequest(response.Value.ToString()));

            Assert.Equal("Checkout", actionResult.ActionName);
            Assert.Equal("UIInvoice", actionResult.ControllerName);
            Assert.Contains(actionResult.RouteValues,
                            pair => pair.Key == "Id" && pair.Value.ToString() == invoiceId);

            var invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);

            Assert.Equal(InvoiceState.ToString(InvoiceStatusLegacy.New), invoice.Status);
            Assert.IsType <OkObjectResult>(await
                                           paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));

            invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);
            Assert.Equal(InvoiceState.ToString(InvoiceStatusLegacy.Invalid), invoice.Status);

            Assert.IsType <BadRequestObjectResult>(await
                                                   paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));

            invoiceId = Assert
                        .IsType <OkObjectResult>(await paymentRequestController.PayPaymentRequest(paymentRequestId, false))
                        .Value
                        .ToString();

            await user.BitPay.GetInvoiceAsync(invoiceId, Facade.Merchant);

            //a hack to generate invoices for the payment request is to manually create an invoice with an order id that matches:
            user.BitPay.CreateInvoice(new Invoice(1, "USD")
            {
                OrderId = PaymentRequestRepository.GetOrderIdForPaymentRequest(paymentRequestId)
            });
            //shouldn't crash
            await paymentRequestController.ViewPaymentRequest(paymentRequestId);

            await paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId);
        }