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