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

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

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

  testScript = let
    authJSON = pkgs.writeText "auth.json" (builtins.toJSON {
      username = "shiori";
      password = "gopher";
      remember = 1; # hour
      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")

    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")
  '';
})