1import ./make-test-python.nix {
2 name = "rss2email";
3
4 nodes = {
5 server =
6 { pkgs, ... }:
7 {
8 imports = [ common/user-account.nix ];
9 services.nginx = {
10 enable = true;
11 virtualHosts."127.0.0.1".root = ./common/webroot;
12 };
13 services.rss2email = {
14 enable = true;
15 to = "alice@localhost";
16 interval = "1";
17 config.from = "test@example.org";
18 feeds = {
19 nixos = {
20 url = "http://127.0.0.1/news-rss.xml";
21 };
22 };
23 };
24 services.opensmtpd = {
25 enable = true;
26 extraServerArgs = [ "-v" ];
27 serverConfiguration = ''
28 listen on 127.0.0.1
29 action dovecot_deliver mda \
30 "${pkgs.dovecot}/libexec/dovecot/deliver -d %{user.username}"
31 match from any for local action dovecot_deliver
32 '';
33 };
34 services.dovecot2 = {
35 enable = true;
36 enableImap = true;
37 mailLocation = "maildir:~/mail";
38 protocols = [ "imap" ];
39 };
40 environment.systemPackages =
41 let
42 checkMailLanded = pkgs.writeScriptBin "check-mail-landed" ''
43 #!${pkgs.python3.interpreter}
44 import imaplib
45
46 with imaplib.IMAP4('127.0.0.1', 143) as imap:
47 imap.login('alice', 'foobar')
48 imap.select()
49 status, refs = imap.search(None, 'ALL')
50 print("=====> Result of search for all:", status, refs)
51 assert status == 'OK'
52 assert len(refs) > 0
53 status, msg = imap.fetch(refs[0], 'BODY[TEXT]')
54 assert status == 'OK'
55 '';
56 in
57 [
58 pkgs.opensmtpd
59 checkMailLanded
60 ];
61 };
62 };
63
64 testScript = ''
65 start_all()
66
67 server.systemctl("start network-online.target")
68 server.wait_for_unit("network-online.target")
69 server.wait_for_unit("opensmtpd")
70 server.wait_for_unit("dovecot2")
71 server.wait_for_unit("nginx")
72 server.wait_for_unit("rss2email")
73
74 server.wait_until_succeeds("check-mail-landed >&2")
75 '';
76}