diff --git a/BTCPayServer.Tests/ApiKeysTests.cs b/BTCPayServer.Tests/ApiKeysTests.cs index d5d812e1f..8b981df93 100644 --- a/BTCPayServer.Tests/ApiKeysTests.cs +++ b/BTCPayServer.Tests/ApiKeysTests.cs @@ -124,8 +124,8 @@ namespace BTCPayServer.Tests //redirect //appidentifier var appidentifier = "testapp"; - var callbackUrl = tester.PayTester.ServerUri + "postredirect-callback-test"; - var authUrl = BTCPayServerClient.GenerateAuthorizeUri(tester.PayTester.ServerUri, + var callbackUrl = s.ServerUri + "postredirect-callback-test"; + var authUrl = BTCPayServerClient.GenerateAuthorizeUri(s.ServerUri, new[] { Policies.CanModifyStoreSettings, Policies.CanModifyServerSettings }, applicationDetails: (appidentifier, new Uri(callbackUrl))).ToString(); s.Driver.Navigate().GoToUrl(authUrl); Assert.Contains(appidentifier, s.Driver.PageSource); @@ -143,7 +143,7 @@ namespace BTCPayServer.Tests await TestApiAgainstAccessToken(accessToken, tester, user, (await apiKeyRepo.GetKey(accessToken)).GetBlob().Permissions); - authUrl = BTCPayServerClient.GenerateAuthorizeUri(tester.PayTester.ServerUri, + authUrl = BTCPayServerClient.GenerateAuthorizeUri(s.ServerUri, new[] { Policies.CanModifyStoreSettings, Policies.CanModifyServerSettings }, false, true, applicationDetails: (null, new Uri(callbackUrl))).ToString(); s.Driver.Navigate().GoToUrl(authUrl); @@ -164,7 +164,7 @@ namespace BTCPayServer.Tests (await apiKeyRepo.GetKey(accessToken)).GetBlob().Permissions); //let's test the app identifier system - authUrl = BTCPayServerClient.GenerateAuthorizeUri(tester.PayTester.ServerUri, + authUrl = BTCPayServerClient.GenerateAuthorizeUri(s.ServerUri, new[] { Policies.CanModifyStoreSettings, Policies.CanModifyServerSettings }, false, true, (appidentifier, new Uri(callbackUrl))).ToString(); //if it's the same, go to the confirm page @@ -173,7 +173,7 @@ namespace BTCPayServer.Tests Assert.Equal(callbackUrl, s.Driver.Url); //same app but different redirect = nono - authUrl = BTCPayServerClient.GenerateAuthorizeUri(tester.PayTester.ServerUri, + authUrl = BTCPayServerClient.GenerateAuthorizeUri(s.ServerUri, new[] { Policies.CanModifyStoreSettings, Policies.CanModifyServerSettings }, false, true, (appidentifier, new Uri("https://international.local/callback"))).ToString(); s.Driver.Navigate().GoToUrl(authUrl); diff --git a/BTCPayServer.Tests/CheckoutUITests.cs b/BTCPayServer.Tests/CheckoutUITests.cs index 63dd18652..62f20d474 100644 --- a/BTCPayServer.Tests/CheckoutUITests.cs +++ b/BTCPayServer.Tests/CheckoutUITests.cs @@ -163,7 +163,7 @@ namespace BTCPayServer.Tests var invoiceId = s.CreateInvoice(store.storeId, 0.001m, "BTC", "a@x.com"); var invoice = await s.Server.PayTester.InvoiceRepository.GetInvoice(invoiceId); s.Driver.Navigate() - .GoToUrl(new Uri(s.Server.PayTester.ServerUri, $"tests/index.html?invoice={invoiceId}")); + .GoToUrl(new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}")); TestUtils.Eventually(() => { Assert.True(s.Driver.FindElement(By.Name("btcpay")).Displayed); @@ -184,7 +184,7 @@ namespace BTCPayServer.Tests closebutton.Click(); s.Driver.AssertElementNotFound(By.Name("btcpay")); Assert.Equal(s.Driver.Url, - new Uri(s.Server.PayTester.ServerUri, $"tests/index.html?invoice={invoiceId}").ToString()); + new Uri(s.ServerUri, $"tests/index.html?invoice={invoiceId}").ToString()); } } } diff --git a/BTCPayServer.Tests/SeleniumTester.cs b/BTCPayServer.Tests/SeleniumTester.cs index 2bd76d84d..fefbb99fa 100644 --- a/BTCPayServer.Tests/SeleniumTester.cs +++ b/BTCPayServer.Tests/SeleniumTester.cs @@ -53,11 +53,6 @@ namespace BTCPayServer.Tests var chromeDriverPath = config["ChromeDriverDirectory"] ?? (Server.PayTester.InContainer ? "/usr/bin" : Directory.GetCurrentDirectory()); var options = new ChromeOptions(); - if (Server.PayTester.InContainer) - { - // this must be first option https://stackoverflow.com/questions/53073411/selenium-webdriverexceptionchrome-failed-to-start-crashed-as-google-chrome-is#comment102570662_53073789 - options.AddArgument("no-sandbox"); - } if (!runInBrowser) { options.AddArguments("headless"); @@ -65,24 +60,39 @@ namespace BTCPayServer.Tests options.AddArguments($"window-size={windowSize.Width}x{windowSize.Height}"); options.AddArgument("shm-size=2g"); options.AddArgument("start-maximized"); - - var cds = ChromeDriverService.CreateDefaultService(chromeDriverPath); - cds.EnableVerboseLogging = true; - cds.Port = Utils.FreeTcpPort(); - cds.HostName = "127.0.0.1"; - cds.Start(); - Driver = new ChromeDriver(cds, options, - // A bit less than test timeout - TimeSpan.FromSeconds(50)); + if (Server.PayTester.InContainer) + { + Driver = new OpenQA.Selenium.Remote.RemoteWebDriver(new Uri("http://selenium:4444/wd/hub"), new RemoteSessionSettings(options)); + var containerIp = File.ReadAllText("/etc/hosts").Split('\n', StringSplitOptions.RemoveEmptyEntries).Last() + .Split('\t', StringSplitOptions.RemoveEmptyEntries)[0].Trim(); + Logs.Tester.LogInformation($"Selenium: Container's IP {containerIp}"); + ServerUri = new Uri(Server.PayTester.ServerUri.AbsoluteUri.Replace($"http://{Server.PayTester.HostName}", $"http://{containerIp}", StringComparison.OrdinalIgnoreCase), UriKind.Absolute); + } + else + { + var cds = ChromeDriverService.CreateDefaultService(chromeDriverPath); + cds.EnableVerboseLogging = true; + cds.Port = Utils.FreeTcpPort(); + cds.HostName = "127.0.0.1"; + cds.Start(); + Driver = new ChromeDriver(cds, options, + // A bit less than test timeout + TimeSpan.FromSeconds(50)); + ServerUri = Server.PayTester.ServerUri; + } Driver.Manage().Window.Maximize(); Logs.Tester.LogInformation($"Selenium: Using {Driver.GetType()}"); - Logs.Tester.LogInformation($"Selenium: Browsing to {Server.PayTester.ServerUri}"); + Logs.Tester.LogInformation($"Selenium: Browsing to {ServerUri}"); Logs.Tester.LogInformation($"Selenium: Resolution {Driver.Manage().Window.Size}"); GoToRegister(); Driver.AssertNoError(); } - + /// + /// Use this ServerUri when trying to browse with selenium + /// Because for some reason, the selenium container can't resolve the tests container domain name + /// + public Uri ServerUri; internal IWebElement FindAlertMessage(StatusMessageModel.StatusSeverity severity = StatusMessageModel.StatusSeverity.Success) { var className = $"alert-{StatusMessageModel.ToString(severity)}"; @@ -94,7 +104,7 @@ namespace BTCPayServer.Tests public string Link(string relativeLink) { - return Server.PayTester.ServerUri.AbsoluteUri.WithoutEndingSlash() + relativeLink.WithStartingSlash(); + return ServerUri.AbsoluteUri.WithoutEndingSlash() + relativeLink.WithStartingSlash(); } public void GoToRegister() @@ -275,7 +285,7 @@ namespace BTCPayServer.Tests public void GoToHome() { - Driver.Navigate().GoToUrl(Server.PayTester.ServerUri); + Driver.Navigate().GoToUrl(ServerUri); } public void Logout() @@ -329,7 +339,7 @@ namespace BTCPayServer.Tests public void GoToLogin() { - Driver.Navigate().GoToUrl(new Uri(Server.PayTester.ServerUri, "/login")); + Driver.Navigate().GoToUrl(new Uri(ServerUri, "/login")); } public string CreateInvoice( @@ -412,7 +422,7 @@ namespace BTCPayServer.Tests public void GoToWallet(WalletId walletId = null, WalletsNavPages navPages = WalletsNavPages.Send) { walletId ??= WalletId; - Driver.Navigate().GoToUrl(new Uri(Server.PayTester.ServerUri, $"wallets/{walletId}")); + Driver.Navigate().GoToUrl(new Uri(ServerUri, $"wallets/{walletId}")); if (navPages != WalletsNavPages.Transactions) { Driver.FindElement(By.Id($"Wallet{navPages}")).Click(); @@ -421,7 +431,7 @@ namespace BTCPayServer.Tests public void GoToUrl(string relativeUrl) { - Driver.Navigate().GoToUrl(new Uri(Server.PayTester.ServerUri, relativeUrl)); + Driver.Navigate().GoToUrl(new Uri(ServerUri, relativeUrl)); } public void GoToServer(ServerNavPages navPages = ServerNavPages.Index) diff --git a/BTCPayServer.Tests/SeleniumTests.cs b/BTCPayServer.Tests/SeleniumTests.cs index b5ee0972c..7df67baad 100644 --- a/BTCPayServer.Tests/SeleniumTests.cs +++ b/BTCPayServer.Tests/SeleniumTests.cs @@ -461,7 +461,7 @@ namespace BTCPayServer.Tests s.FindAlertMessage(); Assert.Contains(pairingCode, s.Driver.PageSource); - var client = new NBitpayClient.Bitpay(new Key(), s.Server.PayTester.ServerUri); + var client = new NBitpayClient.Bitpay(new Key(), s.ServerUri); await client.AuthorizeClient(new NBitpayClient.PairingCode(pairingCode)); await client.CreateInvoiceAsync(new NBitpayClient.Invoice() { @@ -470,10 +470,10 @@ namespace BTCPayServer.Tests FullNotifications = true }, NBitpayClient.Facade.Merchant); - client = new NBitpayClient.Bitpay(new Key(), s.Server.PayTester.ServerUri); + client = new NBitpayClient.Bitpay(new Key(), s.ServerUri); var code = await client.RequestClientAuthorizationAsync("hehe", NBitpayClient.Facade.Merchant); - s.Driver.Navigate().GoToUrl(code.CreateLink(s.Server.PayTester.ServerUri)); + s.Driver.Navigate().GoToUrl(code.CreateLink(s.ServerUri)); s.Driver.FindElement(By.Id("ApprovePairing")).Click(); await client.CreateInvoiceAsync(new NBitpayClient.Invoice() diff --git a/BTCPayServer.Tests/docker-compose.altcoins.yml b/BTCPayServer.Tests/docker-compose.altcoins.yml index f8d274ffe..99eb442c6 100644 --- a/BTCPayServer.Tests/docker-compose.altcoins.yml +++ b/BTCPayServer.Tests/docker-compose.altcoins.yml @@ -34,6 +34,7 @@ services: - "80" links: - dev + - selenium extra_hosts: - "tests:127.0.0.1" volumes: @@ -83,6 +84,10 @@ services: - postgres - customer_lnd - merchant_lnd + selenium: + image: selenium/standalone-chrome:3 + expose: + - "4444" nbxplorer: image: nicolasdorier/nbxplorer:2.2.7 restart: unless-stopped diff --git a/BTCPayServer.Tests/docker-compose.yml b/BTCPayServer.Tests/docker-compose.yml index 7c84fbcb4..734653295 100644 --- a/BTCPayServer.Tests/docker-compose.yml +++ b/BTCPayServer.Tests/docker-compose.yml @@ -32,6 +32,7 @@ services: - "80" links: - dev + - selenium extra_hosts: - "tests:127.0.0.1" volumes: @@ -80,6 +81,10 @@ services: - postgres - customer_lnd - merchant_lnd + selenium: + image: selenium/standalone-chrome:3 + expose: + - "4444" nbxplorer: image: nicolasdorier/nbxplorer:2.2.7 restart: unless-stopped