source: mailjam/postman/tests/daemon.py@ 15:8ae771653ffe

Last change on this file since 15:8ae771653ffe was 11:078c7b030cee, checked in by Borja Lopez <borja@…>, 13 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
RevLine 
[5]1# -*- coding: utf-8 -*-
2
[11]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
[10]13import os, multiprocessing, xmlrpclib, time
[7]14from SimpleXMLRPCServer import SimpleXMLRPCServer
[5]15from unittest import TestCase
[7]16
17from postman.daemon import Postman, PostmanXMLRPC, PostmanDaemon
[5]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):
[10]30 self.configfile = os.path.join(os.path.dirname(__file__), 'postman.conf')
[5]31 self.mailing_list = MailingList('test_list', 'test_list@example.com',
[10]32 members={}, configfile=self.configfile)
[5]33 self.member = Member('test@example.com')
34
35 def test___init__(self):
[10]36 postman = Postman(configfile=self.configfile)
[5]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):
[10]47 postman = Postman(configfile=self.configfile)
[5]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):
[10]58 postman = Postman(configfile=self.configfile)
[5]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
[10]66 postman_load = Postman(configfile=self.configfile)
[5]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):
[10]79 postman = Postman(configfile=self.configfile)
[5]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):
[10]85 postman = Postman(configfile=self.configfile)
[5]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):
[10]111 postman = Postman(configfile=self.configfile)
[5]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()
[6]134
135
136class TestPostmanDaemon(TestCase):
137 """
138 postman.daemon.PostmanDaemon tests.
[7]139
140 Remember to call the .clear() method of postman after each test, so
141 the temp storage files are deleted
[6]142 """
143 def setUp(self):
[10]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)
[6]149 self.member = Member('test@example.com')
[7]150
151 def test___init__(self):
[10]152 daemon = PostmanDaemon(self.configfile)
[7]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):
[10]159 daemon = PostmanDaemon(self.configfile)
[7]160 daemon.port = 9001
161 self.assertTrue(daemon.create_server())
162 self.assertIsInstance(daemon.server, SimpleXMLRPCServer)
163 self.assertFalse(daemon.ready_to_serve)
[6]164
[7]165 def test_add_methods(self):
[10]166 daemon = PostmanDaemon(self.configfile)
[7]167 daemon.port = 9002
168 self.assertTrue(daemon.add_methods())
169 self.assertTrue(daemon.ready_to_serve)
170
[10]171 daemon = PostmanDaemon(self.configfile)
[7]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):
[10]178 daemon = PostmanDaemon(self.configfile)
[7]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()
[10]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)
[7]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
[9]202
Note: See TracBrowser for help on using the repository browser.