import ./make-test-python.nix (
  { pkgs, lib, ... }:
  {
    name = "hedgedoc";

    meta = with lib.maintainers; {
      maintainers = [ willibutz ];
    };

    nodes = {
      hedgedocSqlite =
        { ... }:
        {
          services.hedgedoc.enable = true;
        };

      hedgedocPostgresWithTCPSocket =
        { ... }:
        {
          systemd.services.hedgedoc.after = [ "postgresql.service" ];
          services = {
            hedgedoc = {
              enable = true;
              settings.db = {
                dialect = "postgres";
                user = "hedgedoc";
                password = "$DB_PASSWORD";
                host = "localhost";
                port = 5432;
                database = "hedgedocdb";
              };

              /*
                Do not use pkgs.writeText for secrets as
                they will end up in the world-readable Nix store.
              */
              environmentFile = pkgs.writeText "hedgedoc-env" ''
                DB_PASSWORD=snakeoilpassword
              '';
            };
            postgresql = {
              enable = true;
              initialScript = pkgs.writeText "pg-init-script.sql" ''
                CREATE ROLE hedgedoc LOGIN PASSWORD 'snakeoilpassword';
                CREATE DATABASE hedgedocdb OWNER hedgedoc;
              '';
            };
          };
        };

      hedgedocPostgresWithUNIXSocket =
        { ... }:
        {
          systemd.services.hedgedoc.after = [ "postgresql.service" ];
          services = {
            hedgedoc = {
              enable = true;
              settings.db = {
                dialect = "postgres";
                user = "hedgedoc";
                password = "$DB_PASSWORD";
                host = "/run/postgresql";
                database = "hedgedocdb";
              };

              environmentFile = pkgs.writeText "hedgedoc-env" ''
                DB_PASSWORD=snakeoilpassword
              '';
            };
            postgresql = {
              enable = true;
              initialScript = pkgs.writeText "pg-init-script.sql" ''
                CREATE ROLE hedgedoc LOGIN PASSWORD 'snakeoilpassword';
                CREATE DATABASE hedgedocdb OWNER hedgedoc;
              '';
            };
          };
        };
    };

    testScript = ''
      start_all()

      with subtest("HedgeDoc sqlite"):
          hedgedocSqlite.wait_for_unit("hedgedoc.service")
          hedgedocSqlite.wait_for_open_port(3000)
          hedgedocSqlite.wait_until_succeeds("curl -sSf http://localhost:3000/new")

      with subtest("HedgeDoc postgres with TCP socket"):
          hedgedocPostgresWithTCPSocket.wait_for_unit("postgresql.service")
          hedgedocPostgresWithTCPSocket.wait_for_unit("hedgedoc.service")
          hedgedocPostgresWithTCPSocket.wait_for_open_port(5432)
          hedgedocPostgresWithTCPSocket.wait_for_open_port(3000)
          hedgedocPostgresWithTCPSocket.wait_until_succeeds("curl -sSf http://localhost:3000/new")

      with subtest("HedgeDoc postgres with UNIX socket"):
          hedgedocPostgresWithUNIXSocket.wait_for_unit("postgresql.service")
          hedgedocPostgresWithUNIXSocket.wait_for_unit("hedgedoc.service")
          hedgedocPostgresWithUNIXSocket.wait_for_open_port(5432)
          hedgedocPostgresWithUNIXSocket.wait_for_open_port(3000)
          hedgedocPostgresWithUNIXSocket.wait_until_succeeds("curl -sSf http://localhost:3000/new")
    '';
  }
)
