1import sys
2import unittest
3
4from supervisor.tests.base import DummySupervisor
5from supervisor.tests.base import DummyRequest
6
7class DeferredWebProducerTests(unittest.TestCase):
8    def _getTargetClass(self):
9        from supervisor.web import DeferredWebProducer
10        return DeferredWebProducer
11
12    def _makeOne(self, request, callback):
13        producer = self._getTargetClass()(request, callback)
14        return producer
15
16    def test_ctor(self):
17        request = DummyRequest('/index.html', [], '', '')
18        callback = lambda *x: None
19        callback.delay = 1
20        producer = self._makeOne(request, callback)
21        self.assertEqual(producer.callback, callback)
22        self.assertEqual(producer.request, request)
23        self.assertEqual(producer.finished, False)
24        self.assertEqual(producer.delay, 1)
25
26    def test_more_not_done_yet(self):
27        request = DummyRequest('/index.html', [], '', '')
28        from supervisor.http import NOT_DONE_YET
29        callback = lambda *x: NOT_DONE_YET
30        callback.delay = 1
31        producer = self._makeOne(request, callback)
32        self.assertEqual(producer.more(), NOT_DONE_YET)
33
34    def test_more_finished(self):
35        request = DummyRequest('/index.html', [], '', '')
36        callback = lambda *x: 'done'
37        callback.delay = 1
38        producer = self._makeOne(request, callback)
39        self.assertEqual(producer.more(), None)
40        self.assertTrue(producer.finished)
41        self.assertEqual(producer.more(), '')
42
43    def test_more_exception_caught(self):
44        request = DummyRequest('/index.html', [], '', '')
45        def callback(*arg):
46            raise ValueError('foo')
47        callback.delay = 1
48        producer = self._makeOne(request, callback)
49        self.assertEqual(producer.more(), None)
50        logdata = request.channel.server.logger.logged
51        self.assertEqual(len(logdata), 1)
52        logged = logdata[0]
53        self.assertEqual(logged[0], 'Web interface error')
54        self.assertTrue(logged[1].startswith('Traceback'), logged[1])
55        self.assertEqual(producer.finished, True)
56        self.assertEqual(request._error, 500)
57
58    def test_sendresponse_redirect(self):
59        request = DummyRequest('/index.html', [], '', '')
60        callback = lambda *arg: None
61        callback.delay = 1
62        producer = self._makeOne(request, callback)
63        response = {'headers': {'Location':'abc'}}
64        result = producer.sendresponse(response)
65        self.assertEqual(result, None)
66        self.assertEqual(request._error, 301)
67        self.assertEqual(request.headers['Content-Type'], 'text/plain')
68        self.assertEqual(request.headers['Content-Length'], 0)
69
70    def test_sendresponse_withbody_and_content_type(self):
71        request = DummyRequest('/index.html', [], '', '')
72        callback = lambda *arg: None
73        callback.delay = 1
74        producer = self._makeOne(request, callback)
75        response = {'body': 'abc', 'headers':{'Content-Type':'text/html'}}
76        result = producer.sendresponse(response)
77        self.assertEqual(result, None)
78        self.assertEqual(request.headers['Content-Type'], 'text/html')
79        self.assertEqual(request.headers['Content-Length'], 3)
80        self.assertEqual(request.producers[0], 'abc')
81
82class UIHandlerTests(unittest.TestCase):
83    def _getTargetClass(self):
84        from supervisor.web import supervisor_ui_handler
85        return supervisor_ui_handler
86
87    def _makeOne(self):
88        supervisord = DummySupervisor()
89        handler = self._getTargetClass()(supervisord)
90        return handler
91
92    def test_handle_request_no_view_method(self):
93        request = DummyRequest('/foo.css', [], '', '', {'PATH_INFO':'/foo.css'})
94        handler = self._makeOne()
95        data = handler.handle_request(request)
96        self.assertEqual(data, None)
97
98    def test_handle_request_default(self):
99        request = DummyRequest('/index.html', [], '', '',
100                               {'PATH_INFO':'/index.html'})
101        handler = self._makeOne()
102        data = handler.handle_request(request)
103        self.assertEqual(data, None)
104        self.assertEqual(request.channel.producer.request, request)
105        from supervisor.web import StatusView
106        self.assertEqual(request.channel.producer.callback.__class__,StatusView)
107
108    def test_handle_request_index_html(self):
109        request = DummyRequest('/index.html', [], '', '',
110                               {'PATH_INFO':'/index.html'})
111        handler = self._makeOne()
112        handler.handle_request(request)
113        from supervisor.web import StatusView
114        view = request.channel.producer.callback
115        self.assertEqual(view.__class__, StatusView)
116        self.assertEqual(view.context.template, 'ui/status.html')
117
118    def test_handle_request_tail_html(self):
119        request = DummyRequest('/tail.html', [], '', '',
120                               {'PATH_INFO':'/tail.html'})
121        handler = self._makeOne()
122        handler.handle_request(request)
123        from supervisor.web import TailView
124        view = request.channel.producer.callback
125        self.assertEqual(view.__class__, TailView)
126        self.assertEqual(view.context.template, 'ui/tail.html')
127
128    def test_handle_request_ok_html(self):
129        request = DummyRequest('/tail.html', [], '', '',
130                               {'PATH_INFO':'/ok.html'})
131        handler = self._makeOne()
132        handler.handle_request(request)
133        from supervisor.web import OKView
134        view = request.channel.producer.callback
135        self.assertEqual(view.__class__, OKView)
136        self.assertEqual(view.context.template, None)
137
138
139class StatusViewTests(unittest.TestCase):
140    def _getTargetClass(self):
141        from supervisor.web import StatusView
142        return StatusView
143
144    def _makeOne(self, context):
145        klass = self._getTargetClass()
146        return klass(context)
147
148    def test_make_callback_noaction(self):
149        context = DummyContext()
150        context.supervisord = DummySupervisor()
151        context.template = 'ui/status.html'
152        context.form = {}
153        view = self._makeOne(context)
154        self.assertRaises(ValueError, view.make_callback, 'process', None)
155
156    def test_render_noaction(self):
157        context = DummyContext()
158        context.supervisord = DummySupervisor()
159        context.template = 'ui/status.html'
160        context.request = DummyRequest('/foo', [], '', '')
161        context.form = {}
162        context.response = {}
163        view = self._makeOne(context)
164        data = view.render()
165        self.assertTrue(data.startswith('<!DOCTYPE html PUBLIC'), data)
166
167    def test_render_refresh(self):
168        context = DummyContext()
169        context.supervisord = DummySupervisor()
170        context.template = 'ui/status.html'
171        context.response = {}
172        context.form = {'action':'refresh'}
173        view = self._makeOne(context)
174        data = view.render()
175        from supervisor.http import NOT_DONE_YET
176        self.assertTrue(data is NOT_DONE_YET, data)
177
178class DummyContext:
179    pass
180
181def test_suite():
182    return unittest.findTestCases(sys.modules[__name__])
183
184if __name__ == '__main__':
185    unittest.main(defaultTest='test_suite')
186