1 # Copyright (c) Stas Shtin, 2010
3 # This file is part of IPyPBX.
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.
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.
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/>.
19 from ipypbx import http
20 from ipypbx.tests import support
23 class TestHttpRequestParser(unittest.TestCase):
25 Tests for ipypbx.http.HttpRequestParser.
29 Initialize request object.
31 self.request = http.HttpRequestParser()
33 def test_initial_state(self):
35 Check the default values.
37 self.assertEqual(self.request.method, None)
38 self.assertEqual(self.request.request_path, None)
39 self.assertEqual(self.request.http_version, None)
40 self.assertEqual(self.request.headers, {})
41 self.assertEqual(self.request.data, {})
42 self.assertEqual(self.request.result, None)
43 self.assertEqual(self.request.state, self.request.HTTP_NONE)
45 def test_handle_none(self):
47 HttpRequestParser.handleNone should just invoke next method and got to
50 self.request.handle('GET / HTTP/1.1')
51 self.assertNotEqual(self.request.state, self.request.HTTP_NONE)
54 def test_handle_request(self):
56 HttpRequestParser.handleRequest should get method, request path and HTTP
57 version from the request and move to headers parsing.
59 self.request.handle('GET / HTTP/1.1')
60 self.assertEqual(self.request.method, 'GET')
61 self.assertEqual(self.request.request_path, '/')
62 self.assertEqual(self.request.http_version, 'HTTP/1.1')
64 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
67 def test_handle_headers(self):
69 HttpRequestParser.handleNone should parse headers until empty line is
72 # Move to target state.
73 self.request.handle('GET / HTTP/1.1')
75 # Handle first header.
76 self.request.handle('Foo: bar')
77 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
78 self.assertEqual(self.request.headers['Foo'], 'bar')
79 self.assertEqual(len(self.request.headers), 1)
82 self.request.handle('Qwe: asd')
83 self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
84 self.assertEqual(self.request.headers['Qwe'], 'asd')
85 self.assertEqual(len(self.request.headers), 2)
87 # Empty line terminates
88 self.request.handle('')
89 self.assertNotEqual(self.request.state, self.request.HTTP_HEADERS)
90 self.assertEqual(self.request.headers['Qwe'], 'asd')
91 self.assertEqual(len(self.request.headers), 2)
93 def test_handle_empty(self):
95 HttpRequestParser.handleEmpty just passes to next state.
97 prev_state = self.request.state
98 self.request.handleEmpty('')
99 self.assertEqual(self.request.state, prev_state + 1)
101 def _run_lines(self, *lines):
103 self.request.handle(line)
105 def test_handle_body(self):
110 self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': 'asd'})
112 def test_handle_body_with_missing_values(self):
117 self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': ''})
120 def test_non_post_fails(self):
121 self.request.handle('GET / HTTP/1.1')
122 self.request.handle('')
124 http.HttpParseError, self.request.handle,
125 'Only post requests work')
128 class TestFreeswitchConfigGenerator(support.InitDatabase, unittest.TestCase):