121 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- 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",
 | |
|                 root_path="",
 | |
|             )
 | |
| 
 | |
|         # 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",
 | |
|                 root_path="",
 | |
|             )
 |