summaryrefslogtreecommitdiffstats
path: root/nixos/tests/scrutiny.nix
blob: 6e96b938ff9c1bf4fef5eac4e3e7142f987acd00 (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
{ lib, ... }:

{
  name = "scrutiny";
  meta.maintainers = [ ];

  nodes = {
    machine =
      {
        self,
        pkgs,
        lib,
        ...
      }:
      {
        services = {
          scrutiny = {
            enable = true;
            settings = {
              notify.urls = [
                {
                  _secret = pkgs.writeText "notify-script" "script://${pkgs.writeShellScript "touch-test-file" ''
                    echo "HelloWorld" > /run/scrutiny/hello
                  ''}";
                }
              ];
            };
          };
          scrutiny.collector.enable = true;
        };

        environment.systemPackages =
          let
            seleniumScript =
              pkgs.writers.writePython3Bin "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
                  from selenium.webdriver.support import expected_conditions as EC

                  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://localhost:8080/web/dashboard")

                  wait = WebDriverWait(driver, 10).until(
                    EC.text_to_be_present_in_element(
                      (By.TAG_NAME, "body"), "Drive health at a glance")
                  )

                  body_text = driver.find_element(By.TAG_NAME, "body").text
                  assert "Temperature history for each device" in body_text

                  driver.close()
                '';
          in
          with pkgs;
          [
            curl
            firefox-unwrapped
            geckodriver
            seleniumScript
          ];
      };
  };
  # This is the test code that will check if our service is running correctly:
  testScript = ''
    start_all()

    # Wait for Scrutiny to be available
    machine.wait_for_unit("scrutiny")
    machine.wait_for_open_port(8080)

    # Ensure the API responds as we expect
    output = machine.succeed("curl localhost:8080/api/health")
    assert output == '{"success":true}'

    # Start the collector service to send some metrics
    collect = machine.succeed("systemctl start scrutiny-collector.service")

    # Ensure the application is actually rendered by the Javascript
    machine.succeed("PYTHONUNBUFFERED=1 selenium-script")

    # Test notification and genJqSecretsReplacementSnippet
    machine.succeed("curl -X POST http://localhost:8080/api/health/notify")
    machine.wait_for_file("/run/scrutiny/hello")
    output = machine.succeed("cat /run/scrutiny/hello")
    assert "HelloWorld" in output
  '';
}