source: mailjam/postman/tests/daemon.py@ 13:f1f11159dbed

Last change on this file since 13:f1f11159dbed was 11:078c7b030cee, checked in by Borja Lopez <borja@…>, 12 years ago

Removed legacy configs from the config module

Added some headers to the sources (setting author, email, website
and references to the LICENSE)

File size: 8.1 KB
Line 
1# -*- coding: utf-8 -*-
2
3"""
4The postman project - daemon.py
5
6This file is released under the BSD license, see LICENSE for
7more information.
8
9Francisco de Borja Lopez Rio - <borja@codigo23.net>
10Soluciones Informaticas Codigo23 S.L.U. - http://codigo23.net
11"""
12
13import os, multiprocessing, xmlrpclib, time
14from SimpleXMLRPCServer import SimpleXMLRPCServer
15from unittest import TestCase
16
17from postman.daemon import Postman, PostmanXMLRPC, PostmanDaemon
18from postman.models import Member, MailingList
19from postman.storage import JsonStorage as Storage
20
21
22class TestPostman(TestCase):
23 """
24 postman.daemon.Postman tests.
25
26 Remember to call the .clear() method of postman after each test, so
27 the temp storage files are deleted
28 """
29 def setUp(self):
30 self.configfile = os.path.join(os.path.dirname(__file__), 'postman.conf')
31 self.mailing_list = MailingList('test_list', 'test_list@example.com',
32 members={}, configfile=self.configfile)
33 self.member = Member('test@example.com')
34
35 def test___init__(self):
36 postman = Postman(configfile=self.configfile)
37 self.assertIsInstance(postman, Postman)
38 self.assertEqual(postman.mailings, {})
39 self.assertEqual(postman.mailings_addresses, [])
40 self.assertIsInstance(postman.dbs, dict)
41 self.assertTrue('mailings' in postman.dbs.keys())
42 self.assertTrue('members' in postman.dbs.keys())
43 self.assertIsInstance(postman.dbs['mailings'], Storage)
44 self.assertIsInstance(postman.dbs['members'], Storage)
45
46 def test_save(self):
47 postman = Postman(configfile=self.configfile)
48 self.assertFalse(postman.save())
49 postman.add_mailing_list(self.mailing_list.info())
50 self.assertTrue(postman.save())
51 # FIXME: We have to test here that the generated json file
52 # contains the data it should contain
53
54 # Clear the files created by the tests
55 postman.clear()
56
57 def test_load(self):
58 postman = Postman(configfile=self.configfile)
59 self.assertFalse(postman.mailings)
60 self.assertFalse(postman.mailings_addresses)
61 self.assertFalse(postman.load())
62 postman.add_mailing_list(self.mailing_list.info())
63 self.assertTrue(postman.load())
64
65 # Check that another postman instance is able to load the saved data
66 postman_load = Postman(configfile=self.configfile)
67 self.assertFalse(postman_load.mailings)
68 self.assertFalse(postman_load.mailings_addresses)
69 postman_load.load()
70 self.assertTrue(postman_load.mailings)
71 self.assertIsInstance(postman_load.mailings, dict)
72 self.assertTrue(postman_load.mailings_addresses)
73 self.assertIsInstance(postman_load.mailings_addresses, list)
74
75 # Clear the files created by the tests
76 postman.clear()
77
78 def test_clear(self):
79 postman = Postman(configfile=self.configfile)
80 self.assertFalse(postman.clear())
81 postman.add_mailing_list(self.mailing_list.info())
82 self.assertTrue(postman.clear())
83
84 def test_add_mailing_list(self):
85 postman = Postman(configfile=self.configfile)
86 with self.assertRaises(TypeError):
87 # test improper info values
88 postman.add_mailing_list(['a list', 'is an', 'invalid parameter'])
89 postman.add_mailing_list(self.mailing_list)
90 with self.assertRaises(ValueError):
91 #test incomplete/missing info values
92 postman.add_mailing_list()
93 postman.add_mailing_list({'name': 'missing info'})
94 postman.add_mailing_list({'address': 'missing info'})
95 postman.add_mailing_list({'name': 'missing info',
96 'address': 'missing info'})
97 # test mailing lists can be added
98 self.assertTrue(postman.add_mailing_list(self.mailing_list.info()))
99 self.assertTrue(postman.mailings)
100 self.assertIsInstance(postman.mailings, dict)
101 self.assertTrue(postman.mailings_addresses)
102 self.assertIsInstance(postman.mailings_addresses, list)
103 with self.assertRaises(IndexError):
104 # test what happens when the mailing has been already added
105 postman.add_mailing_list(self.mailing_list.info())
106
107 # Clear the files created by the tests
108 postman.clear()
109
110 def test_add_mailing_member(self):
111 postman = Postman(configfile=self.configfile)
112 postman.add_mailing_list(self.mailing_list.info())
113 with self.assertRaises(ValueError):
114 # test what happens if we call the method without proper
115 # parameters
116 postman.add_mailing_member()
117 postman.add_mailing_member(None, None)
118 postman.add_mailing_member(None, 'test_list@example.net')
119 postman.add_mailing_member('test@example.net', None)
120 postman.add_mailing_member('test@example', 'test_list@example.net')
121 with self.assertRaises(IndexError):
122 # test if we try to add a member to a non-existing mailing list
123 postman.add_mailing_member('test@example.net',
124 'test_list_b@example.net')
125 # Test adding a member
126 self.assertTrue(postman.add_mailing_member('test@example.net',
127 self.mailing_list.address))
128 # Test trying to re-add that user
129 self.assertFalse(postman.add_mailing_member('test@example.net',
130 self.mailing_list.address))
131
132 # Clear the files created by the tests
133 postman.clear()
134
135
136class TestPostmanDaemon(TestCase):
137 """
138 postman.daemon.PostmanDaemon tests.
139
140 Remember to call the .clear() method of postman after each test, so
141 the temp storage files are deleted
142 """
143 def setUp(self):
144 self.configfile = os.path.join(os.path.dirname(__file__),
145 'postman.conf')
146 self.mailing_list = MailingList('test_xmlrpc',
147 'test_xmlrpc@example.com', members={},
148 configfile=self.configfile)
149 self.member = Member('test@example.com')
150
151 def test___init__(self):
152 daemon = PostmanDaemon(self.configfile)
153 self.assertIsInstance(daemon, PostmanDaemon)
154 self.assertFalse(daemon.ready_to_serve)
155 # FIXME: More tests should be added here once the configuration
156 # file feature is added
157
158 def test_create_server(self):
159 daemon = PostmanDaemon(self.configfile)
160 daemon.port = 9001
161 self.assertTrue(daemon.create_server())
162 self.assertIsInstance(daemon.server, SimpleXMLRPCServer)
163 self.assertFalse(daemon.ready_to_serve)
164
165 def test_add_methods(self):
166 daemon = PostmanDaemon(self.configfile)
167 daemon.port = 9002
168 self.assertTrue(daemon.add_methods())
169 self.assertTrue(daemon.ready_to_serve)
170
171 daemon = PostmanDaemon(self.configfile)
172 daemon.port = 9003
173 daemon.create_server()
174 self.assertTrue(daemon.add_methods())
175 self.assertTrue(daemon.ready_to_serve)
176
177 def test_run(self):
178 daemon = PostmanDaemon(self.configfile)
179 daemon.port = 9004
180 # start the daemon in another process, so we can start communicating
181 # with itjobs = []
182 p = multiprocessing.Process(target=daemon.run)
183 p.start()
184
185 # Add a delay here to allow the server to be fully started before
186 # starting to send requests from the client
187 time.sleep(2)
188
189 # FIXME: Hardcoded url here, should be picked from a config file
190 client = xmlrpclib.ServerProxy('http://localhost:9004')
191
192 # Check that we can perform an XMLRPC call and that the list of
193 # available public methods contains the list of methods we have
194 # defined in our base XMLRPC class
195 set_class_methods = set(PostmanXMLRPC()._listMethods())
196 set_xmlrpc_methods = set(client.system.listMethods())
197 self.assertTrue(set_class_methods.issubset(set_xmlrpc_methods))
198
199 # Stop the server
200 p.terminate()
201
202
Note: See TracBrowser for help on using the repository browser.