python310Packages.pydeconz: 104 -> 105
[NixPkgs.git] / nixos / tests / web-apps / mastodon.nix
blob279a1c59169fa2da508d0226b190dfdc6d989e11
1 import ../make-test-python.nix ({pkgs, ...}:
2 let
3   test-certificates = pkgs.runCommandLocal "test-certificates" { } ''
4     mkdir -p $out
5     echo insecure-root-password > $out/root-password-file
6     echo insecure-intermediate-password > $out/intermediate-password-file
7     ${pkgs.step-cli}/bin/step certificate create "Example Root CA" $out/root_ca.crt $out/root_ca.key --password-file=$out/root-password-file --profile root-ca
8     ${pkgs.step-cli}/bin/step certificate create "Example Intermediate CA 1" $out/intermediate_ca.crt $out/intermediate_ca.key --password-file=$out/intermediate-password-file --ca-password-file=$out/root-password-file --profile intermediate-ca --ca $out/root_ca.crt --ca-key $out/root_ca.key
9   '';
11   hosts = ''
12     192.168.2.10 ca.local
13     192.168.2.11 mastodon.local
14   '';
18   name = "mastodon";
19   meta.maintainers = with pkgs.lib.maintainers; [ erictapen izorkin ];
21   nodes = {
22     ca = { pkgs, ... }: {
23       networking = {
24         interfaces.eth1 = {
25           ipv4.addresses = [
26             { address = "192.168.2.10"; prefixLength = 24; }
27           ];
28         };
29         extraHosts = hosts;
30       };
31       services.step-ca = {
32         enable = true;
33         address = "0.0.0.0";
34         port = 8443;
35         openFirewall = true;
36         intermediatePasswordFile = "${test-certificates}/intermediate-password-file";
37         settings = {
38           dnsNames = [ "ca.local" ];
39           root = "${test-certificates}/root_ca.crt";
40           crt = "${test-certificates}/intermediate_ca.crt";
41           key = "${test-certificates}/intermediate_ca.key";
42           db = {
43             type = "badger";
44             dataSource = "/var/lib/step-ca/db";
45           };
46           authority = {
47             provisioners = [
48               {
49                 type = "ACME";
50                 name = "acme";
51               }
52             ];
53           };
54         };
55       };
56     };
58     server = { pkgs, ... }: {
59       networking = {
60         interfaces.eth1 = {
61           ipv4.addresses = [
62             { address = "192.168.2.11"; prefixLength = 24; }
63           ];
64         };
65         extraHosts = hosts;
66         firewall.allowedTCPPorts = [ 80 443 ];
67       };
69       security = {
70         acme = {
71           acceptTerms = true;
72           defaults.server = "https://ca.local:8443/acme/acme/directory";
73           defaults.email = "mastodon@mastodon.local";
74         };
75         pki.certificateFiles = [ "${test-certificates}/root_ca.crt" ];
76       };
78       services.redis.servers.mastodon = {
79         enable = true;
80         bind = "127.0.0.1";
81         port = 31637;
82       };
84       services.mastodon = {
85         enable = true;
86         configureNginx = true;
87         localDomain = "mastodon.local";
88         enableUnixSocket = false;
89         redis = {
90           createLocally = true;
91           host = "127.0.0.1";
92           port = 31637;
93         };
94         database = {
95           createLocally = true;
96           host = "/run/postgresql";
97           port = 5432;
98         };
99         smtp = {
100           createLocally = false;
101           fromAddress = "mastodon@mastodon.local";
102         };
103         extraConfig = {
104           EMAIL_DOMAIN_ALLOWLIST = "example.com";
105         };
106       };
107     };
109     client = { pkgs, ... }: {
110       environment.systemPackages = [ pkgs.jq ];
111       networking = {
112         interfaces.eth1 = {
113           ipv4.addresses = [
114             { address = "192.168.2.12"; prefixLength = 24; }
115           ];
116         };
117         extraHosts = hosts;
118       };
120       security = {
121         pki.certificateFiles = [ "${test-certificates}/root_ca.crt" ];
122       };
123     };
124   };
126   testScript = ''
127     start_all()
129     ca.wait_for_unit("step-ca.service")
130     ca.wait_for_open_port(8443)
132     server.wait_for_unit("nginx.service")
133     server.wait_for_unit("redis-mastodon.service")
134     server.wait_for_unit("postgresql.service")
135     server.wait_for_unit("mastodon-sidekiq.service")
136     server.wait_for_unit("mastodon-streaming.service")
137     server.wait_for_unit("mastodon-web.service")
138     server.wait_for_open_port(55000)
139     server.wait_for_open_port(55001)
141     # Check Mastodon version from remote client
142     client.succeed("curl --fail https://mastodon.local/api/v1/instance | jq -r '.version' | grep '${pkgs.mastodon.version}'")
144     # Check using admin CLI
145     # Check Mastodon version
146     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl version' | grep '${pkgs.mastodon.version}'")
148     # Manage accounts
149     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl email_domain_blocks add example.com'")
150     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl email_domain_blocks list' | grep 'example.com'")
151     server.fail("su - mastodon -s /bin/sh -c 'mastodon-env tootctl email_domain_blocks list' | grep 'mastodon.local'")
152     server.fail("su - mastodon -s /bin/sh -c 'mastodon-env tootctl accounts create alice --email=alice@example.com'")
153     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl email_domain_blocks remove example.com'")
154     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl accounts create bob --email=bob@example.com'")
155     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl accounts approve bob'")
156     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl accounts delete bob'")
158     # Manage IP access
159     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl ip_blocks add 192.168.0.0/16 --severity=no_access'")
160     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl ip_blocks export' | grep '192.168.0.0/16'")
161     server.fail("su - mastodon -s /bin/sh -c 'mastodon-env tootctl p_blocks export' | grep '172.16.0.0/16'")
162     client.fail("curl --fail https://mastodon.local/about")
163     server.succeed("su - mastodon -s /bin/sh -c 'mastodon-env tootctl ip_blocks remove 192.168.0.0/16'")
164     client.succeed("curl --fail https://mastodon.local/about")
166     ca.shutdown()
167     server.shutdown()
168     client.shutdown()
169   '';