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