Compare commits
6 Commits
fix/fast-t
...
v1.13.3
Author | SHA1 | Date | |
---|---|---|---|
9d84ec4aa4 | |||
33f20b7be5 | |||
487f967607 | |||
5bc9285e84 | |||
bc1a5aa8f0 | |||
556a9c0e6d |
BTCPayServer.Tests
BTCPayServer.Tests.csprojSeleniumTests.csThirdPartyTests.csdocker-compose.altcoins.ymldocker-compose.yml
BTCPayServer
Build
Changelog.md@ -24,7 +24,7 @@
|
||||
<PackageReference Include="Newtonsoft.Json.Schema" Version="3.0.15" />
|
||||
<PackageReference Include="Selenium.Support" Version="4.1.1" />
|
||||
<PackageReference Include="Selenium.WebDriver" Version="4.1.1" />
|
||||
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="121.0.6167.8500" />
|
||||
<PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="125.0.6422.14100" />
|
||||
<PackageReference Include="xunit" Version="2.6.6" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
|
@ -2638,6 +2638,33 @@ namespace BTCPayServer.Tests
|
||||
Assert.Contains("Total", sums[3].FindElement(By.CssSelector("th")).Text);
|
||||
Assert.Contains("1 222,21 €", sums[3].FindElement(By.CssSelector("td")).Text);
|
||||
|
||||
// Receipt print
|
||||
s.Driver.FindElement(By.Id("ReceiptLinkPrint")).Click();
|
||||
windows = s.Driver.WindowHandles;
|
||||
Assert.Equal(3, windows.Count);
|
||||
s.Driver.SwitchTo().Window(windows[2]);
|
||||
var paymentDetails = s.Driver.WaitForElement(By.CssSelector("#PaymentDetails table"));
|
||||
items = paymentDetails.FindElements(By.CssSelector("tr.cart-data"));
|
||||
sums = paymentDetails.FindElements(By.CssSelector("tr.sums-data"));
|
||||
Assert.Equal(2, items.Count);
|
||||
Assert.Equal(4, sums.Count);
|
||||
Assert.Contains("Manual entry 1", items[0].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("1 234,00 €", items[0].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Manual entry 2", items[1].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("0,56 €", items[1].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Subtotal", sums[0].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("1 234,56 €", sums[0].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Discount", sums[1].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("10% = 123,46 €", sums[1].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Tip", sums[2].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("10% = 111,11 €", sums[2].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Total", sums[3].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("1 222,21 €", sums[3].FindElement(By.CssSelector(".val")).Text);
|
||||
s.Driver.Close();
|
||||
s.Driver.SwitchTo().Window(windows[1]);
|
||||
s.Driver.Close();
|
||||
s.Driver.SwitchTo().Window(s.Driver.WindowHandles.First());
|
||||
|
||||
// Once more with items
|
||||
s.GoToUrl(editUrl);
|
||||
s.Driver.FindElement(By.Id("ShowItems")).Click();
|
||||
@ -2675,7 +2702,6 @@ namespace BTCPayServer.Tests
|
||||
|
||||
// Receipt
|
||||
s.Driver.WaitForElement(By.Id("ReceiptLink")).Click();
|
||||
|
||||
cartData = s.Driver.FindElement(By.CssSelector("#CartData table"));
|
||||
items = cartData.FindElements(By.CssSelector("tbody tr"));
|
||||
sums = cartData.FindElements(By.CssSelector("tfoot tr"));
|
||||
@ -2690,6 +2716,27 @@ namespace BTCPayServer.Tests
|
||||
Assert.Contains("Total", sums[0].FindElement(By.CssSelector("th")).Text);
|
||||
Assert.Contains("4,23 €", sums[0].FindElement(By.CssSelector("td")).Text);
|
||||
|
||||
// Receipt print
|
||||
s.Driver.FindElement(By.Id("ReceiptLinkPrint")).Click();
|
||||
windows = s.Driver.WindowHandles;
|
||||
Assert.Equal(2, windows.Count);
|
||||
s.Driver.SwitchTo().Window(windows[1]);
|
||||
paymentDetails = s.Driver.WaitForElement(By.CssSelector("#PaymentDetails table"));
|
||||
items = paymentDetails.FindElements(By.CssSelector("tr.cart-data"));
|
||||
sums = paymentDetails.FindElements(By.CssSelector("tr.sums-data"));
|
||||
Assert.Equal(3, items.Count);
|
||||
Assert.Single(sums);
|
||||
Assert.Contains("Black Tea", items[0].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("1 x 1,00 € = 1,00 €", items[0].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Green Tea", items[1].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("2 x 1,00 € = 2,00 €", items[1].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Manual entry 1", items[2].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("1,23 €", items[2].FindElement(By.CssSelector(".val")).Text);
|
||||
Assert.Contains("Total", sums[0].FindElement(By.CssSelector(".key")).Text);
|
||||
Assert.Contains("4,23 €", sums[0].FindElement(By.CssSelector(".val")).Text);
|
||||
s.Driver.Close();
|
||||
s.Driver.SwitchTo().Window(s.Driver.WindowHandles.First());
|
||||
|
||||
// Guest user can access recent transactions
|
||||
s.GoToHome();
|
||||
s.Logout();
|
||||
|
@ -272,7 +272,8 @@ namespace BTCPayServer.Tests
|
||||
"https://www.btse.com", // not allowing to be hit from circleci
|
||||
"https://www.bitpay.com", // not allowing to be hit from circleci
|
||||
"https://support.bitpay.com",
|
||||
"https://www.coingecko.com" // unhappy service
|
||||
"https://www.coingecko.com", // unhappy service
|
||||
"https://www.wasabiwallet.io/" // returning Forbidden
|
||||
};
|
||||
|
||||
foreach (var match in regex.Matches(text).OfType<Match>())
|
||||
|
@ -163,7 +163,7 @@ services:
|
||||
- "bitcoin_datadir:/data"
|
||||
|
||||
customer_lightningd:
|
||||
image: btcpayserver/lightning:v24.02.2
|
||||
image: btcpayserver/lightning:v24.05
|
||||
stop_signal: SIGKILL
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@ -191,7 +191,7 @@ services:
|
||||
- bitcoind
|
||||
|
||||
merchant_lightningd:
|
||||
image: btcpayserver/lightning:v24.02.2
|
||||
image: btcpayserver/lightning:v24.05
|
||||
stop_signal: SIGKILL
|
||||
environment:
|
||||
EXPOSE_TCP: "true"
|
||||
|
@ -149,7 +149,7 @@ services:
|
||||
- "bitcoin_datadir:/data"
|
||||
|
||||
customer_lightningd:
|
||||
image: btcpayserver/lightning:v24.02.2
|
||||
image: btcpayserver/lightning:v24.05
|
||||
stop_signal: SIGKILL
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@ -177,7 +177,7 @@ services:
|
||||
- bitcoind
|
||||
|
||||
merchant_lightningd:
|
||||
image: btcpayserver/lightning:v24.02.2
|
||||
image: btcpayserver/lightning:v24.05
|
||||
stop_signal: SIGKILL
|
||||
environment:
|
||||
EXPOSE_TCP: "true"
|
||||
|
@ -90,11 +90,14 @@ namespace BTCPayServer
|
||||
_pluginHookService = pluginHookService;
|
||||
_invoiceActivator = invoiceActivator;
|
||||
}
|
||||
|
||||
[EnableCors(CorsPolicies.All)]
|
||||
[HttpGet("withdraw/pp/{pullPaymentId}")]
|
||||
public Task<IActionResult> GetLNURLForPullPayment(string cryptoCode, string pullPaymentId, [FromQuery] string pr, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetLNURLForPullPayment(cryptoCode, pullPaymentId, pr, pullPaymentId, cancellationToken);
|
||||
}
|
||||
|
||||
[NonAction]
|
||||
internal async Task<IActionResult> GetLNURLForPullPayment(string cryptoCode, string pullPaymentId, string pr, string k1, CancellationToken cancellationToken)
|
||||
{
|
||||
|
@ -82,7 +82,7 @@
|
||||
</div>
|
||||
}
|
||||
</dl>
|
||||
<a href="?print=true" class="flex-grow-0 align-self-start btn btn-secondary d-print-none fs-4" target="_blank">Print</a>
|
||||
<a href="?print=true" class="flex-grow-0 align-self-start btn btn-secondary d-print-none fs-4" target="_blank" id="ReceiptLinkPrint">Print</a>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
@ -117,7 +117,7 @@
|
||||
{
|
||||
@foreach (var (key, value) in Model.AdditionalData)
|
||||
{
|
||||
<tr>
|
||||
<tr class="additional-data">
|
||||
<td class="text-secondary">@key</td>
|
||||
<td class="text-end">@value</td>
|
||||
</tr>
|
||||
@ -126,20 +126,20 @@
|
||||
<td colspan="2"><hr class="w-100 my-0"/></td>
|
||||
</tr>
|
||||
}
|
||||
@if (hasCart && !IsManualEntryCart(Model.AdditionalData))
|
||||
@if (hasCart && !IsManualEntryCart(Model.CartData))
|
||||
{
|
||||
_ = Model.CartData.TryGetValue("cart", out var cart) || Model.CartData.TryGetValue("Cart", out cart);
|
||||
var hasTotal = Model.CartData.TryGetValue("total", out var total) || Model.CartData.TryGetValue("Total", out total);
|
||||
var hasSubtotal = Model.CartData.TryGetValue("subtotal", out var subtotal) || Model.CartData.TryGetValue("subTotal", out subtotal) || Model.CartData.TryGetValue("Subtotal", out subtotal);
|
||||
var hasDiscount = Model.CartData.TryGetValue("discount", out var discount) || Model.CartData.TryGetValue("Discount", out discount);
|
||||
var hasTip = Model.CartData.TryGetValue("tip", out var tip) || Model.CartData.TryGetValue("Tip", out tip);
|
||||
if (cart is Dictionary<string, object> { Keys.Count: > 0 } cartDict)
|
||||
if (cart is Dictionary<string, object> { Keys.Count: > 0 } cartDict)
|
||||
{
|
||||
@foreach (var (key, value) in cartDict)
|
||||
{
|
||||
<tr>
|
||||
<td class="text-secondary">@key</td>
|
||||
<td class="text-end">@value</td>
|
||||
<tr class="cart-data">
|
||||
<td class="key text-secondary">@key</td>
|
||||
<td class="val text-end">@value</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
@ -148,7 +148,7 @@
|
||||
@foreach (var value in cartCollection)
|
||||
{
|
||||
<tr>
|
||||
<td class="text-end">@value</td>
|
||||
<td class="val text-end">@value</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
@ -157,23 +157,23 @@
|
||||
<tr>
|
||||
<td colspan="2"><hr class="w-100 my-0"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text-secondary">Subtotal</td>
|
||||
<td class="text-end">@subtotal</td>
|
||||
<tr class="sums-data">
|
||||
<td class="key text-secondary">Subtotal</td>
|
||||
<td class="val text-end">@subtotal</td>
|
||||
</tr>
|
||||
}
|
||||
if (hasDiscount)
|
||||
{
|
||||
<tr>
|
||||
<td class="text-secondary">Discount</td>
|
||||
<td class="text-end">@discount</td>
|
||||
<tr class="sums-data">
|
||||
<td class="key text-secondary">Discount</td>
|
||||
<td class="val text-end">@discount</td>
|
||||
</tr>
|
||||
}
|
||||
if (hasTip)
|
||||
{
|
||||
<tr>
|
||||
<td class="text-secondary">Tip</td>
|
||||
<td class="text-end">@tip</td>
|
||||
<tr class="sums-data">
|
||||
<td class="key text-secondary">Tip</td>
|
||||
<td class="val text-end">@tip</td>
|
||||
</tr>
|
||||
}
|
||||
if (hasTotal)
|
||||
@ -181,17 +181,17 @@
|
||||
<tr>
|
||||
<td colspan="2"><hr class="w-100 my-0"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="text-secondary">Total</th>
|
||||
<td class="text-end fw-semibold">@total</td>
|
||||
<tr class="sums-data">
|
||||
<td class="key text-secondary">Total</td>
|
||||
<td class="val text-end fw-semibold">@total</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<tr>
|
||||
<td class="text-nowrap text-secondary">Total</td>
|
||||
<td class="text-end fw-semibold">@DisplayFormatter.Currency(Model.Amount, Model.Currency, DisplayFormatter.CurrencyFormat.Symbol)</td>
|
||||
<tr class="sums-data">
|
||||
<td class="key text-nowrap text-secondary">Total</td>
|
||||
<td class="val text-end fw-semibold">@DisplayFormatter.Currency(Model.Amount, Model.Currency, DisplayFormatter.CurrencyFormat.Symbol)</td>
|
||||
</tr>
|
||||
}
|
||||
@if (Model.Payments?.Any() is true)
|
||||
@ -207,25 +207,25 @@
|
||||
<tr>
|
||||
<td colspan="2" class="text-nowrap text-secondary">Payment @(i + 1)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td class="text-nowrap">Received</td>
|
||||
<td>@payment.ReceivedDate.ToBrowserDate()</td>
|
||||
</tr>
|
||||
}
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td class="text-nowrap text-secondary">@(Model.Payments.Count == 1 ? "Paid" : "")</td>
|
||||
<td class="text-end">@payment.AmountFormatted</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td colspan="2" class="text-end">@payment.PaidFormatted</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td class="text-nowrap text-secondary">Rate</td>
|
||||
<td class="text-end">@payment.RateFormatted</td>
|
||||
</tr>
|
||||
@if (!string.IsNullOrEmpty(payment.Destination))
|
||||
{
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td class="text-nowrap text-secondary">Destination</td>
|
||||
<td class="text-break">
|
||||
@if (payment.Destination.Length > 69)
|
||||
@ -245,7 +245,7 @@
|
||||
}
|
||||
@if (!string.IsNullOrEmpty(payment.PaymentProof))
|
||||
{
|
||||
<tr>
|
||||
<tr class="payment-data">
|
||||
<td class="text-nowrap text-secondary">Pay Proof</td>
|
||||
<td class="text-break">@payment.PaymentProof</td>
|
||||
</tr>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>1.13.2</Version>
|
||||
<Version>1.13.3</Version>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
@ -1,5 +1,14 @@
|
||||
# Changelog
|
||||
|
||||
## 1.13.3
|
||||
|
||||
### Bug fixes
|
||||
|
||||
* Fix potential crash on receipt print page (#6045) @dennisreimann
|
||||
* Fix invoice paid for topping up a pull payment didn't top up. @NicolasDorier
|
||||
* Pull payment: Enable CORS for LNURL request (#6044) @dennisreimann
|
||||
|
||||
|
||||
## 1.13.2
|
||||
|
||||
### New features
|
||||
|
Reference in New Issue
Block a user