nixpkgs/nixos/tests/clickhouse/ui.nix
2025-10-25 14:55:43 +01:00

119 lines
3.4 KiB
Nix

{
lib,
pkgs,
package,
...
}:
{
name = "clickhouse-ui";
nodes = {
browser =
{
config,
pkgs,
...
}:
{
environment.systemPackages =
let
clickhouseSeleniumScript =
pkgs.writers.writePython3Bin "clickhouse-selenium-script"
{
libraries = with pkgs.python3Packages; [ selenium ];
}
''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
options = Options()
options.add_argument("--headless")
service = webdriver.FirefoxService(executable_path="${lib.getExe pkgs.geckodriver}") # noqa: E501
driver = webdriver.Firefox(options=options, service=service)
driver.implicitly_wait(10)
driver.get("http://clickhouse:8123/play")
wait = WebDriverWait(driver, 60)
assert len(driver.find_elements(
By.ID, "query_div")) == 1
server_info_element = driver.find_element(
By.XPATH, "//span[@id='server_info']")
assert "${
lib.strings.replaceStrings [ "-stable" "-lts" ] [ "" "" ] package.version
}" in server_info_element.text
# Shouldn't show before query done
assert len(driver.find_elements(
By.CSS_SELECTOR, ".row-number")) == 0
query_box = driver.find_element(
By.XPATH, "//textarea[@id='query']")
query_box.click()
query_box.send_keys("SELECT 1")
query_run_button = driver.find_element(
By.XPATH, "//button[@id='run']").click()
# Now verify results shown
assert len(driver.find_elements(
By.XPATH, "//div[@id='check-mark']")) == 1
assert len(driver.find_elements(
By.CSS_SELECTOR, ".row-number")) == 2
driver.close()
'';
in
with pkgs;
[
curl
firefox-unwrapped
geckodriver
clickhouseSeleniumScript
];
};
clickhouse =
{ config, pkgs, ... }:
{
networking.firewall.allowedTCPPorts = [
8123
9000
];
environment.etc = {
"clickhouse-server/config.d/listen.xml".text = ''
<clickhouse>
<listen_host>::</listen_host>
</clickhouse>
'';
};
services.clickhouse = {
enable = true;
inherit package;
};
};
};
testScript = ''
clickhouse.wait_for_unit("clickhouse")
clickhouse.wait_for_open_port(8123)
clickhouse.wait_for_open_port(9000)
browser.systemctl("start network-online.target")
browser.wait_for_unit("network-online.target")
browser.succeed("curl -kLs http://clickhouse:8123/play | grep 'ClickHouse Query'")
# Ensure the application is actually rendered by the Javascript
browser.succeed("PYTHONUNBUFFERED=1 clickhouse-selenium-script")
'';
}