summaryrefslogtreecommitdiffstats
path: root/nixos/tests/opencloud.nix
blob: 25bd5295f68c98443252360cf56d485f771b0563 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{ lib, pkgs, ... }:

let
  certs = import ./common/acme/server/snakeoil-certs.nix;
  inherit (certs) domain;

  # this is a demo user created by IDM_CREATE_DEMO_USERS=true
  demoUser = "alan";
  demoPassword = "demo";

  adminUser = "admin";
  adminPassword = "hunter2";
  testRunner =
    pkgs.writers.writePython3Bin "test-runner"
      {
        libraries = [ pkgs.python3Packages.selenium ];
        flakeIgnore = [ "E501" ];
      }
      ''
        import sys
        from selenium.webdriver.common.by import By
        from selenium.webdriver import Firefox
        from selenium.webdriver.firefox.options import Options
        from selenium.webdriver.firefox.service import Service
        from selenium.webdriver.support.ui import WebDriverWait
        from selenium.webdriver.support import expected_conditions as EC

        options = Options()
        options.add_argument('--headless')
        service = Service(executable_path="${lib.getExe pkgs.geckodriver}")
        driver = Firefox(options=options, service=service)

        host = sys.argv[1]
        user = sys.argv[2]
        password = sys.argv[3]

        driver.get(f"https://{host}/")
        wait = WebDriverWait(driver, 60)
        wait.until(EC.title_contains("Sign in"))
        wait.until(EC.url_contains(f"https://{host}/signin/v1/identifier"))
        wait.until(EC.visibility_of_element_located((By.ID, 'oc-login-username')))
        driver.find_element(By.ID, 'oc-login-username').send_keys(user)
        driver.find_element(By.ID, 'oc-login-password').send_keys(password)
        wait.until(EC.visibility_of_element_located((By.XPATH, '//button[@type="submit"]')))
        driver.find_element(By.XPATH, '//button[@type="submit"]').click()
        wait.until(EC.visibility_of_element_located((By.ID, 'app-floating-action-button-com-github-opencloud-eu-web-files-floating-action-button')))
        wait.until(EC.title_contains("Personal"))
      '';
in

{
  name = "opencloud";

  meta.maintainers = with lib.maintainers; [
    christoph-heiss
    k900
  ];

  nodes.machine = {
    virtualisation.memorySize = 2048;
    environment.systemPackages = [
      pkgs.firefox-unwrapped
      pkgs.geckodriver
      testRunner
    ];

    networking.hosts."127.0.0.1" = [ domain ];
    security.pki.certificateFiles = [ certs.ca.cert ];

    services.opencloud = {
      enable = true;
      url = "https://${domain}:9200";
      environment = {
        ADMIN_PASSWORD = adminPassword;
        IDM_CREATE_DEMO_USERS = "true";
        IDM_LDAPS_ADDR = "127.0.0.1:9235";
        IDM_LDAPS_CERT = "${certs.${domain}.cert}";
        IDM_LDAPS_KEY = "${certs.${domain}.key}";
        OC_INSECURE = "false";
        OC_LDAP_URI = "ldaps://${domain}:9235";
        OC_LDAP_CACERT = "${certs.${domain}.cert}";
        OC_HTTP_TLS_ENABLED = "true";
        OC_HTTP_TLS_CERTIFICATE = "${certs.${domain}.cert}";
        OC_HTTP_TLS_KEY = "${certs.${domain}.key}";
        PROXY_TLS = "true";
        PROXY_TRANSPORT_TLS_CERT = "${certs.${domain}.cert}";
        PROXY_TRANSPORT_TLS_KEY = "${certs.${domain}.key}";
        PROXY_INSECURE_BACKENDS = "true";
      };
    };
  };

  testScript = ''
    start_all()
    machine.wait_for_unit("opencloud.service")
    machine.wait_for_open_port(9200)

    # wait for OpenCloud to fully come up
    machine.sleep(10)

    with subtest("opencloud bin works"):
        machine.succeed("${lib.getExe pkgs.opencloud} version")

    with subtest("web interface presents start page"):
        machine.succeed("curl -sSf https://${domain}:9200 | grep '<title>OpenCloud</title>'")

    with subtest("use the web interface to log in with the provisioned admin user"):
        machine.succeed("PYTHONUNBUFFERED=1 systemd-cat -t test-runner test-runner ${domain}:9200 ${adminUser} ${adminPassword}")

    with subtest("use the web interface to log in with a demo user"):
        machine.succeed("PYTHONUNBUFFERED=1 systemd-cat -t test-runner test-runner ${domain}:9200 ${demoUser} ${demoPassword}")
  '';
}