1484Szelenkov@nginx.comimport unittest
2484Szelenkov@nginx.comimport unit
3484Szelenkov@nginx.com
4484Szelenkov@nginx.comclass TestUnitApplication(unit.TestUnitControl):
5484Szelenkov@nginx.com
6484Szelenkov@nginx.com    def setUpClass():
7484Szelenkov@nginx.com        u = unit.TestUnit()
8484Szelenkov@nginx.com
9484Szelenkov@nginx.com        u.check_modules('python')
10484Szelenkov@nginx.com        u.check_version('0.4')
11484Szelenkov@nginx.com
12504Szelenkov@nginx.com    def conf_with_name(self, name):
13504Szelenkov@nginx.com        self.conf({
14495Szelenkov@nginx.com            "listeners": {
15495Szelenkov@nginx.com                "*:7080": {
16495Szelenkov@nginx.com                    "application": "app"
17495Szelenkov@nginx.com                }
18495Szelenkov@nginx.com            },
19495Szelenkov@nginx.com            "applications": {
20495Szelenkov@nginx.com                "app": {
21495Szelenkov@nginx.com                    "type": "python",
22495Szelenkov@nginx.com                    "workers": 1,
23504Szelenkov@nginx.com                    "path": self.testdir + '/' + name,
24495Szelenkov@nginx.com                    "module": "wsgi"
25495Szelenkov@nginx.com                }
26495Szelenkov@nginx.com            }
27504Szelenkov@nginx.com        })
28495Szelenkov@nginx.com
29495Szelenkov@nginx.com    def test_python_application_simple(self):
30484Szelenkov@nginx.com        code, name = """
31484Szelenkov@nginx.com
32484Szelenkov@nginx.comdef application(environ, start_response):
33484Szelenkov@nginx.com
34484Szelenkov@nginx.com    content_length = int(environ.get('CONTENT_LENGTH', 0))
35484Szelenkov@nginx.com    body = bytes(environ['wsgi.input'].read(content_length))
36484Szelenkov@nginx.com
37503Szelenkov@nginx.com    start_response('200', [
38484Szelenkov@nginx.com        ('Content-Type', environ.get('CONTENT_TYPE')),
39484Szelenkov@nginx.com        ('Content-Length', str(len(body))),
40484Szelenkov@nginx.com        ('Request-Method', environ.get('REQUEST_METHOD')),
41484Szelenkov@nginx.com        ('Request-Uri', environ.get('REQUEST_URI')),
42484Szelenkov@nginx.com        ('Http-Host', environ.get('HTTP_HOST')),
43484Szelenkov@nginx.com        ('Server-Protocol', environ.get('SERVER_PROTOCOL')),
44484Szelenkov@nginx.com        ('Custom-Header', environ.get('HTTP_CUSTOM_HEADER'))
45484Szelenkov@nginx.com    ])
46484Szelenkov@nginx.com    return [body]
47484Szelenkov@nginx.com
48484Szelenkov@nginx.com""", 'py_app'
49484Szelenkov@nginx.com
50484Szelenkov@nginx.com        self.python_application(name, code)
51504Szelenkov@nginx.com        self.conf_with_name(name)
52484Szelenkov@nginx.com
53484Szelenkov@nginx.com        body = 'Test body string.'
54484Szelenkov@nginx.com
55*505Szelenkov@nginx.com        resp = self.post(headers={
56484Szelenkov@nginx.com            'Host': 'localhost',
57484Szelenkov@nginx.com            'Content-Type': 'text/html',
58484Szelenkov@nginx.com            'Custom-Header': 'blah'
59*505Szelenkov@nginx.com        }, body=body)
60484Szelenkov@nginx.com
61*505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
62*505Szelenkov@nginx.com        headers = resp['headers']
63495Szelenkov@nginx.com        self.assertRegex(headers.pop('Server'), r'unit/[\d\.]+',
64495Szelenkov@nginx.com            'server header')
65495Szelenkov@nginx.com        self.assertDictEqual(headers, {
66495Szelenkov@nginx.com            'Content-Length': str(len(body)),
67495Szelenkov@nginx.com            'Content-Type': 'text/html',
68495Szelenkov@nginx.com            'Request-Method': 'POST',
69495Szelenkov@nginx.com            'Request-Uri': '/',
70495Szelenkov@nginx.com            'Http-Host': 'localhost',
71495Szelenkov@nginx.com            'Server-Protocol': 'HTTP/1.1',
72495Szelenkov@nginx.com            'Custom-Header': 'blah'
73495Szelenkov@nginx.com        }, 'headers')
74*505Szelenkov@nginx.com        self.assertEqual(resp['body'], body, 'body')
75484Szelenkov@nginx.com
76497Szelenkov@nginx.com    def test_python_application_query_string(self):
77497Szelenkov@nginx.com        code, name = """
78497Szelenkov@nginx.com
79497Szelenkov@nginx.comdef application(environ, start_response):
80497Szelenkov@nginx.com
81503Szelenkov@nginx.com    start_response('200', [
82497Szelenkov@nginx.com        ('Content-Length', '0'),
83497Szelenkov@nginx.com        ('Query-String', environ.get('QUERY_STRING'))
84497Szelenkov@nginx.com    ])
85497Szelenkov@nginx.com    return []
86497Szelenkov@nginx.com
87497Szelenkov@nginx.com""", 'py_app'
88497Szelenkov@nginx.com
89497Szelenkov@nginx.com        self.python_application(name, code)
90504Szelenkov@nginx.com        self.conf_with_name(name)
91497Szelenkov@nginx.com
92*505Szelenkov@nginx.com        resp = self.get(url='/?var1=val1&var2=val2')
93497Szelenkov@nginx.com
94*505Szelenkov@nginx.com        self.assertEqual(resp['status'], 200, 'status')
95*505Szelenkov@nginx.com        headers = resp['headers']
96497Szelenkov@nginx.com        headers.pop('Server')
97497Szelenkov@nginx.com        self.assertDictEqual(headers, {
98497Szelenkov@nginx.com            'Content-Length': '0',
99503Szelenkov@nginx.com            'Query-String': 'var1=val1&var2=val2'
100497Szelenkov@nginx.com        }, 'headers')
101497Szelenkov@nginx.com
102495Szelenkov@nginx.com    @unittest.expectedFailure
103495Szelenkov@nginx.com    def test_python_application_server_port(self):
104495Szelenkov@nginx.com        code, name = """
105495Szelenkov@nginx.com
106495Szelenkov@nginx.comdef application(environ, start_response):
107484Szelenkov@nginx.com
108503Szelenkov@nginx.com    start_response('200', [
109503Szelenkov@nginx.com        ('Content-Length', '0'),
110495Szelenkov@nginx.com        ('Server-Port', environ.get('SERVER_PORT'))
111495Szelenkov@nginx.com    ])
112495Szelenkov@nginx.com    return []
113495Szelenkov@nginx.com
114495Szelenkov@nginx.com""", 'py_app'
115495Szelenkov@nginx.com
116495Szelenkov@nginx.com        self.python_application(name, code)
117504Szelenkov@nginx.com        self.conf_with_name(name)
118495Szelenkov@nginx.com
119*505Szelenkov@nginx.com        self.assertEqual(self.get()['headers']['Server-Port'], '7080',
120495Szelenkov@nginx.com            'Server-Port header')
121484Szelenkov@nginx.com
122496Szelenkov@nginx.com    @unittest.expectedFailure
123496Szelenkov@nginx.com    def test_python_application_204_transfer_encoding(self):
124496Szelenkov@nginx.com        code, name = """
125496Szelenkov@nginx.com
126496Szelenkov@nginx.comdef application(environ, start_response):
127496Szelenkov@nginx.com
128496Szelenkov@nginx.com    start_response('204 No Content', [])
129496Szelenkov@nginx.com    return []
130496Szelenkov@nginx.com
131496Szelenkov@nginx.com""", 'py_app'
132496Szelenkov@nginx.com
133496Szelenkov@nginx.com        self.python_application(name, code)
134504Szelenkov@nginx.com        self.conf_with_name(name)
135496Szelenkov@nginx.com
136*505Szelenkov@nginx.com        self.assertNotIn('Transfer-Encoding', self.get()['headers'],
137496Szelenkov@nginx.com            '204 header transfer encoding')
138484Szelenkov@nginx.com
139484Szelenkov@nginx.comif __name__ == '__main__':
140484Szelenkov@nginx.com    unittest.main()
141