feat: refactor forms/grids/views/templates per wuttaweb compat
this starts to get things more aligned between wuttaweb and tailbone. the use case in mind so far is for a wuttaweb view to be included in a tailbone app. form and grid classes now have some new methods to match wuttaweb, so templates call the shared method names where possible. templates can no longer assume they have tailbone-native master view, form, grid etc. so must inspect context more closely in some cases.
This commit is contained in:
parent
b53479f8e4
commit
a6ce5eb21d
39 changed files with 1037 additions and 300 deletions
26
tests/views/test_master.py
Normal file
26
tests/views/test_master.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from tailbone.views import master as mod
|
||||
from tests.util import WebTestCase
|
||||
|
||||
|
||||
class TestMasterView(WebTestCase):
|
||||
|
||||
def make_view(self):
|
||||
return mod.MasterView(self.request)
|
||||
|
||||
def test_make_form_kwargs(self):
|
||||
self.pyramid_config.add_route('settings.view', '/settings/{name}')
|
||||
model = self.app.model
|
||||
setting = model.Setting(name='foo', value='bar')
|
||||
self.session.add(setting)
|
||||
self.session.commit()
|
||||
with patch.multiple(mod.MasterView, create=True,
|
||||
model_class=model.Setting):
|
||||
view = self.make_view()
|
||||
|
||||
# sanity / coverage check
|
||||
kw = view.make_form_kwargs(model_instance=setting)
|
||||
self.assertIsNotNone(kw['action_url'])
|
29
tests/views/test_principal.py
Normal file
29
tests/views/test_principal.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
from tailbone.views import principal as mod
|
||||
from tests.util import WebTestCase
|
||||
|
||||
|
||||
class TestPrincipalMasterView(WebTestCase):
|
||||
|
||||
def make_view(self):
|
||||
return mod.PrincipalMasterView(self.request)
|
||||
|
||||
def test_find_by_perm(self):
|
||||
model = self.app.model
|
||||
self.config.setdefault('rattail.web.menus.handler_spec', 'tests.util:NullMenuHandler')
|
||||
self.pyramid_config.include('tailbone.views.common')
|
||||
self.pyramid_config.include('tailbone.views.auth')
|
||||
self.pyramid_config.add_route('roles', '/roles/')
|
||||
with patch.multiple(mod.PrincipalMasterView, create=True,
|
||||
model_class=model.Role,
|
||||
get_help_url=MagicMock(return_value=None),
|
||||
get_help_markdown=MagicMock(return_value=None),
|
||||
can_edit_help=MagicMock(return_value=False)):
|
||||
|
||||
# sanity / coverage check
|
||||
view = self.make_view()
|
||||
response = view.find_by_perm()
|
||||
self.assertEqual(response.status_code, 200)
|
80
tests/views/test_roles.py
Normal file
80
tests/views/test_roles.py
Normal file
|
@ -0,0 +1,80 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from tailbone.views import roles as mod
|
||||
from tests.util import WebTestCase
|
||||
|
||||
|
||||
class TestRoleView(WebTestCase):
|
||||
|
||||
def make_view(self):
|
||||
return mod.RoleView(self.request)
|
||||
|
||||
def test_includeme(self):
|
||||
self.pyramid_config.include('tailbone.views.roles')
|
||||
|
||||
def get_permissions(self):
|
||||
return {
|
||||
'widgets': {
|
||||
'label': "Widgets",
|
||||
'perms': {
|
||||
'widgets.list': {
|
||||
'label': "List widgets",
|
||||
},
|
||||
'widgets.polish': {
|
||||
'label': "Polish the widgets",
|
||||
},
|
||||
'widgets.view': {
|
||||
'label': "View widget",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
def test_get_available_permissions(self):
|
||||
model = self.app.model
|
||||
auth = self.app.get_auth_handler()
|
||||
blokes = model.Role(name="Blokes")
|
||||
auth.grant_permission(blokes, 'widgets.list')
|
||||
self.session.add(blokes)
|
||||
barney = model.User(username='barney')
|
||||
barney.roles.append(blokes)
|
||||
self.session.add(barney)
|
||||
self.session.commit()
|
||||
view = self.make_view()
|
||||
all_perms = self.get_permissions()
|
||||
self.request.registry.settings['wutta_permissions'] = all_perms
|
||||
|
||||
def has_perm(perm):
|
||||
if perm == 'widgets.list':
|
||||
return True
|
||||
return False
|
||||
|
||||
with patch.object(self.request, 'has_perm', new=has_perm, create=True):
|
||||
|
||||
# sanity check; current request has 1 perm
|
||||
self.assertTrue(self.request.has_perm('widgets.list'))
|
||||
self.assertFalse(self.request.has_perm('widgets.polish'))
|
||||
self.assertFalse(self.request.has_perm('widgets.view'))
|
||||
|
||||
# when editing, user sees only the 1 perm
|
||||
with patch.object(view, 'editing', new=True):
|
||||
perms = view.get_available_permissions()
|
||||
self.assertEqual(list(perms), ['widgets'])
|
||||
self.assertEqual(list(perms['widgets']['perms']), ['widgets.list'])
|
||||
|
||||
# but when viewing, same user sees all perms
|
||||
with patch.object(view, 'viewing', new=True):
|
||||
perms = view.get_available_permissions()
|
||||
self.assertEqual(list(perms), ['widgets'])
|
||||
self.assertEqual(list(perms['widgets']['perms']),
|
||||
['widgets.list', 'widgets.polish', 'widgets.view'])
|
||||
|
||||
# also, when admin user is editing, sees all perms
|
||||
self.request.is_admin = True
|
||||
with patch.object(view, 'editing', new=True):
|
||||
perms = view.get_available_permissions()
|
||||
self.assertEqual(list(perms), ['widgets'])
|
||||
self.assertEqual(list(perms['widgets']['perms']),
|
||||
['widgets.list', 'widgets.polish', 'widgets.view'])
|
33
tests/views/test_users.py
Normal file
33
tests/views/test_users.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
from tailbone.views import users as mod
|
||||
from tailbone.views.principal import PermissionsRenderer
|
||||
from tests.util import WebTestCase
|
||||
|
||||
|
||||
class TestUserView(WebTestCase):
|
||||
|
||||
def make_view(self):
|
||||
return mod.UserView(self.request)
|
||||
|
||||
def test_includeme(self):
|
||||
self.pyramid_config.include('tailbone.views.users')
|
||||
|
||||
def test_configure_form(self):
|
||||
self.pyramid_config.include('tailbone.views.users')
|
||||
model = self.app.model
|
||||
barney = model.User(username='barney')
|
||||
self.session.add(barney)
|
||||
self.session.commit()
|
||||
view = self.make_view()
|
||||
|
||||
# must use mock configure when making form
|
||||
def configure(form): pass
|
||||
form = view.make_form(instance=barney, configure=configure)
|
||||
|
||||
with patch.object(view, 'viewing', new=True):
|
||||
self.assertNotIn('permissions', form.renderers)
|
||||
view.configure_form(form)
|
||||
self.assertIsInstance(form.renderers['permissions'], PermissionsRenderer)
|
Loading…
Add table
Add a link
Reference in a new issue