From a6cdf3f0f059f594dc3bf18647938423aa4a18aa Mon Sep 17 00:00:00 2001 From: Litchi Pi Date: Wed, 23 Jul 2025 13:51:56 +0200 Subject: [PATCH] Add API tests for mealie Signed-off-by: Litchi Pi --- nixos/tests/mealie.nix | 72 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/nixos/tests/mealie.nix b/nixos/tests/mealie.nix index 97dd4d048f48..3cb8fa23857b 100644 --- a/nixos/tests/mealie.nix +++ b/nixos/tests/mealie.nix @@ -15,6 +15,7 @@ services.mealie = { enable = true; port = 9001; + settings.ALLOW_SIGNUP = "true"; }; }; postgres = { @@ -27,16 +28,83 @@ }; testScript = '' - start_all() + import json + import urllib.parse + + def api_get(node, path, qry={}, **headers): + url = f"http://localhost:9001/api{path}" + if len(qry) > 0: + url += "?" + "&".join([f"{k}={urllib.parse.quote(v)}" for k, v in qry.items()]) + + headers = " ".join([f"-H '{k}: {str(v)}'" for k, v in headers.items()]) + + got = node.succeed(f"curl -s -X GET {headers} --fail {url}") + print(f"* GET {path}\n{got}") + return json.loads(got) + + def api_post(node, path, method="POST", urlencode=False, body={}, qry={}, **headers): + url = f"http://localhost:9001/api{path}" + if len(qry) > 0: + url += "?" + "&".join([f"{k}={urllib.parse.quote(v)}" for k, v in qry.items()]) + + if urlencode: + headers["Content-Type"] = "application/x-www-form-urlencoded" + print("BODY", body) + body = "&".join([f"{k}={urllib.parse.quote(str(v))}" for k, v in body.items()]) + else: + headers["Content-Type"] = "application/json" + body = json.dumps(body) + + headers["Accept"] = "application/json" + headers = " ".join([f"-H '{k}: {str(v)}'" for k, v in headers.items()]) + + got = node.succeed(f"curl -v --fail -X {method} {url} {headers} -d '{body}'") + print(f"* POST {path}\n{got}") + return json.loads(got) def test_mealie(node): node.wait_for_unit("mealie.service") node.wait_for_open_port(9001) node.succeed("curl --fail http://localhost:9001") + got = api_get(node, "/app/about") + assert got["version"] == "v${pkgs.mealie.version}" + + new_user = dict( + email=node.name + ".nomail@no.mail", + username="noname-" + node.name, + fullName="No Name" + node.name, + password="SuperSecure" + node.name, + passwordConfirm="SuperSecure" + node.name, + group="mygroup" + node.name, + ) + got = api_post(node, "/users/register", body=new_user) + got = api_post(node, "/auth/token", urlencode=True, body={ + "username": new_user["username"], + "password": new_user["password"], + "remember_me": False, + }) + assert "access_token" in got + token = "Bearer " + got["access_token"] + + got = api_get(node, "/recipes", authorization=token) + assert got["total"] == 0 + + slug = api_post(node, "/recipes", body={"name": "TestRecipe"}, authorization=token) + recipe = { "description": "Test recipe" } + got = api_post(node, f"/recipes/{slug}", body=recipe, method="PATCH", authorization=token) + got = api_get(node, "/recipes", authorization=token) + assert got["total"] > 0 + assert got["items"][0]["description"] == recipe["description"] + + postgres.start() + test_mealie(postgres) + postgres.send_monitor_command("quit") + postgres.wait_for_shutdown() + + sqlite.start() test_mealie(sqlite) sqlite.send_monitor_command("quit") sqlite.wait_for_shutdown() - test_mealie(postgres) ''; }