# -*- coding: utf-8; -*- from unittest.mock import MagicMock, patch from wuttjamaican.testing import ConfigTestCase from wuttaweb.cli import webapp as mod class TestWebapp(ConfigTestCase): def make_context(self, **kwargs): params = {'auto_reload': False} params.update(kwargs.get('params', {})) ctx = MagicMock(params=params) ctx.parent.wutta_config = self.config return ctx def test_missing_config_file(self): # nb. our default config has no files, so can test w/ that ctx = self.make_context() with patch.object(mod, 'sys') as sys: sys.exit.side_effect = RuntimeError self.assertRaises(RuntimeError, mod.webapp, ctx) sys.stderr.write.assert_called_once_with("no config files found!\n") sys.exit.assert_called_once_with(1) def test_invalid_runner(self): # make new config from file, with bad setting path = self.write_file('my.conf', """ [wutta.web] app.runner = bogus """) self.config = self.make_config(files=[path]) ctx = self.make_context() with patch.object(mod, 'sys') as sys: sys.exit.side_effect = RuntimeError self.assertRaises(RuntimeError, mod.webapp, ctx) sys.stderr.write.assert_called_once_with("unknown web app runner: bogus\n") sys.exit.assert_called_once_with(2) def test_pserve(self): path = self.write_file('my.conf', """ [wutta.web] app.runner = pserve """) self.config = self.make_config(files=[path]) # normal with patch.object(mod, 'pserve') as pserve: ctx = self.make_context() mod.webapp(ctx) pserve.main.assert_called_once_with(argv=['pserve', f'file+ini:{path}']) # with reload with patch.object(mod, 'pserve') as pserve: ctx = self.make_context(params={'auto_reload': True}) mod.webapp(ctx) pserve.main.assert_called_once_with(argv=['pserve', f'file+ini:{path}', '--reload']) def test_uvicorn(self): path = self.write_file('my.conf', """ [wutta.web] app.runner = uvicorn app.spec = wuttaweb.app:make_wsgi_app """) self.config = self.make_config(files=[path]) orig_import = __import__ uvicorn = MagicMock() def mock_import(name, *args, **kwargs): if name == 'uvicorn': return uvicorn return orig_import(name, *args, **kwargs) # normal with patch('builtins.__import__', side_effect=mock_import): ctx = self.make_context() mod.webapp(ctx) uvicorn.run.assert_called_once_with('wuttaweb.app:make_wsgi_app', host='127.0.0.1', port=8000, reload=False, reload_dirs=None, factory=False, interface='auto') # with reload uvicorn.run.reset_mock() with patch('builtins.__import__', side_effect=mock_import): ctx = self.make_context(params={'auto_reload': True}) mod.webapp(ctx) uvicorn.run.assert_called_once_with('wuttaweb.app:make_wsgi_app', host='127.0.0.1', port=8000, reload=True, reload_dirs=None, factory=False, interface='auto')