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