import ./make-test-python.nix ({ lib, pkgs, ... }:
let
  gpgKeyring = (pkgs.runCommand "gpg-keyring" { buildInputs = [ pkgs.gnupg ]; } ''
    mkdir -p $out
    export GNUPGHOME=$out
    cat > foo <<EOF
      %echo Generating a basic OpenPGP key
      %no-protection
      Key-Type: DSA
      Key-Length: 1024
      Subkey-Type: ELG-E
      Subkey-Length: 1024
      Name-Real: Foo Example
      Name-Email: foo@example.org
      Expire-Date: 0
      # Do a commit here, so that we can later print "done"
      %commit
      %echo done
    EOF
    gpg --batch --generate-key foo
    rm $out/S.gpg-agent $out/S.gpg-agent.*
  '');
in {
  name = "hockeypuck";
  meta.maintainers = with lib.maintainers; [ etu ];

  nodes.machine = { ... }: {
    # Used for test
    environment.systemPackages = [ pkgs.gnupg ];

    services.hockeypuck.enable = true;

    services.postgresql = {
      enable = true;
      ensureDatabases = [ "hockeypuck" ];
      ensureUsers = [{
        name = "hockeypuck";
        ensurePermissions."DATABASE hockeypuck" = "ALL PRIVILEGES";
      }];
    };
  };

  testScript = ''
    machine.wait_for_unit("hockeypuck.service")
    machine.wait_for_open_port(11371)

    response = machine.succeed("curl -vvv -s http://127.0.0.1:11371/")

    assert "<title>OpenPGP Keyserver</title>" in response, "HTML title not found"

    # Copy the keyring
    machine.succeed("cp -R ${gpgKeyring} /tmp/GNUPGHOME")

    # Extract our GPG key id
    keyId = machine.succeed("GNUPGHOME=/tmp/GNUPGHOME gpg --list-keys | grep dsa1024 --after-context=1 | grep -v dsa1024").strip()

    # Send the key to our local keyserver
    machine.succeed("GNUPGHOME=/tmp/GNUPGHOME gpg --keyserver hkp://127.0.0.1:11371 --send-keys " + keyId)

    # Recieve the key from our local keyserver to a separate directory
    machine.succeed("GNUPGHOME=$(mktemp -d) gpg --keyserver hkp://127.0.0.1:11371 --recv-keys " + keyId)
  '';
})