import ./make-test-python.nix ({ pkgs, lib, ... }:

  {
    name = "shiori";
    meta.maintainers = with lib.maintainers; [ minijackson ];

    nodes.machine = { ... }: { services.shiori.enable = true; };

    testScript = let
      authJSON = pkgs.writeText "auth.json" (builtins.toJSON {
        username = "shiori";
        password = "gopher";
        owner = true;
      });

      insertBookmark = {
        url = "http://example.org";
        title = "Example Bookmark";
      };

      insertBookmarkJSON =
        pkgs.writeText "insertBookmark.json" (builtins.toJSON insertBookmark);
    in ''
      #import json

      machine.wait_for_unit("shiori.service")
      machine.wait_for_open_port(8080)
      machine.succeed("curl --fail http://localhost:8080/")
      machine.succeed("curl --fail --location http://localhost:8080/ | grep -i shiori")

      # The test code below no longer works because the API authentication has changed.

      #with subtest("login"):
      #    auth_json = machine.succeed(
      #        "curl --fail --location http://localhost:8080/api/login "
      #        "-X POST -H 'Content-Type:application/json' -d @${authJSON}"
      #    )
      #    auth_ret = json.loads(auth_json)
      #    session_id = auth_ret["session"]

      #with subtest("bookmarks"):
      #    with subtest("first use no bookmarks"):
      #        bookmarks_json = machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-H 'X-Session-Id:{}'"
      #            ).format(session_id)
      #        )

      #        if json.loads(bookmarks_json)["bookmarks"] != []:
      #            raise Exception("Shiori have a bookmark on first use")

      #    with subtest("insert bookmark"):
      #        machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-X POST -H 'X-Session-Id:{}' "
      #                "-H 'Content-Type:application/json' -d @${insertBookmarkJSON}"
      #            ).format(session_id)
      #        )

      #    with subtest("get inserted bookmark"):
      #        bookmarks_json = machine.succeed(
      #            (
      #                "curl --fail --location http://localhost:8080/api/bookmarks "
      #                "-H 'X-Session-Id:{}'"
      #            ).format(session_id)
      #        )

      #        bookmarks = json.loads(bookmarks_json)["bookmarks"]
      #        if len(bookmarks) != 1:
      #            raise Exception("Shiori didn't save the bookmark")

      #        bookmark = bookmarks[0]
      #        if (
      #            bookmark["url"] != "${insertBookmark.url}"
      #            or bookmark["title"] != "${insertBookmark.title}"
      #        ):
      #            raise Exception("Inserted bookmark doesn't have same URL or title")
    '';
  })
