diff --git a/nixos-modules/cloud/test.nix b/nixos-modules/cloud/test.nix new file mode 100644 index 0000000..386dcba --- /dev/null +++ b/nixos-modules/cloud/test.nix @@ -0,0 +1,36 @@ +{ + ... +}: +{ + # Note: This extends the default configuration from ${self}/checks/nixos-modules + nodes.webserver = + { pkgs, lib, ... }: + let + inherit (pkgs) curl gnugrep; + inherit (lib) mkForce; + cloud-domain = "cloud.example.com"; + in + { + qois.cloud = { + enable = true; + domain = cloud-domain; + package = pkgs.nextcloud31; + adminpassFile = "${pkgs.writeText "adminpass" "insecure"}"; # Don't try this at home! + }; + + qois.postgresql.package = pkgs.postgresql; + sops.secrets = mkForce { }; + + # Disable TLS services + services.nginx.virtualHosts."${cloud-domain}" = { + forceSSL = mkForce false; + enableACME = mkForce false; + }; + + # Test environment + environment.systemPackages = [ + curl + gnugrep + ]; + }; +} diff --git a/nixos-modules/cloud/test.py b/nixos-modules/cloud/test.py new file mode 100644 index 0000000..5e484b9 --- /dev/null +++ b/nixos-modules/cloud/test.py @@ -0,0 +1,34 @@ +def test(subtest, webserver): + webserver.wait_for_unit("nginx") + webserver.wait_for_open_port(80) + webserver.wait_for_unit("nextcloud-setup.service") + webserver.wait_for_unit("phpfpm-nextcloud.service") + + # Helpers + def curl_variable_test(node, variable, expected, url): + value = node.succeed( + f"curl -s --no-location -o /dev/null -w '%{{{variable}}}' '{url}'" + ) + assert value == expected, ( + f"expected {variable} to be '{expected}' but got '{value}'" + ) + + def expect_http_code(node, code, url): + curl_variable_test(node, "http_code", code, url) + + def expect_http_content_contains(node, expectedContentSnippet, url): + content = node.succeed(f"curl --no-location --silent '{url}'") + assert expectedContentSnippet in content, f""" + expected in content: + {expectedContentSnippet} + at {url} but got following content: + {content} + """ + + # Tests + with subtest("website is successfully served on cloud.example.com"): + webserver.succeed("grep cloud.example.com /etc/hosts") + expect_http_code(webserver, "200", "http://cloud.example.com") + expect_http_content_contains( + webserver, "Log in to cloud.qoo.is", "http://docs.example.com" + )