btcpayserver/BTCPayServer.Tests/PaymentRequestTests.cs

206 lines
8.6 KiB
C#
Raw Normal View History

2019-01-14 22:43:29 +01:00
using System;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Controllers;
using BTCPayServer.Models.PaymentRequestViewModels;
using BTCPayServer.Services.Invoices;
using BTCPayServer.Tests.Logging;
using Microsoft.AspNetCore.Mvc;
using NBitpayClient;
using Xunit;
using Xunit.Abstractions;
namespace BTCPayServer.Tests
{
public class PaymentRequestTests
{
public PaymentRequestTests(ITestOutputHelper helper)
{
2020-06-28 17:55:27 +09:00
Logs.Tester = new XUnitLog(helper) { Name = "Tests" };
2019-01-14 22:43:29 +01:00
Logs.LogProvider = new XUnitLogProvider(helper);
}
[Fact]
[Trait("Integration", "Integration")]
2019-10-07 16:04:25 +09:00
public async Task CanCreateViewUpdateAndDeletePaymentRequest()
2019-01-14 22:43:29 +01:00
{
using (var tester = ServerTester.Create())
{
2019-10-07 16:04:25 +09:00
await tester.StartAsync();
2019-01-14 22:43:29 +01:00
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
2020-05-09 15:17:59 +02:00
.IsType<RedirectToActionResult>(await paymentRequestController.EditPaymentRequest(null, request)).RouteValues.Values.First().ToString());
2019-01-14 22:43:29 +01:00
2020-06-28 17:55:27 +09:00
2019-01-14 22:43:29 +01:00
//permission guard for guests editing
Assert
2020-05-09 15:17:59 +02:00
.IsType<NotFoundResult>(await guestpaymentRequestController.EditPaymentRequest(id));
2019-01-14 22:43:29 +01:00
request.Title = "update";
2020-06-28 17:55:27 +09:00
Assert.IsType<RedirectToActionResult>(await paymentRequestController.EditPaymentRequest(id, request));
Assert.Equal(request.Title, Assert.IsType<ViewPaymentRequestViewModel>(Assert.IsType<ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model).Title);
2019-01-14 22:43:29 +01:00
Assert.False(string.IsNullOrEmpty(id));
Assert.IsType<ViewPaymentRequestViewModel>(Assert
2020-05-09 15:17:59 +02:00
.IsType<ViewResult>(await paymentRequestController.ViewPaymentRequest(id)).Model);
2019-01-14 22:43:29 +01:00
2020-05-09 15:17:59 +02:00
//Archive
2019-01-14 22:43:29 +01:00
Assert
2020-05-09 15:17:59 +02:00
.IsType<RedirectToActionResult>(await paymentRequestController.TogglePaymentRequestArchival(id));
2020-06-28 17:55:27 +09:00
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);
2019-01-14 22:43:29 +01:00
}
}
2019-04-05 16:28:18 +09:00
[Fact(Timeout = 60 * 2 * 1000)]
2019-01-14 22:43:29 +01:00
[Trait("Integration", "Integration")]
public async Task CanPayPaymentRequestWhenPossible()
{
using (var tester = ServerTester.Create())
{
2019-10-07 16:04:25 +09:00
await tester.StartAsync();
2019-01-14 22:43:29 +01:00
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);
2020-06-28 17:55:27 +09:00
2019-01-14 22:43:29 +01:00
request = new UpdatePaymentRequestViewModel()
{
Title = "original juice with expiry",
Currency = "BTC",
Amount = 1,
2020-06-28 17:55:27 +09:00
ExpiryDate = DateTime.Today.Subtract(TimeSpan.FromDays(2)),
2019-01-14 22:43:29 +01:00
StoreId = user.StoreId,
Description = "description"
};
2020-06-28 17:55:27 +09:00
2019-01-14 22:43:29 +01:00
response = Assert
.IsType<RedirectToActionResult>(paymentRequestController.EditPaymentRequest(null, request).Result)
.RouteValues.First();
Assert
2020-06-28 17:55:27 +09:00
.IsType<BadRequestObjectResult>(await paymentRequestController.PayPaymentRequest(response.Value.ToString(), false));
2019-01-14 22:43:29 +01:00
}
}
2020-06-28 17:55:27 +09:00
[Fact(Timeout = 60 * 2 * 1000)]
[Trait("Integration", "Integration")]
public async Task CanCancelPaymentWhenPossible()
{
using (var tester = ServerTester.Create())
{
2019-10-07 16:04:25 +09:00
await tester.StartAsync();
var user = tester.NewAccount();
user.GrantAccess();
user.RegisterDerivationScheme("BTC");
var paymentRequestController = user.GetController<PaymentRequestController>();
2020-06-28 17:55:27 +09:00
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();
2020-06-28 17:55:27 +09:00
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);
2020-06-28 17:55:27 +09:00
Assert.Equal(InvoiceState.ToString(InvoiceStatus.New), invoice.Status);
Assert.IsType<OkObjectResult>(await
paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));
2020-06-28 17:55:27 +09:00
invoice = user.BitPay.GetInvoice(invoiceId, Facade.Merchant);
Assert.Equal(InvoiceState.ToString(InvoiceStatus.Invalid), invoice.Status);
2020-06-28 17:55:27 +09:00
Assert.IsType<BadRequestObjectResult>(await
paymentRequestController.CancelUnpaidPendingInvoice(paymentRequestId, false));
2020-06-28 17:55:27 +09:00
}
}
2019-01-14 22:43:29 +01:00
}
}