feat: add basic Delete support for CRUD master view
This commit is contained in:
parent
1a8fc8dd44
commit
c46b42f76d
12 changed files with 331 additions and 72 deletions
|
@ -21,7 +21,8 @@ class TestMasterView(WebTestCase):
|
|||
with patch.multiple(master.MasterView, create=True,
|
||||
model_name='Widget',
|
||||
viewable=False,
|
||||
editable=False):
|
||||
editable=False,
|
||||
deletable=False):
|
||||
master.MasterView.defaults(self.pyramid_config)
|
||||
|
||||
##############################
|
||||
|
@ -415,7 +416,7 @@ class TestMasterView(WebTestCase):
|
|||
self.assertNotIn('Required', response.text)
|
||||
|
||||
def persist(setting):
|
||||
self.app.save_setting(self.session, setting['name'], setting['value'])
|
||||
self.app.save_setting(self.session, 'foo.bar', setting['value'])
|
||||
self.session.commit()
|
||||
|
||||
# post request to save settings
|
||||
|
@ -427,15 +428,13 @@ class TestMasterView(WebTestCase):
|
|||
with patch.object(view, 'persist', new=persist):
|
||||
response = view.edit()
|
||||
# nb. should get redirect back to view page
|
||||
self.assertIsInstance(response, HTTPFound)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
# setting should be updated in DB
|
||||
self.assertEqual(self.app.get_setting(self.session, 'foo.bar'), 'froogle')
|
||||
|
||||
# try another post with invalid data (name is required)
|
||||
# try another post with invalid data (value is required)
|
||||
self.request.method = 'POST'
|
||||
self.request.POST = {
|
||||
'value': 'gargoyle',
|
||||
}
|
||||
self.request.POST = {}
|
||||
with patch.object(view, 'persist', new=persist):
|
||||
response = view.edit()
|
||||
# nb. should get a form with errors
|
||||
|
@ -444,6 +443,60 @@ class TestMasterView(WebTestCase):
|
|||
# setting did not change in DB
|
||||
self.assertEqual(self.app.get_setting(self.session, 'foo.bar'), 'froogle')
|
||||
|
||||
def test_delete(self):
|
||||
model = self.app.model
|
||||
self.app.save_setting(self.session, 'foo.bar', 'frazzle')
|
||||
self.session.commit()
|
||||
self.assertEqual(self.session.query(model.Setting).count(), 1)
|
||||
|
||||
def get_instance():
|
||||
setting = self.session.query(model.Setting).get('foo.bar')
|
||||
return {
|
||||
'name': setting.name,
|
||||
'value': setting.value,
|
||||
}
|
||||
|
||||
# sanity/coverage check using /settings/XXX/delete
|
||||
self.request.matchdict = {'name': 'foo.bar'}
|
||||
with patch.multiple(master.MasterView, create=True,
|
||||
model_name='Setting',
|
||||
model_key='name',
|
||||
form_fields=['name', 'value']):
|
||||
view = master.MasterView(self.request)
|
||||
with patch.object(view, 'get_instance', new=get_instance):
|
||||
|
||||
# get the form page
|
||||
response = view.delete()
|
||||
self.assertIsInstance(response, Response)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn('frazzle', response.text)
|
||||
|
||||
def delete_instance(setting):
|
||||
print(setting) # TODO
|
||||
self.app.delete_setting(self.session, setting['name'])
|
||||
|
||||
# post request to save settings
|
||||
self.request.method = 'POST'
|
||||
self.request.POST = {}
|
||||
with patch.object(view, 'delete_instance', new=delete_instance):
|
||||
response = view.delete()
|
||||
# nb. should get redirect back to view page
|
||||
self.assertEqual(response.status_code, 302)
|
||||
# setting should be gone from DB
|
||||
self.assertEqual(self.session.query(model.Setting).count(), 0)
|
||||
|
||||
def test_delete_instance(self):
|
||||
model = self.app.model
|
||||
self.app.save_setting(self.session, 'foo.bar', 'frazzle')
|
||||
self.session.commit()
|
||||
setting = self.session.query(model.Setting).one()
|
||||
|
||||
with patch.multiple(master.MasterView, create=True,
|
||||
model_class=model.Setting,
|
||||
form_fields=['name', 'value']):
|
||||
view = master.MasterView(self.request)
|
||||
self.assertRaises(NotImplementedError, view.delete_instance, setting)
|
||||
|
||||
def test_configure(self):
|
||||
model = self.app.model
|
||||
|
||||
|
|
|
@ -66,17 +66,6 @@ class TestSettingView(WebTestCase):
|
|||
title = view.get_instance_title(setting)
|
||||
self.assertEqual(title, 'foo')
|
||||
|
||||
def test_make_model_form(self):
|
||||
view = self.make_view()
|
||||
view.editing = True
|
||||
form = view.make_model_form()
|
||||
self.assertEqual(form.fields, ['name', 'value'])
|
||||
self.assertIn('name', form)
|
||||
self.assertIn('value', form)
|
||||
dform = form.get_deform()
|
||||
self.assertNotIn('name', dform)
|
||||
self.assertIn('value', dform)
|
||||
|
||||
def test_persist(self):
|
||||
model = self.app.model
|
||||
view = self.make_view()
|
||||
|
@ -92,3 +81,18 @@ class TestSettingView(WebTestCase):
|
|||
self.session.commit()
|
||||
self.assertEqual(self.session.query(model.Setting).count(), 1)
|
||||
self.assertEqual(self.app.get_setting(self.session, 'foo'), 'frazzle')
|
||||
|
||||
def test_delete_instance(self):
|
||||
model = self.app.model
|
||||
view = self.make_view()
|
||||
|
||||
# setup
|
||||
self.app.save_setting(self.session, 'foo', 'bar')
|
||||
self.session.commit()
|
||||
self.assertEqual(self.session.query(model.Setting).count(), 1)
|
||||
|
||||
# setting is deleted
|
||||
self.request.matchdict = {'name': 'foo'}
|
||||
view.delete_instance({'name': 'foo', 'value': 'frazzle'}, session=self.session)
|
||||
self.session.commit()
|
||||
self.assertEqual(self.session.query(model.Setting).count(), 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue