source: mailjam/mailjam/tests/daemon.py@ 16:cd4170142d87

Last change on this file since 16:cd4170142d87 was 16:cd4170142d87, checked in by Borja Lopez <borja@…>, 12 years ago

Renamed the project to Mailjam

File size: 8.1 KB
Line 
1# -*- coding: utf-8 -*-
2
3"""
4The mailjam 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 mailjam.daemon import Mailjam, MailjamXMLRPC, MailjamDaemon
18from mailjam.models import Member, MailingList
19from mailjam.storage import JsonStorage as Storage
20
21
22class TestMailjam(TestCase):
23 """
24 mailjam.daemon.Mailjam tests.
25
26 Remember to call the .clear() method of mailjam 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__), 'mailjam.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 mailjam = Mailjam(configfile=self.configfile)
37 self.assertIsInstance(mailjam, Mailjam)
38 self.assertEqual(mailjam.mailings, {})
39 self.assertEqual(mailjam.mailings_addresses, [])
40 self.assertIsInstance(mailjam.dbs, dict)
41 self.assertTrue('mailings' in mailjam.dbs.keys())
42 self.assertTrue('members' in mailjam.dbs.keys())
43 self.assertIsInstance(mailjam.dbs['mailings'], Storage)
44 self.assertIsInstance(mailjam.dbs['members'], Storage)
45
46 def test_save(self):
47 mailjam = Mailjam(configfile=self.configfile)
48 self.assertFalse(mailjam.save())
49 mailjam.add_mailing_list(self.mailing_list.info())
50 self.assertTrue(mailjam.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 mailjam.clear()
56
57 def test_load(self):
58 mailjam = Mailjam(configfile=self.configfile)
59 self.assertFalse(mailjam.mailings)
60 self.assertFalse(mailjam.mailings_addresses)
61 self.assertFalse(mailjam.load())
62 mailjam.add_mailing_list(self.mailing_list.info())
63 self.assertTrue(mailjam.load())
64
65 # Check that another mailjam instance is able to load the saved data
66 mailjam_load = Mailjam(configfile=self.configfile)
67 self.assertFalse(mailjam_load.mailings)
68 self.assertFalse(mailjam_load.mailings_addresses)
69 mailjam_load.load()
70 self.assertTrue(mailjam_load.mailings)
71 self.assertIsInstance(mailjam_load.mailings, dict)
72 self.assertTrue(mailjam_load.mailings_addresses)
73 self.assertIsInstance(mailjam_load.mailings_addresses, list)
74
75 # Clear the files created by the tests
76 mailjam.clear()
77
78 def test_clear(self):
79 mailjam = Mailjam(configfile=self.configfile)
80 self.assertFalse(mailjam.clear())
81 mailjam.add_mailing_list(self.mailing_list.info())
82 self.assertTrue(mailjam.clear())
83
84 def test_add_mailing_list(self):
85 mailjam = Mailjam(configfile=self.configfile)
86 with self.assertRaises(TypeError):
87 # test improper info values
88 mailjam.add_mailing_list(['a list', 'is an', 'invalid parameter'])
89 mailjam.add_mailing_list(self.mailing_list)
90 with self.assertRaises(ValueError):
91 #test incomplete/missing info values
92 mailjam.add_mailing_list()
93 mailjam.add_mailing_list({'name': 'missing info'})
94 mailjam.add_mailing_list({'address': 'missing info'})
95 mailjam.add_mailing_list({'name': 'missing info',
96 'address': 'missing info'})
97 # test mailing lists can be added
98 self.assertTrue(mailjam.add_mailing_list(self.mailing_list.info()))
99 self.assertTrue(mailjam.mailings)
100 self.assertIsInstance(mailjam.mailings, dict)
101 self.assertTrue(mailjam.mailings_addresses)
102 self.assertIsInstance(mailjam.mailings_addresses, list)
103 with self.assertRaises(IndexError):
104 # test what happens when the mailing has been already added
105 mailjam.add_mailing_list(self.mailing_list.info())
106
107 # Clear the files created by the tests
108 mailjam.clear()
109
110 def test_add_mailing_member(self):
111 mailjam = Mailjam(configfile=self.configfile)
112 mailjam.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 mailjam.add_mailing_member()
117 mailjam.add_mailing_member(None, None)
118 mailjam.add_mailing_member(None, 'test_list@example.net')
119 mailjam.add_mailing_member('test@example.net', None)
120 mailjam.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 mailjam.add_mailing_member('test@example.net',
124 'test_list_b@example.net')
125 # Test adding a member
126 self.assertTrue(mailjam.add_mailing_member('test@example.net',
127 self.mailing_list.address))
128 # Test trying to re-add that user
129 self.assertFalse(mailjam.add_mailing_member('test@example.net',
130 self.mailing_list.address))
131
132 # Clear the files created by the tests
133 mailjam.clear()
134
135
136class TestMailjamDaemon(TestCase):
137 """
138 mailjam.daemon.MailjamDaemon tests.
139
140 Remember to call the .clear() method of mailjam 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 'mailjam.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 = MailjamDaemon(self.configfile)
153 self.assertIsInstance(daemon, MailjamDaemon)
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 = MailjamDaemon(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 = MailjamDaemon(self.configfile)
167 daemon.port = 9002
168 self.assertTrue(daemon.add_methods())
169 self.assertTrue(daemon.ready_to_serve)
170
171 daemon = MailjamDaemon(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 = MailjamDaemon(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(MailjamXMLRPC()._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.