Merge branch 'staging-next' into staging
[NixPkgs.git] / nixos / tests / akkoma.nix
blob2a9acd64b7c6c45a04039deb66fb46c5be12cbd0
1 /*
2   End-to-end test for Akkoma.
4   Based in part on nixos/tests/pleroma.
6   TODO: Test federation.
7 */
8 import ./make-test-python.nix ({ pkgs, package ? pkgs.akkoma, confined ? false, ... }:
9 let
10   userPassword = "4LKOrGo8SgbPm1a6NclVU5Wb";
12   provisionUser = pkgs.writers.writeBashBin "provisionUser" ''
13     set -eu -o errtrace -o pipefail
15     pleroma_ctl user new jamy jamy@nixos.test --password '${userPassword}' --moderator --admin -y
16   '';
18   tlsCert = pkgs.runCommand "selfSignedCerts" {
19     nativeBuildInputs = with pkgs; [ openssl ];
20   } ''
21     mkdir -p $out
22     openssl req -x509 \
23       -subj '/CN=akkoma.nixos.test/' -days 49710 \
24       -addext 'subjectAltName = DNS:akkoma.nixos.test' \
25       -keyout "$out/key.pem" -newkey ed25519 \
26       -out "$out/cert.pem" -noenc
27   '';
29   sendToot = pkgs.writers.writeBashBin "sendToot" ''
30     set -eu -o errtrace -o pipefail
32     export REQUESTS_CA_BUNDLE="/etc/ssl/certs/ca-certificates.crt"
34     ${pkgs.toot}/bin/toot login_cli -i "akkoma.nixos.test" -e "jamy@nixos.test" -p '${userPassword}'
35     ${pkgs.toot}/bin/toot post "hello world Jamy here"
36     ${pkgs.toot}/bin/toot timeline -1 | grep -F -q "hello world Jamy here"
38     # Test file upload
39     echo "y" | ${pkgs.toot}/bin/toot upload <(dd if=/dev/zero bs=1024 count=1024 status=none) \
40       | grep -F -q "https://akkoma.nixos.test:443/media"
41   '';
43   checkFe = pkgs.writers.writeBashBin "checkFe" ''
44     set -eu -o errtrace -o pipefail
46     paths=( / /static/{config,styles}.json /pleroma/admin/ )
48     for path in "''${paths[@]}"; do
49       diff \
50         <(${pkgs.curl}/bin/curl -f -S -s -o /dev/null -w '%{response_code}' "https://akkoma.nixos.test$path") \
51         <(echo -n 200)
52     done
53   '';
55   hosts = nodes: ''
56     ${nodes.akkoma.networking.primaryIPAddress} akkoma.nixos.test
57     ${nodes.client.networking.primaryIPAddress} client.nixos.test
58   '';
61   name = "akkoma";
62   nodes = {
63     client = { nodes, pkgs, config, ... }: {
64       security.pki.certificateFiles = [ "${tlsCert}/cert.pem" ];
65       networking.extraHosts = hosts nodes;
66     };
68     akkoma = { nodes, pkgs, config, ... }: {
69       networking.extraHosts = hosts nodes;
70       networking.firewall.allowedTCPPorts = [ 443 ];
71       environment.systemPackages = with pkgs; [ provisionUser ];
72       systemd.services.akkoma.confinement.enable = confined;
74       services.akkoma = {
75         enable = true;
76         package = package;
77         config = {
78           ":pleroma" = {
79             ":instance" = {
80               name = "NixOS test Akkoma server";
81               description = "NixOS test Akkoma server";
82               email = "akkoma@nixos.test";
83               notify_email = "akkoma@nixos.test";
84               registration_open = true;
85             };
87             ":media_proxy" = {
88               enabled = false;
89             };
91             "Pleroma.Web.Endpoint" = {
92               url.host = "akkoma.nixos.test";
93             };
94             "Pleroma.Upload" = {
95               base_url = "https://akkoma.nixos.test:443/media/";
96             };
97           };
98         };
100         nginx = {
101           addSSL = true;
102           sslCertificate = "${tlsCert}/cert.pem";
103           sslCertificateKey = "${tlsCert}/key.pem";
104         };
105       };
107       services.nginx.enable = true;
108       services.postgresql.enable = true;
109     };
110   };
112   testScript = { nodes, ... }: ''
113     start_all()
114     akkoma.wait_for_unit('akkoma-initdb.service')
115     akkoma.systemctl('restart akkoma-initdb.service')  # test repeated initialisation
116     akkoma.wait_for_unit('akkoma.service')
117     akkoma.wait_for_file('/run/akkoma/socket');
118     akkoma.succeed('${provisionUser}/bin/provisionUser')
119     akkoma.wait_for_unit('nginx.service')
120     client.succeed('${sendToot}/bin/sendToot')
121     client.succeed('${checkFe}/bin/checkFe')
122   '';