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)); } }
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 })); }
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); } }
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 })); }
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); }