diff --git a/BTCPayServer.Tests/BTCPayServerTester.cs b/BTCPayServer.Tests/BTCPayServerTester.cs index 85a6264b9..95eea7a02 100644 --- a/BTCPayServer.Tests/BTCPayServerTester.cs +++ b/BTCPayServer.Tests/BTCPayServerTester.cs @@ -94,7 +94,9 @@ namespace BTCPayServer.Tests public bool MockRates { get; set; } = true; - public List Chains { get; set; } = new List(){"BTC", "LTC"}; + public HashSet Chains { get; set; } = new HashSet(){"BTC"}; + public bool UseLightning { get; set; } + public async Task StartAsync() { if (!Directory.Exists(_Directory)) @@ -116,6 +118,10 @@ namespace BTCPayServer.Tests { config.AppendLine($"btc.explorer.url={NBXplorerUri.AbsoluteUri}"); config.AppendLine($"btc.explorer.cookiefile=0"); + } + + if (UseLightning) + { config.AppendLine($"btc.lightning={IntegratedLightning.AbsoluteUri}"); var localLndBackupFile = Path.Combine(_Directory, "walletunlock.json"); File.Copy(TestUtils.GetTestDataFullPath("LndSeedBackup/walletunlock.json"), localLndBackupFile, true); diff --git a/BTCPayServer.Tests/CheckoutUITests.cs b/BTCPayServer.Tests/CheckoutUITests.cs index 96d315d3d..7eff60fc3 100644 --- a/BTCPayServer.Tests/CheckoutUITests.cs +++ b/BTCPayServer.Tests/CheckoutUITests.cs @@ -106,10 +106,14 @@ namespace BTCPayServer.Tests } [Fact(Timeout = TestTimeout)] + [Trait("Altcoins", "Altcoins")] + [Trait("Lightning", "Lightning")] public async Task CanUsePaymentMethodDropdown() { using (var s = SeleniumTester.Create()) { + s.Server.ActivateLTC(); + s.Server.ActivateLightning(); await s.StartAsync(); s.GoToRegister(); s.RegisterNewUser(); @@ -150,10 +154,12 @@ namespace BTCPayServer.Tests } [Fact(Timeout = TestTimeout)] + [Trait("Lightning", "Lightning")] public async Task CanUseLightningSatsFeature() { using (var s = SeleniumTester.Create()) { + s.Server.ActivateLightning(); await s.StartAsync(); s.GoToRegister(); s.RegisterNewUser(); diff --git a/BTCPayServer.Tests/ElementsTests.cs b/BTCPayServer.Tests/ElementsTests.cs index 947ad699e..0ff0b5d63 100644 --- a/BTCPayServer.Tests/ElementsTests.cs +++ b/BTCPayServer.Tests/ElementsTests.cs @@ -29,11 +29,12 @@ namespace BTCPayServer.Tests } [Fact] + [Trait("Altcoins", "Altcoins")] public async Task OnlyShowSupportedWallets() { using (var tester = ServerTester.Create()) { - tester.PayTester.Chains.Add("LBTC"); + tester.ActivateLBTC(); await tester.StartAsync(); await tester.EnsureChannelsSetup(); var user = tester.NewAccount(); @@ -67,11 +68,12 @@ namespace BTCPayServer.Tests } [Fact] + [Trait("Altcoins", "Altcoins")] public async Task ElementsAssetsAreHandledCorrectly() { using (var tester = ServerTester.Create()) { - tester.PayTester.Chains.Add("LBTC"); + tester.ActivateLBTC(); await tester.StartAsync(); var user = tester.NewAccount(); user.GrantAccess(); diff --git a/BTCPayServer.Tests/PaymentHandlerTest.cs b/BTCPayServer.Tests/PaymentHandlerTest.cs index f456c62be..17060fc7d 100644 --- a/BTCPayServer.Tests/PaymentHandlerTest.cs +++ b/BTCPayServer.Tests/PaymentHandlerTest.cs @@ -13,6 +13,7 @@ using BTCPayServer.Rating; namespace BTCPayServer.Tests { + [Trait("Fast", "Fast")] public class PaymentHandlerTest { private BitcoinLikePaymentHandler handlerBTC; diff --git a/BTCPayServer.Tests/SeleniumTests.cs b/BTCPayServer.Tests/SeleniumTests.cs index 1e7c2b51f..9f933e66e 100644 --- a/BTCPayServer.Tests/SeleniumTests.cs +++ b/BTCPayServer.Tests/SeleniumTests.cs @@ -34,6 +34,27 @@ namespace BTCPayServer.Tests s.ClickOnAllSideMenus(); s.Driver.FindElement(By.LinkText("Services")).Click(); + Logs.Tester.LogInformation("Let's check if we can access the logs"); + s.Driver.FindElement(By.LinkText("Logs")).Click(); + s.Driver.FindElement(By.PartialLinkText(".log")).Click(); + Assert.Contains("Starting listening NBXplorer", s.Driver.PageSource); + s.Driver.Quit(); + } + } + + [Fact(Timeout = TestTimeout)] + [Trait("Lightning", "Lightning")] + public async Task CanUseLndSeedBackup() + { + using (var s = SeleniumTester.Create()) + { + s.Server.ActivateLightning(); + await s.StartAsync(); + s.RegisterNewUser(true); + s.Driver.FindElement(By.Id("ServerSettings")).Click(); + s.Driver.AssertNoError(); + s.Driver.FindElement(By.LinkText("Services")).Click(); + Logs.Tester.LogInformation("Let's if we can access LND's seed"); Assert.Contains("server/services/lndseedbackup/BTC", s.Driver.PageSource); s.Driver.Navigate().GoToUrl(s.Link("/server/services/lndseedbackup/BTC")); @@ -49,12 +70,6 @@ namespace BTCPayServer.Tests s.AssertHappyMessage(); seedEl = s.Driver.FindElement(By.Id("SeedTextArea")); Assert.Contains("Seed removed", seedEl.Text, StringComparison.OrdinalIgnoreCase); - - Logs.Tester.LogInformation("Let's check if we can access the logs"); - s.Driver.FindElement(By.LinkText("Logs")).Click(); - s.Driver.FindElement(By.PartialLinkText(".log")).Click(); - Assert.Contains("Starting listening NBXplorer", s.Driver.PageSource); - s.Driver.Quit(); } } diff --git a/BTCPayServer.Tests/ServerTester.cs b/BTCPayServer.Tests/ServerTester.cs index 7f99fe4bc..b83bd3159 100644 --- a/BTCPayServer.Tests/ServerTester.cs +++ b/BTCPayServer.Tests/ServerTester.cs @@ -46,31 +46,15 @@ namespace BTCPayServer.Tests NetworkProvider = new BTCPayNetworkProvider(NetworkType.Regtest); ExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_BTCRPCCONNECTION", "server=http://127.0.0.1:43782;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("BTC").NBitcoinNetwork); ExplorerNode.ScanRPCCapabilities(); - LTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LTCRPCCONNECTION", "server=http://127.0.0.1:43783;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("LTC").NBitcoinNetwork); - LBTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LBTCRPCCONNECTION", "server=http://127.0.0.1:19332;liquid:liquid")), NetworkProvider.GetNetwork("LBTC").NBitcoinNetwork); ExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("BTC").NBXplorerNetwork, new Uri(GetEnvironment("TESTS_BTCNBXPLORERURL", "http://127.0.0.1:32838/"))); - LTCExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("LTC").NBXplorerNetwork, new Uri(GetEnvironment("TESTS_LTCNBXPLORERURL", "http://127.0.0.1:32838/"))); - LBTCExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("LBTC").NBXplorerNetwork, new Uri(GetEnvironment("TESTS_LBTCNBXPLORERURL", "http://127.0.0.1:32838/"))); - - var btc = NetworkProvider.GetNetwork("BTC").NBitcoinNetwork; - CustomerLightningD = LightningClientFactory.CreateClient(GetEnvironment("TEST_CUSTOMERLIGHTNINGD", "type=clightning;server=tcp://127.0.0.1:30992/"), btc); - MerchantLightningD = LightningClientFactory.CreateClient(GetEnvironment("TEST_MERCHANTLIGHTNINGD", "type=clightning;server=tcp://127.0.0.1:30993/"), btc); - - MerchantCharge = new ChargeTester(this, "TEST_MERCHANTCHARGE", "type=charge;server=http://127.0.0.1:54938/;api-token=foiewnccewuify", "merchant_lightningd", btc); - - MerchantLnd = new LndMockTester(this, "TEST_MERCHANTLND", "https://lnd:lnd@127.0.0.1:53280/", "merchant_lnd", btc); PayTester = new BTCPayServerTester(Path.Combine(_Directory, "pay")) { - NBXplorerUri = ExplorerClient.Address, - LTCNBXplorerUri = LTCExplorerClient.Address, - LBTCNBXplorerUri = LTCExplorerClient.Address, TestDatabase = Enum.Parse(GetEnvironment("TESTS_DB", TestDatabases.Postgres.ToString()), true), Postgres = GetEnvironment("TESTS_POSTGRES", "User ID=postgres;Host=127.0.0.1;Port=39372;Database=btcpayserver"), - MySQL = GetEnvironment("TESTS_MYSQL", "User ID=root;Host=127.0.0.1;Port=33036;Database=btcpayserver"), - IntegratedLightning = MerchantCharge.Client.Uri + MySQL = GetEnvironment("TESTS_MYSQL", "User ID=root;Host=127.0.0.1;Port=33036;Database=btcpayserver") }; PayTester.Port = int.Parse(GetEnvironment("TESTS_PORT", Utils.FreeTcpPort().ToString(CultureInfo.InvariantCulture)), CultureInfo.InvariantCulture); PayTester.HostName = GetEnvironment("TESTS_HOSTNAME", "127.0.0.1"); @@ -81,6 +65,31 @@ namespace BTCPayServer.Tests PayTester.SSHConnection = GetEnvironment("TESTS_SSHCONNECTION", "root@127.0.0.1:21622"); } + public void ActivateLTC() + { + LTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LTCRPCCONNECTION", "server=http://127.0.0.1:43783;ceiwHEbqWI83:DwubwWsoo3")), NetworkProvider.GetNetwork("LTC").NBitcoinNetwork); + LTCExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("LTC").NBXplorerNetwork, new Uri(GetEnvironment("TESTS_LTCNBXPLORERURL", "http://127.0.0.1:32838/"))); + PayTester.Chains.Add("LTC"); + PayTester.LTCNBXplorerUri = LTCExplorerClient.Address; + } + public void ActivateLBTC() + { + LBTCExplorerNode = new RPCClient(RPCCredentialString.Parse(GetEnvironment("TESTS_LBTCRPCCONNECTION", "server=http://127.0.0.1:19332;liquid:liquid")), NetworkProvider.GetNetwork("LBTC").NBitcoinNetwork); + LBTCExplorerClient = new ExplorerClient(NetworkProvider.GetNetwork("LBTC").NBXplorerNetwork, new Uri(GetEnvironment("TESTS_LBTCNBXPLORERURL", "http://127.0.0.1:32838/"))); + PayTester.Chains.Add("LBTC"); + PayTester.LBTCNBXplorerUri = LBTCExplorerClient.Address; + } + + public void ActivateLightning() + { + var btc = NetworkProvider.GetNetwork("BTC").NBitcoinNetwork; + CustomerLightningD = LightningClientFactory.CreateClient(GetEnvironment("TEST_CUSTOMERLIGHTNINGD", "type=clightning;server=tcp://127.0.0.1:30992/"), btc); + MerchantLightningD = LightningClientFactory.CreateClient(GetEnvironment("TEST_MERCHANTLIGHTNINGD", "type=clightning;server=tcp://127.0.0.1:30993/"), btc); + MerchantCharge = new ChargeTester(this, "TEST_MERCHANTCHARGE", "type=charge;server=http://127.0.0.1:54938/;api-token=foiewnccewuify", "merchant_lightningd", btc); + MerchantLnd = new LndMockTester(this, "TEST_MERCHANTLND", "https://lnd:lnd@127.0.0.1:53280/", "merchant_lnd", btc); + PayTester.UseLightning = true; + PayTester.IntegratedLightning = MerchantCharge.Client.Uri; + } public bool Dockerized { diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index 411d713d0..ab98dd19f 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -560,10 +560,12 @@ namespace BTCPayServer.Tests [Fact(Timeout = 60 * 2 * 1000)] [Trait("Integration", "Integration")] + [Trait("Lightning", "Lightning")] public async Task CanSetLightningServer() { using (var tester = ServerTester.Create()) { + tester.ActivateLightning(); await tester.StartAsync(); await tester.EnsureChannelsSetup(); var user = tester.NewAccount(); @@ -599,6 +601,7 @@ namespace BTCPayServer.Tests [Fact(Timeout = 60 * 2 * 1000)] [Trait("Integration", "Integration")] + [Trait("Lightning", "Lightning")] public async Task CanSendLightningPaymentCLightning() { await ProcessLightningPayment(LightningConnectionType.CLightning); @@ -606,6 +609,7 @@ namespace BTCPayServer.Tests [Fact(Timeout = 60 * 2 * 1000)] [Trait("Integration", "Integration")] + [Trait("Lightning", "Lightning")] public async Task CanSendLightningPaymentCharge() { await ProcessLightningPayment(LightningConnectionType.Charge); @@ -613,6 +617,7 @@ namespace BTCPayServer.Tests [Fact(Timeout = 60 * 2 * 1000)] [Trait("Integration", "Integration")] + [Trait("Lightning", "Lightning")] public async Task CanSendLightningPaymentLnd() { await ProcessLightningPayment(LightningConnectionType.LndREST); @@ -625,6 +630,7 @@ namespace BTCPayServer.Tests using (var tester = ServerTester.Create()) { + tester.ActivateLightning(); await tester.StartAsync(); await tester.EnsureChannelsSetup(); var user = tester.NewAccount(); @@ -806,21 +812,14 @@ namespace BTCPayServer.Tests acc.GrantAccess(); acc.RegisterDerivationScheme("BTC", true); var btcDerivationScheme = acc.DerivationScheme; - acc.RegisterDerivationScheme("LTC", true); var walletController = acc.GetController(); - WalletId walletId = new WalletId(acc.StoreId, "LTC"); - var rescan = Assert.IsType(Assert.IsType(walletController.WalletRescan(walletId).Result).Model); - Assert.False(rescan.Ok); - Assert.True(rescan.IsFullySync); - Assert.False(rescan.IsSupportedByCurrency); - Assert.False(rescan.IsServerAdmin); - walletId = new WalletId(acc.StoreId, "BTC"); + var walletId = new WalletId(acc.StoreId, "BTC"); acc.IsAdmin = true; walletController = acc.GetController(); - rescan = Assert.IsType(Assert.IsType(walletController.WalletRescan(walletId).Result).Model); + var rescan = Assert.IsType(Assert.IsType(walletController.WalletRescan(walletId).Result).Model); Assert.True(rescan.Ok); Assert.True(rescan.IsFullySync); Assert.True(rescan.IsSupportedByCurrency); @@ -947,15 +946,14 @@ namespace BTCPayServer.Tests var acc = tester.NewAccount(); acc.GrantAccess(); acc.RegisterDerivationScheme("BTC"); - acc.RegisterDerivationScheme("LTC"); var rateController = acc.GetController(); var GetBaseCurrencyRatesResult = JObject.Parse(((JsonResult)rateController.GetBaseCurrencyRates("BTC", default) .GetAwaiter().GetResult()).Value.ToJson()).ToObject>(); Assert.NotNull(GetBaseCurrencyRatesResult); Assert.NotNull(GetBaseCurrencyRatesResult.Data); - Assert.Equal(2, GetBaseCurrencyRatesResult.Data.Length); - Assert.Single(GetBaseCurrencyRatesResult.Data.Where(o => o.Code == "LTC")); + var rate = Assert.Single(GetBaseCurrencyRatesResult.Data); + Assert.Equal("BTC", rate.Code); var GetRatesResult = JObject.Parse(((JsonResult)rateController.GetRates(null, default) .GetAwaiter().GetResult()).Value.ToJson()).ToObject>(); @@ -1362,10 +1360,12 @@ namespace BTCPayServer.Tests [Fact(Timeout = TestTimeout)] [Trait("Integration", "Integration")] + [Trait("Altcoins", "Altcoins")] public async Task CanHaveLTCOnlyStore() { using (var tester = ServerTester.Create()) { + tester.ActivateLTC(); await tester.StartAsync(); var user = tester.NewAccount(); user.GrantAccess(); @@ -1489,10 +1489,12 @@ namespace BTCPayServer.Tests [Fact(Timeout = TestTimeout)] [Trait("Integration", "Integration")] + [Trait("Altcoins", "Altcoins")] public async Task CanPayWithTwoCurrencies() { using (var tester = ServerTester.Create()) { + tester.ActivateLTC(); await tester.StartAsync(); var user = tester.NewAccount(); user.GrantAccess(); @@ -1706,10 +1708,14 @@ namespace BTCPayServer.Tests [Fact] [Trait("Integration", "Integration")] + [Trait("Altcoins", "Altcoins")] + [Trait("Lightning", "Lightning")] public async Task CanAddDerivationSchemes() { using (var tester = ServerTester.Create()) { + tester.ActivateLTC(); + tester.ActivateLightning(); await tester.StartAsync(); var user = tester.NewAccount(); user.GrantAccess(); @@ -1851,14 +1857,43 @@ namespace BTCPayServer.Tests using (var tester = ServerTester.Create()) { await tester.StartAsync(); - await tester.EnsureChannelsSetup(); var user = tester.NewAccount(); user.GrantAccess(); user.RegisterDerivationScheme("BTC"); + var vm = Assert.IsType(Assert.IsType(user.GetController().CheckoutExperience()).Model); + vm.OnChainMinValue = "5 USD"; + Assert.IsType(user.GetController().CheckoutExperience(vm).Result); + + var invoice = user.BitPay.CreateInvoice(new Invoice() + { + Price = 5.5m, + Currency = "USD", + PosData = "posData", + OrderId = "orderId", + ItemDesc = "Some description", + FullNotifications = true + }, Facade.Merchant); + + Assert.Single(invoice.CryptoInfo); + Assert.Equal(PaymentTypes.BTCLike.ToString(), invoice.CryptoInfo[0].PaymentType); + } + } + + [Fact(Timeout = 60 * 2 * 1000)] + [Trait("Integration", "Integration")] + [Trait("Lightning", "Lightning")] + public async Task CanSetPaymentMethodLimitsLightning() + { + using (var tester = ServerTester.Create()) + { + tester.ActivateLightning(); + await tester.StartAsync(); + await tester.EnsureChannelsSetup(); + var user = tester.NewAccount(); + user.GrantAccess(); user.RegisterLightningNode("BTC", LightningConnectionType.Charge); var vm = Assert.IsType(Assert.IsType(user.GetController().CheckoutExperience()).Model); vm.LightningMaxValue = "2 USD"; - vm.OnChainMinValue = "5 USD"; Assert.IsType(user.GetController().CheckoutExperience(vm).Result); var invoice = user.BitPay.CreateInvoice(new Invoice() @@ -1873,19 +1908,6 @@ namespace BTCPayServer.Tests Assert.Single(invoice.CryptoInfo); Assert.Equal(PaymentTypes.LightningLike.ToString(), invoice.CryptoInfo[0].PaymentType); - - invoice = user.BitPay.CreateInvoice(new Invoice() - { - Price = 5.5m, - Currency = "USD", - PosData = "posData", - OrderId = "orderId", - ItemDesc = "Some description", - FullNotifications = true - }, Facade.Merchant); - - Assert.Single(invoice.CryptoInfo); - Assert.Equal(PaymentTypes.BTCLike.ToString(), invoice.CryptoInfo[0].PaymentType); } } @@ -2911,10 +2933,14 @@ noninventoryitem: [Fact(Timeout = TestTimeout)] [Trait("Integration", "Integration")] - public async Task CanCreateInvoiceWithSpecificPaymentMethods() + [Trait("Altcoins", "Altcoins")] + [Trait("Lightning", "Lightning")] + public async Task CanCreateInvoiceWithSpecificPaymentMethods() { using (var tester = ServerTester.Create()) { + tester.ActivateLightning(); + tester.ActivateLTC(); await tester.StartAsync(); await tester.EnsureChannelsSetup(); var user = tester.NewAccount();