3
0
Fork 0
wuttaweb/tests/test_handler.py
Lance Edgar 75b8de7ce3 fix: workaround error when 'fanstatic.needed' missing from environ
what i've seen in the wild seems to be caused by a crawler trying to
fetch non-minified JS files, when the fanstatic resource library only
includes minified JS files.  still not sure why that would cause the
specific error but oh well, this hopefully "solves" for now
2025-12-13 20:37:53 -06:00

179 lines
6.2 KiB
Python

# -*- coding: utf-8; -*-
from unittest.mock import patch
from wuttaweb import handler as mod, static
from wuttaweb.forms import Form
from wuttaweb.grids import Grid
from wuttaweb.menus import MenuHandler
from wuttaweb.testing import WebTestCase
class MockMenuHandler(MenuHandler):
pass
class LegacyMenuHandler(MenuHandler):
pass
class AnotherMenuHandler(MenuHandler):
pass
class TestWebHandler(WebTestCase):
def make_handler(self):
return mod.WebHandler(self.config)
def test_get_fanstatic_url(self):
handler = self.make_handler()
# default with / root path
url = handler.get_fanstatic_url(self.request, static.logo)
self.assertEqual(url, "/fanstatic/wuttaweb_img/logo.png")
# what about a subpath
with patch.object(self.request, "script_name", new="/testing"):
url = handler.get_fanstatic_url(self.request, static.logo)
self.assertEqual(url, "/testing/fanstatic/wuttaweb_img/logo.png")
# error if environ missing config/data
environ = dict(self.request.environ)
del environ["fanstatic.needed"]
with patch.object(self.request, "environ", new=environ):
self.assertRaises(
KeyError, handler.get_fanstatic_url, self.request, static.logo
)
def test_get_favicon_url(self):
handler = self.make_handler()
# default
url = handler.get_favicon_url(self.request)
self.assertEqual(url, "/fanstatic/wuttaweb_img/favicon.ico")
# returns empty if environ missing config/data
environ = dict(self.request.environ)
del environ["fanstatic.needed"]
with patch.object(self.request, "environ", new=environ):
self.assertEqual(handler.get_favicon_url(self.request), "")
# config override
self.config.setdefault("wuttaweb.favicon_url", "/testing/other.ico")
url = handler.get_favicon_url(self.request)
self.assertEqual(url, "/testing/other.ico")
def test_get_header_logo_url(self):
handler = self.make_handler()
# default
url = handler.get_header_logo_url(self.request)
self.assertEqual(url, "/fanstatic/wuttaweb_img/favicon.ico")
# config override
self.config.setdefault("wuttaweb.header_logo_url", "/testing/header.png")
url = handler.get_header_logo_url(self.request)
self.assertEqual(url, "/testing/header.png")
def test_get_main_logo_url(self):
handler = self.make_handler()
# default
url = handler.get_main_logo_url(self.request)
self.assertEqual(url, "/fanstatic/wuttaweb_img/logo.png")
# config override
self.config.setdefault("wuttaweb.logo_url", "/testing/other.png")
url = handler.get_main_logo_url(self.request)
self.assertEqual(url, "/testing/other.png")
def test_get_menu_handler(self):
handler = self.make_handler()
# built-in default
menus = handler.get_menu_handler()
self.assertIsInstance(menus, MenuHandler)
self.assertIs(type(menus), MenuHandler)
# configured default
self.config.setdefault(
"wutta.web.menus.handler.default_spec", "tests.test_handler:MockMenuHandler"
)
menus = handler.get_menu_handler()
self.assertIsInstance(menus, MockMenuHandler)
# configured handler (legacy)
self.config.setdefault(
"wutta.web.menus.handler_spec", "tests.test_handler:LegacyMenuHandler"
)
menus = handler.get_menu_handler()
self.assertIsInstance(menus, LegacyMenuHandler)
# configued handler (proper)
self.config.setdefault(
"wutta.web.menus.handler.spec", "tests.test_handler:AnotherMenuHandler"
)
menus = handler.get_menu_handler()
self.assertIsInstance(menus, AnotherMenuHandler)
def test_get_menu_handler_specs(self):
handler = self.make_handler()
# at least one spec by default
specs = handler.get_menu_handler_specs()
self.assertIn("wuttaweb.menus:MenuHandler", specs)
# caller can specify default as string
specs = handler.get_menu_handler_specs(
default="tests.test_handler:MockMenuHandler"
)
self.assertIn("wuttaweb.menus:MenuHandler", specs)
self.assertIn("tests.test_handler:MockMenuHandler", specs)
self.assertNotIn("tests.test_handler:AnotherMenuHandler", specs)
# caller can specify default as list
specs = handler.get_menu_handler_specs(
default=[
"tests.test_handler:MockMenuHandler",
"tests.test_handler:AnotherMenuHandler",
]
)
self.assertIn("wuttaweb.menus:MenuHandler", specs)
self.assertIn("tests.test_handler:MockMenuHandler", specs)
self.assertIn("tests.test_handler:AnotherMenuHandler", specs)
# default can be configured
self.config.setdefault(
"wutta.web.menus.handler.default_spec",
"tests.test_handler:AnotherMenuHandler",
)
specs = handler.get_menu_handler_specs()
self.assertIn("wuttaweb.menus:MenuHandler", specs)
self.assertNotIn("tests.test_handler:MockMenuHandler", specs)
self.assertIn("tests.test_handler:AnotherMenuHandler", specs)
# the rest come from entry points
with patch.object(
mod,
"load_entry_points",
return_value={
"legacy": LegacyMenuHandler,
},
):
specs = handler.get_menu_handler_specs()
self.assertNotIn("wuttaweb.menus:MenuHandler", specs)
self.assertNotIn("tests.test_handler:MockMenuHandler", specs)
self.assertIn("tests.test_handler:LegacyMenuHandler", specs)
# nb. this remains from previous config default
self.assertIn("tests.test_handler:AnotherMenuHandler", specs)
def test_make_form(self):
handler = self.make_handler()
form = handler.make_form(self.request)
self.assertIsInstance(form, Form)
def test_make_grid(self):
handler = self.make_handler()
grid = handler.make_grid(self.request)
self.assertIsInstance(grid, Grid)