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