import ./make-test-python.nix (
  { pkgs, ... }:
  let
    certs = import ./common/acme/server/snakeoil-certs.nix;
    inherit (certs) domain;
  in
  {
    name = "canaille";
    meta.maintainers = with pkgs.lib.maintainers; [ erictapen ];

    nodes.server =
      { pkgs, lib, ... }:
      {
        services.canaille = {
          enable = true;
          secretKeyFile = pkgs.writeText "canaille-secret-key" ''
            this is not a secret key
          '';
          settings = {
            SERVER_NAME = domain;
          };
        };

        services.nginx.virtualHosts."${domain}" = {
          enableACME = lib.mkForce false;
          sslCertificate = certs."${domain}".cert;
          sslCertificateKey = certs."${domain}".key;
        };

        networking.hosts."::1" = [ "${domain}" ];
        networking.firewall.allowedTCPPorts = [
          80
          443
        ];

        users.users.canaille.shell = pkgs.bashInteractive;

        security.pki.certificateFiles = [ certs.ca.cert ];
      };

    nodes.client =
      { nodes, ... }:
      {
        networking.hosts."${nodes.server.networking.primaryIPAddress}" = [ "${domain}" ];
        security.pki.certificateFiles = [ certs.ca.cert ];
      };

    testScript =
      { ... }:
      ''
        import json

        start_all()
        server.wait_for_unit("canaille.socket")
        server.wait_until_succeeds("curl -f https://${domain}")
        server.succeed("sudo -iu canaille -- canaille create user --user-name admin --password adminpass --emails admin@${domain}")
        json_str = server.succeed("sudo -iu canaille -- canaille get user")
        assert json.loads(json_str)[0]["user_name"] == "admin"
        server.succeed("sudo -iu canaille -- canaille check")
      '';
  }
)
