import ./make-test-python.nix (
  { lib, ... }:
  {
    name = "silverbullet";
    meta.maintainers = with lib.maintainers; [ aorith ];

    nodes.simple =
      { ... }:
      {
        services.silverbullet.enable = true;
      };

    nodes.configured =
      { pkgs, ... }:
      {
        users.users.test.isNormalUser = true;
        users.groups.test = { };

        services.silverbullet = {
          enable = true;
          package = pkgs.silverbullet;
          listenPort = 3001;
          listenAddress = "localhost";
          spaceDir = "/home/test/silverbullet";
          user = "test";
          group = "test";
          envFile = pkgs.writeText "silverbullet.env" ''
            SB_USER=user:password
            SB_AUTH_TOKEN=test
          '';
          extraArgs = [
            "--reindex"
            "--db /home/test/silverbullet/custom.db"
          ];
        };
      };

    testScript =
      { nodes, ... }:
      ''
        PORT = ${builtins.toString nodes.simple.services.silverbullet.listenPort}
        ADDRESS = "${nodes.simple.services.silverbullet.listenAddress}"
        SPACEDIR = "${nodes.simple.services.silverbullet.spaceDir}"
        simple.wait_for_unit("silverbullet.service")
        simple.wait_for_open_port(PORT)
        simple.succeed(f"curl --max-time 5 -s -v -o /dev/null --fail http://{ADDRESS}:{PORT}/")
        simple.succeed(f"test -d '{SPACEDIR}'")

        PORT = ${builtins.toString nodes.configured.services.silverbullet.listenPort}
        ADDRESS = "${nodes.configured.services.silverbullet.listenAddress}"
        SPACEDIR = "${nodes.configured.services.silverbullet.spaceDir}"
        configured.wait_for_unit("silverbullet.service")
        configured.wait_for_open_port(PORT)
        assert int(configured.succeed(f"curl --max-time 5 -s -o /dev/null -w '%{{http_code}}' -XPUT -d 'test' --fail http://{ADDRESS}:{PORT}/test.md -H'Authorization: Bearer test'")) == 200
        assert int(configured.fail(f"curl --max-time 5 -s -o /dev/null -w '%{{http_code}}' -XPUT -d 'test' --fail http://{ADDRESS}:{PORT}/test.md -H'Authorization: Bearer wrong'")) == 401
        configured.succeed(f"test -d '{SPACEDIR}'")
      '';
  }
)
