133 lines
5.3 KiB
Nix
133 lines
5.3 KiB
Nix
import ./make-test-python.nix ({ pkgs, lib, buildDeps ? [ ], pythonEnv ? [ ], ... }:
|
|
|
|
/*
|
|
This test suite replaces the typical pytestCheckHook function in python
|
|
packages. Pgadmin4 test suite needs a running and configured postgresql
|
|
server. This is why this test exists.
|
|
|
|
To not repeat all the python dependencies needed, this test is called directly
|
|
from the pgadmin4 derivation, which also passes the currently
|
|
used propagatedBuildInputs and any python overrides.
|
|
|
|
Unfortunately, there doesn't seem to be an easy way to otherwise include
|
|
the needed packages here.
|
|
|
|
Due the the needed parameters a direct call to "nixosTests.pgadmin4" fails
|
|
and needs to be called as "pgadmin4.tests"
|
|
|
|
*/
|
|
|
|
let
|
|
pgadmin4SrcDir = "/pgadmin";
|
|
pgadmin4Dir = "/var/lib/pgadmin";
|
|
pgadmin4LogDir = "/var/log/pgadmin";
|
|
|
|
in
|
|
{
|
|
name = "pgadmin4";
|
|
meta.maintainers = with lib.maintainers; [ gador ];
|
|
|
|
nodes.machine = { pkgs, ... }: {
|
|
imports = [ ./common/x11.nix ];
|
|
# needed because pgadmin 6.8 will fail, if those dependencies get updated
|
|
nixpkgs.overlays = [
|
|
(self: super: {
|
|
pythonPackages = pythonEnv;
|
|
})
|
|
];
|
|
|
|
environment.systemPackages = with pkgs; [
|
|
pgadmin4
|
|
postgresql
|
|
chromedriver
|
|
chromium
|
|
# include the same packages as in pgadmin minus speaklater3
|
|
(python3.withPackages
|
|
(ps: buildDeps ++
|
|
[
|
|
# test suite package requirements
|
|
pythonPackages.testscenarios
|
|
pythonPackages.selenium
|
|
])
|
|
)
|
|
];
|
|
services.postgresql = {
|
|
enable = true;
|
|
authentication = ''
|
|
host all all localhost trust
|
|
'';
|
|
ensureUsers = [
|
|
{
|
|
name = "postgres";
|
|
ensurePermissions = {
|
|
"DATABASE \"postgres\"" = "ALL PRIVILEGES";
|
|
};
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
machine.wait_for_unit("postgresql")
|
|
|
|
# pgadmin4 needs its data and log directories
|
|
machine.succeed(
|
|
"mkdir -p ${pgadmin4Dir} \
|
|
&& mkdir -p ${pgadmin4LogDir} \
|
|
&& mkdir -p ${pgadmin4SrcDir}"
|
|
)
|
|
|
|
machine.succeed(
|
|
"tar xvzf ${pkgs.pgadmin4.src} -C ${pgadmin4SrcDir}"
|
|
)
|
|
|
|
machine.wait_for_file("${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/README.md")
|
|
|
|
# set paths and config for tests
|
|
machine.succeed(
|
|
"cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version} \
|
|
&& cp -v web/regression/test_config.json.in web/regression/test_config.json \
|
|
&& sed -i 's|PostgreSQL 9.4|PostgreSQL|' web/regression/test_config.json \
|
|
&& sed -i 's|/opt/PostgreSQL/9.4/bin/|${pkgs.postgresql}/bin|' web/regression/test_config.json \
|
|
&& sed -i 's|\"headless_chrome\": false|\"headless_chrome\": true|' web/regression/test_config.json"
|
|
)
|
|
|
|
# adapt chrome config to run within a sandbox without GUI
|
|
# see https://stackoverflow.com/questions/50642308/webdriverexception-unknown-error-devtoolsactiveport-file-doesnt-exist-while-t#50642913
|
|
# add chrome binary path. use spaces to satisfy python indention (tabs throw an error)
|
|
# this works for selenium 3 (currently used), but will need to be updated
|
|
# to work with "from selenium.webdriver.chrome.service import Service" in selenium 4
|
|
machine.succeed(
|
|
"cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version} \
|
|
&& sed -i '\|options.add_argument(\"--disable-infobars\")|a \ \ \ \ \ \ \ \ options.binary_location = \"${pkgs.chromium}/bin/chromium\"' web/regression/runtests.py \
|
|
&& sed -i '\|options.add_argument(\"--no-sandbox\")|a \ \ \ \ \ \ \ \ options.add_argument(\"--headless\")' web/regression/runtests.py \
|
|
&& sed -i '\|options.add_argument(\"--disable-infobars\")|a \ \ \ \ \ \ \ \ options.add_argument(\"--disable-dev-shm-usage\")' web/regression/runtests.py \
|
|
&& sed -i 's|(chrome_options=options)|(executable_path=\"${pkgs.chromedriver}/bin/chromedriver\", chrome_options=options)|' web/regression/runtests.py \
|
|
&& sed -i 's|driver_local.maximize_window()||' web/regression/runtests.py"
|
|
)
|
|
|
|
# Don't bother to test LDAP or kerberos authentication
|
|
with subtest("run browser test"):
|
|
machine.succeed(
|
|
'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
|
|
&& python regression/runtests.py \
|
|
--pkg browser \
|
|
--exclude browser.tests.test_ldap_login.LDAPLoginTestCase,browser.tests.test_ldap_login,browser.tests.test_kerberos_with_mocking'
|
|
)
|
|
|
|
# fontconfig is necessary for chromium to run
|
|
# https://github.com/NixOS/nixpkgs/issues/136207
|
|
with subtest("run feature test"):
|
|
machine.succeed(
|
|
'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
|
|
&& export FONTCONFIG_FILE=${pkgs.makeFontsConf { fontDirectories = [];}} \
|
|
&& python regression/runtests.py --pkg feature_tests'
|
|
)
|
|
|
|
with subtest("run resql test"):
|
|
machine.succeed(
|
|
'cd ${pgadmin4SrcDir}/pgadmin4-${pkgs.pgadmin4.version}/web \
|
|
&& python regression/runtests.py --pkg resql'
|
|
)
|
|
'';
|
|
})
|