1import ./make-test-python.nix (
2 { lib, ... }:
3 {
4 name = "paperless";
5 meta.maintainers = with lib.maintainers; [
6 leona
7 SuperSandro2000
8 erikarvstedt
9 ];
10
11 nodes =
12 let
13 self = {
14 simple =
15 { pkgs, ... }:
16 {
17 environment.systemPackages = with pkgs; [
18 imagemagick
19 jq
20 ];
21 services.paperless = {
22 enable = true;
23 passwordFile = builtins.toFile "password" "admin";
24
25 exporter = {
26 enable = true;
27
28 settings = {
29 "no-color" = lib.mkForce false; # override a default option
30 "no-thumbnail" = true; # add a new option
31 };
32 };
33 };
34 };
35 postgres =
36 { config, pkgs, ... }:
37 {
38 imports = [ self.simple ];
39 services.paperless.database.createLocally = true;
40 services.paperless.settings = {
41 PAPERLESS_OCR_LANGUAGE = "deu";
42 };
43 };
44 };
45 in
46 self;
47
48 testScript = ''
49 import json
50
51 def test_paperless(node):
52 node.wait_for_unit("paperless-consumer.service")
53
54 with subtest("Add a document via the file system"):
55 node.succeed(
56 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
57 "-annotate +5+20 'hello world 16-10-2005' /var/lib/paperless/consume/doc.png"
58 )
59
60 with subtest("Web interface gets ready"):
61 node.wait_for_unit("paperless-web.service")
62 # Wait until server accepts connections
63 node.wait_until_succeeds("curl -fs localhost:28981")
64
65 # Required for consuming documents via the web interface
66 with subtest("Task-queue gets ready"):
67 node.wait_for_unit("paperless-task-queue.service")
68
69 with subtest("Add a png document via the web interface"):
70 node.succeed(
71 "convert -size 400x40 xc:white -font 'DejaVu-Sans' -pointsize 20 -fill black "
72 "-annotate +5+20 'hello web 16-10-2005' /tmp/webdoc.png"
73 )
74 node.wait_until_succeeds("curl -u admin:admin -F document=@/tmp/webdoc.png -fs localhost:28981/api/documents/post_document/")
75
76 with subtest("Add a txt document via the web interface"):
77 node.succeed(
78 "echo 'hello web 16-10-2005' > /tmp/webdoc.txt"
79 )
80 node.wait_until_succeeds("curl -u admin:admin -F document=@/tmp/webdoc.txt -fs localhost:28981/api/documents/post_document/")
81
82 with subtest("Documents are consumed"):
83 node.wait_until_succeeds(
84 "(($(curl -u admin:admin -fs localhost:28981/api/documents/ | jq .count) == 3))"
85 )
86 docs = json.loads(node.succeed("curl -u admin:admin -fs localhost:28981/api/documents/"))['results']
87 assert "2005-10-16" in docs[0]['created']
88 assert "2005-10-16" in docs[1]['created']
89 assert "2005-10-16" in docs[2]['created']
90
91 # Detects gunicorn issues, see PR #190888
92 with subtest("Document metadata can be accessed"):
93 metadata = json.loads(node.succeed("curl -u admin:admin -fs localhost:28981/api/documents/1/metadata/"))
94 assert "original_checksum" in metadata
95
96 metadata = json.loads(node.succeed("curl -u admin:admin -fs localhost:28981/api/documents/2/metadata/"))
97 assert "original_checksum" in metadata
98
99 metadata = json.loads(node.succeed("curl -u admin:admin -fs localhost:28981/api/documents/3/metadata/"))
100 assert "original_checksum" in metadata
101
102 with subtest("Exporter"):
103 node.succeed("systemctl start --wait paperless-exporter")
104 node.wait_for_unit("paperless-web.service")
105 node.wait_for_unit("paperless-consumer.service")
106 node.wait_for_unit("paperless-scheduler.service")
107 node.wait_for_unit("paperless-task-queue.service")
108
109 node.succeed("ls -lah /var/lib/paperless/export/manifest.json")
110
111 timers = node.succeed("systemctl list-timers paperless-exporter")
112 print(timers)
113 assert "paperless-exporter.timer paperless-exporter.service" in timers, "missing timer"
114 assert "1 timers listed." in timers, "incorrect number of timers"
115
116 # Double check that our attrset option override works as expected
117 cmdline = node.succeed("grep 'paperless-manage' $(systemctl cat paperless-exporter | grep ExecStart | cut -f 2 -d=)")
118 print(f"Exporter command line {cmdline!r}")
119 assert cmdline.strip() == "paperless-manage document_exporter /var/lib/paperless/export --compare-checksums --delete --no-progress-bar --no-thumbnail", "Unexpected exporter command line"
120
121 test_paperless(simple)
122 simple.send_monitor_command("quit")
123 simple.wait_for_shutdown()
124 test_paperless(postgres)
125 '';
126 }
127)