180b124c0f307286caf78be706aa696c68adfed3
[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
22
23 class TestHttpRequestParser(unittest.TestCase):
24     """
25     Tests for ipypbx.http.HttpRequestParser.
26     """    
27     def setUp(self):
28         """
29         Initialize request object.
30         """
31         self.request = http.HttpRequestParser()
32
33     def test_initial_state(self):
34         """
35         Check the default values.
36         """
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)
44
45     def test_handle_none(self):
46         """
47         HttpRequestParser.handleNone should just invoke next method and got to
48         headers parsing.
49         """
50         self.request.handle('GET / HTTP/1.1')
51         self.assertNotEqual(self.request.state, self.request.HTTP_NONE)
52
53
54     def test_handle_request(self):
55         """
56         HttpRequestParser.handleRequest should get method, request path and HTTP
57         version from the request and move to headers parsing.
58         """
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')
63         
64         self.assertEqual(self.request.state, self.request.HTTP_HEADERS)
65         
66
67     def test_handle_headers(self):
68         """
69         HttpRequestParser.handleNone should parse headers until empty line is
70         received.
71         """
72         # Move to target state.
73         self.request.handle('GET / HTTP/1.1')
74
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)
80
81         # Handle next header.
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)
86
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)
92         
93     def test_handle_empty(self):
94         """
95         HttpRequestParser.handleEmpty just passes to next state.
96         """
97         prev_state = self.request.state
98         self.request.handleEmpty('')
99         self.assertEqual(self.request.state, prev_state + 1)
100
101     def _run_lines(self, *lines):
102         for line in lines:
103             self.request.handle(line)        
104
105     def test_handle_body(self):
106         self._run_lines(
107             'POST / HTTP/1.1',
108             '',
109             'foo=bar&qwe=asd')
110         self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': 'asd'})
111         
112     def test_handle_body_with_missing_values(self):
113         self._run_lines(
114             'POST / HTTP/1.1',
115             '',
116             'foo=bar&qwe=')
117         self.assertEqual(self.request.data, {'foo': 'bar', 'qwe': ''})
118                 
119
120     def test_non_post_fails(self):
121         self.request.handle('GET / HTTP/1.1')
122         self.request.handle('')
123         self.assertRaises(
124             http.HttpParseError, self.request.handle,
125             'Only post requests work')
126
127         
128 class TestFreeswitchConfigGenerator(support.InitDatabase, unittest.TestCase):
129     def test_foo(self):
130         print self.db