Include test coverage to makefile. Update translations.
[ipypbx] / src / ipypbx / tests / test_http.py
1 # Copyright (c) Stas Shtin, 2010
2
3 # This file is part of IPyPBX.
4
5 # IPyPBX is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9
10 # IPyPBX is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with IPyPBX.  If not, see <http://www.gnu.org/licenses/>.
17
18 import unittest
19 from ipypbx import http
20 from ipypbx.tests import support
21 from xml.etree import ElementTree as etree
22
23 __all__ = (
24     'TestHttpRequestParser', 'TestFreeswitchConfigGenerator',
25     'TestSofiaConfGenerator')
26
27
28 class TestHttpRequestParser(unittest.TestCase):
29     """
30     Tests for ipypbx.http.HttpRequestParser.
31     """    
32     def setUp(self):
33         """
34         Initialize request object.
35         """
36         self.request = http.HttpRequestParser()
37
38     def test_initial_state(self):
39         """
40         Check the default values.
41         """
42         self.assertEqual(self.request.method, None)        
43         self.assertEqual(self.request.request_path, None)        
44         self.assertEqual(self.request.http_version, None)        
45         self.assertEqual(self.request.headers, {})        
46         self.assertEqual(self.request.data, {})        
47         self.assertEqual(self.request.result, None)        
48         self.assertEqual(self.request.state, self.request.HTTP_NONE)
49
50     def test_handle_none(self):
51         """
52         HttpRequestParser.handleNone should just invoke next method and got to
53         headers parsing.
54         """
55         self.request.handle('GET / HTTP/1.1')
56         self.assertNotEqual(self.request.state, self.request.HTTP_NONE)
57
58
59     def test_handle_request(self):
60         """
61         HttpRequestParser.handleRequest should get method, request path and HTTP
62         version from the request and move to headers parsing.
63         """
64         self.request.handle('GET / HTTP/1.1')
65         self.assertEqual(self.request.method, 'GET')
66         self.assertEqual(self.request.request_path, '/')
67         self.assertEqual(self.request.http_version, 'HTTP/1.1')
68         
69         self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
70         
71
72     def test_handle_headers(self):
73         """
74         HttpRequestParser.handleNone should parse headers until empty line is
75         received.
76         """
77         # Move to target state.
78         self.request.handle('GET / HTTP/1.1')
79
80         # Handle first header.
81         self.request.handle('Foo: bar')
82         self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
83         self.assertEqual(self.request.headers['Foo'], 'bar')
84         self.assertEqual(len(self.request.headers), 1)
85
86         # Handle next header.
87         self.request.handle('Qwe: asd')
88         self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
89         self.assertEqual(self.request.headers['Qwe'], 'asd')
90         self.assertEqual(len(self.request.headers), 2)
91
92         # Empty line terminates 
93         self.request.handle('')
94         self.assertNotEqual(self.request.state, self.request.HTTP_HEADERS)
95         self.assertEqual(self.request.headers['Qwe'], 'asd')
96         self.assertEqual(len(self.request.headers), 2)
97         
98     def test_handle_empty(self):
99         """
100         HttpRequestParser.handleEmpty just passes to next state.
101         """
102         prev_state = self.request.state
103         self.request.handleEmpty('')
104         self.assertEqual(self.request.state, prev_state + 1)
105
106     def _run_lines(self, *lines):
107         for line in lines:
108             self.request.handle(line)        
109
110     def test_handle_body(self):
111         """
112         HttpRequestParse.handleBody should parse variables from POST request.
113         """
114         self._run_lines(
115             'POST / HTTP/1.1',
116             '',
117             'foo=bar&qwe=asd')
118         self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': 'asd'})
119         
120     def test_handle_body_with_missing_values(self):
121         """
122         Missing values should give empty results.
123         """
124         self._run_lines(
125             'POST / HTTP/1.1',
126             '',
127             'foo=bar&qwe=')
128         self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': ''})
129                 
130     def test_non_post_fails(self):
131         """
132         We expect only POST requests from Freeswitch, for anything else we
133         get an error.
134         """
135         self.request.handle('GET / HTTP/1.1')
136         self.request.handle('')
137         self.assertRaises(
138             http.HttpParseError, self.request.handle,
139             'Only post requests work')
140
141         
142 class TestFreeswitchConfigGenerator(unittest.TestCase):
143     def setUp(self):
144         self.generator = http.FreeswitchConfigGenerator()
145         
146     def test_can_handle(self):
147         self.generator.param_match = {'foo': 'bar'}
148         self.assertEqual(self.generator.canHandle({'foo': 'bar'}), True)
149         self.assertEqual(self.generator.canHandle({'foo': 'xxx'}), False)
150         self.assertEqual(self.generator.canHandle({'xxx': 'bar'}), False)
151         self.assertEqual(
152             self.generator.canHandle({'foo': 'bar', 'qwe': 'asd'}), True)
153         self.assertEqual(self.generator.canHandle({'qwe': 'asd'}), False)
154
155         self.generator.param_match = {'foo': 'bar', 'baz': '123'}
156         self.assertEqual(self.generator.canHandle({'foo': 'bar'}), False)
157         self.assertEqual(
158             self.generator.canHandle({'foo': 'bar', 'baz': '123'}), True)
159         self.assertEqual(
160             self.generator.canHandle({'foo': 'bar', 'qwe': 'asd'}), False)
161                          
162     def test_base_elements(self):
163         """
164         ipypbx.http.FreeswitchConfigGenerator.baseElements returns a tuple of
165         document and section elelements.
166         """
167         self.generator.param_match = {'section': 'foo'}
168         root_elt, section_elt = self.generator.baseElements
169         self.assertEqual(
170             etree.tostring(root_elt),
171             '<document type="freeswitch/xml"><section name="foo" />'
172             '</document>')
173         self.assertEqual(
174             etree.tostring(section_elt), '<section name="foo" />')
175
176     def test_add_params(self):
177         """
178         ipypbx.http.FreeswitchConfigGenerator.addParams is a helper method for
179         creating params element.
180         """
181         foo_elt = etree.Element('foo')
182         self.assertEqual(
183             etree.tostring(self.generator.addParams(foo_elt, (('qwe', 'asd'),))),
184             '<foo><params><param name="qwe" value="asd" /></params></foo>')
185
186
187         bar_elt = etree.Element('bar')
188         self.assertEqual(
189             etree.tostring(
190                 self.generator.addParams(bar_elt,
191                                          (('qwe', 'asd'), ('zxc', '123')))),
192             '<bar><params><param name="qwe" value="asd" />'
193             '<param name="zxc" value="123" /></params></bar>')
194
195
196 class TestSofiaConfGenerator(unittest.TestCase):
197     def test_generate_config(self):
198         pass