1{ pkgs, lib, ... }:
2let
3 listenAddress = "127.0.0.1";
4 listenPort = 7700;
5 apiUrl = "http://${listenAddress}:${toString listenPort}";
6 uid = "movies";
7 indexJSON = pkgs.writeText "index.json" (builtins.toJSON { inherit uid; });
8 moviesJSON = pkgs.fetchurl {
9 url = "https://github.com/meilisearch/meilisearch/raw/v0.23.1/datasets/movies/movies.json";
10 sha256 = "1r3srld63dpmg9yrmysm6xl175661j5cspi93mk5q2wf8xwn50c5";
11 };
12in
13{
14 name = "meilisearch";
15 meta.maintainers = with lib.maintainers; [ Br1ght0ne ];
16
17 nodes.machine =
18 { ... }:
19 {
20 environment.systemPackages = with pkgs; [
21 curl
22 jq
23 ];
24 services.meilisearch = {
25 enable = true;
26 inherit listenAddress listenPort;
27 };
28 };
29
30 testScript = ''
31 import json
32
33 start_all()
34
35 machine.wait_for_unit("meilisearch")
36 machine.wait_for_open_port(7700)
37
38 def wait_task(cmd):
39 response = json.loads(machine.succeed(cmd))
40 task_uid = response["taskUid"]
41 machine.wait_until_succeeds(
42 f"curl ${apiUrl}/tasks/{task_uid} | jq -e '.status | IN(\"succeeded\", \"failed\", \"canceled\")'"
43 )
44 machine.succeed(f"curl ${apiUrl}/tasks/{task_uid} | jq -e '.status == \"succeeded\"'")
45 return response
46
47 with subtest("check version"):
48 version = json.loads(machine.succeed("curl ${apiUrl}/version"))
49 assert version["pkgVersion"] == "${pkgs.meilisearch.version}"
50
51 with subtest("create index"):
52 wait_task("curl -X POST -H 'Content-Type: application/json' ${apiUrl}/indexes --data @${indexJSON}")
53 indexes = json.loads(machine.succeed("curl ${apiUrl}/indexes"))
54 assert indexes["total"] == 1, "index wasn't created"
55
56 with subtest("add documents"):
57 wait_task("curl -X POST -H 'Content-Type: application/json' ${apiUrl}/indexes/${uid}/documents --data-binary @${moviesJSON}")
58
59 with subtest("search"):
60 response = json.loads(
61 machine.succeed("curl ${apiUrl}/indexes/movies/search?q=hero")
62 )
63 print(response)
64 assert len(response["hits"]) >= 1, "no results found"
65 '';
66}