feat: add basic support for rows grid for master, batch views
This commit is contained in:
parent
5006c97b4b
commit
e3beb9953d
5 changed files with 573 additions and 11 deletions
|
@ -3,6 +3,7 @@
|
|||
import datetime
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
from sqlalchemy import orm
|
||||
from pyramid.httpexceptions import HTTPFound
|
||||
|
||||
from wuttjamaican.db import model
|
||||
|
@ -19,12 +20,23 @@ class MockBatchRow(model.BatchRowMixin, model.Base):
|
|||
__tablename__ = 'testing_batch_mock_row'
|
||||
__batch_class__ = MockBatch
|
||||
|
||||
MockBatch.__row_class__ = MockBatchRow
|
||||
|
||||
class MockBatchHandler(BatchHandler):
|
||||
model_class = MockBatch
|
||||
|
||||
|
||||
class TestBatchMasterView(WebTestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.setup_web()
|
||||
|
||||
# nb. create MockBatch, MockBatchRow
|
||||
model.Base.metadata.create_all(bind=self.session.bind)
|
||||
|
||||
def make_view(self):
|
||||
return mod.BatchMasterView(self.request)
|
||||
|
||||
def test_get_batch_handler(self):
|
||||
self.assertRaises(NotImplementedError, mod.BatchMasterView, self.request)
|
||||
|
||||
|
@ -200,3 +212,78 @@ class TestBatchMasterView(WebTestCase):
|
|||
self.session.commit()
|
||||
# nb. should give up waiting after 1 second
|
||||
self.assertRaises(RuntimeError, view.populate_thread, batch.uuid)
|
||||
|
||||
def test_get_row_model_class(self):
|
||||
handler = MockBatchHandler(self.config)
|
||||
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
|
||||
view = self.make_view()
|
||||
|
||||
self.assertRaises(AttributeError, view.get_row_model_class)
|
||||
|
||||
# row class determined from batch class
|
||||
with patch.object(mod.BatchMasterView, 'model_class', new=MockBatch, create=True):
|
||||
cls = view.get_row_model_class()
|
||||
self.assertIs(cls, MockBatchRow)
|
||||
|
||||
self.assertRaises(AttributeError, view.get_row_model_class)
|
||||
|
||||
# view may specify row class
|
||||
with patch.object(mod.BatchMasterView, 'row_model_class', new=MockBatchRow, create=True):
|
||||
cls = view.get_row_model_class()
|
||||
self.assertIs(cls, MockBatchRow)
|
||||
|
||||
def test_get_row_grid_data(self):
|
||||
handler = MockBatchHandler(self.config)
|
||||
model = self.app.model
|
||||
|
||||
user = model.User(username='barney')
|
||||
self.session.add(user)
|
||||
|
||||
batch = handler.make_batch(self.session, created_by=user)
|
||||
self.session.add(batch)
|
||||
row = handler.make_row()
|
||||
handler.add_row(batch, row)
|
||||
self.session.flush()
|
||||
|
||||
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
|
||||
|
||||
view = self.make_view()
|
||||
self.assertRaises(AttributeError, view.get_row_grid_data, batch)
|
||||
|
||||
Session = MagicMock(return_value=self.session)
|
||||
Session.query.side_effect = lambda m: self.session.query(m)
|
||||
with patch.multiple(mod.BatchMasterView, create=True,
|
||||
Session=Session,
|
||||
model_class=MockBatch):
|
||||
|
||||
view = self.make_view()
|
||||
data = view.get_row_grid_data(batch)
|
||||
self.assertIsInstance(data, orm.Query)
|
||||
self.assertEqual(data.count(), 1)
|
||||
|
||||
def test_configure_row_grid(self):
|
||||
handler = MockBatchHandler(self.config)
|
||||
model = self.app.model
|
||||
|
||||
user = model.User(username='barney')
|
||||
self.session.add(user)
|
||||
|
||||
batch = handler.make_batch(self.session, created_by=user)
|
||||
self.session.add(batch)
|
||||
row = handler.make_row()
|
||||
handler.add_row(batch, row)
|
||||
self.session.flush()
|
||||
|
||||
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
|
||||
|
||||
Session = MagicMock(return_value=self.session)
|
||||
Session.query.side_effect = lambda m: self.session.query(m)
|
||||
with patch.multiple(mod.BatchMasterView, create=True,
|
||||
Session=Session,
|
||||
model_class=MockBatch):
|
||||
|
||||
with patch.object(self.request, 'matchdict', new={'uuid': batch.uuid}):
|
||||
view = self.make_view()
|
||||
grid = view.make_row_model_grid(batch)
|
||||
self.assertIn('sequence', grid.labels)
|
||||
self.assertEqual(grid.labels['sequence'], "Seq.")
|
||||
|
|
|
@ -334,6 +334,16 @@ class TestMasterView(WebTestCase):
|
|||
model_class=MyModel):
|
||||
self.assertEqual(mod.MasterView.get_config_title(), "Dinosaurs")
|
||||
|
||||
def test_get_row_model_class(self):
|
||||
model = self.app.model
|
||||
|
||||
# no default
|
||||
self.assertIsNone(mod.MasterView.get_row_model_class())
|
||||
|
||||
# class may specify
|
||||
with patch.object(mod.MasterView, 'row_model_class', create=True, new=model.User):
|
||||
self.assertIs(mod.MasterView.get_row_model_class(), model.User)
|
||||
|
||||
##############################
|
||||
# support methods
|
||||
##############################
|
||||
|
@ -1017,6 +1027,53 @@ class TestMasterView(WebTestCase):
|
|||
with patch.object(view, 'get_instance', return_value=setting):
|
||||
response = view.view()
|
||||
|
||||
def test_view_with_rows(self):
|
||||
self.pyramid_config.include('wuttaweb.views.common')
|
||||
self.pyramid_config.include('wuttaweb.views.auth')
|
||||
self.pyramid_config.add_route('people', '/people/')
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Whitney Houston")
|
||||
self.session.add(person)
|
||||
user = model.User(username='whitney', person=person)
|
||||
self.session.add(user)
|
||||
self.session.commit()
|
||||
|
||||
get_row_grid_data = MagicMock()
|
||||
with patch.multiple(mod.MasterView, create=True,
|
||||
Session=MagicMock(return_value=self.session),
|
||||
model_class=model.Person,
|
||||
route_prefix='people',
|
||||
has_rows=True,
|
||||
row_model_class=model.User,
|
||||
get_row_grid_data=get_row_grid_data):
|
||||
with patch.object(self.request, 'matchdict', new={'uuid': person.uuid}):
|
||||
view = self.make_view()
|
||||
|
||||
# just for coverage
|
||||
get_row_grid_data.return_value = []
|
||||
response = view.view()
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.content_type, 'text/html')
|
||||
|
||||
# now with data...
|
||||
get_row_grid_data.return_value = [user]
|
||||
response = view.view()
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.content_type, 'text/html')
|
||||
|
||||
# then once more as 'partial' - aka. data only
|
||||
with patch.dict(self.request.GET, {'partial': 1}):
|
||||
response = view.view()
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.content_type, 'application/json')
|
||||
|
||||
# redirects when view is reset
|
||||
with patch.dict(self.request.GET, {'reset-view': '1', 'hash': 'foo'}):
|
||||
# nb. mock current route
|
||||
with patch.object(self.request, 'current_route_url'):
|
||||
response = view.view()
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_edit(self):
|
||||
self.pyramid_config.include('wuttaweb.views.common')
|
||||
self.pyramid_config.include('wuttaweb.views.auth')
|
||||
|
@ -1501,3 +1558,103 @@ class TestMasterView(WebTestCase):
|
|||
# should now have 0 settings
|
||||
count = self.session.query(model.Setting).count()
|
||||
self.assertEqual(count, 0)
|
||||
|
||||
##############################
|
||||
# row methods
|
||||
##############################
|
||||
|
||||
def test_collect_row_labels(self):
|
||||
|
||||
# default labels
|
||||
view = self.make_view()
|
||||
labels = view.collect_row_labels()
|
||||
self.assertEqual(labels, {})
|
||||
|
||||
# labels come from all classes; subclass wins
|
||||
with patch.object(View, 'row_labels', create=True, new={'foo': "Foo", 'bar': "Bar"}):
|
||||
with patch.object(mod.MasterView, 'row_labels', create=True, new={'foo': "FOO FIGHTERS"}):
|
||||
view = self.make_view()
|
||||
labels = view.collect_row_labels()
|
||||
self.assertEqual(labels, {'foo': "FOO FIGHTERS", 'bar': "Bar"})
|
||||
|
||||
def test_set_row_labels(self):
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Fred Flintstone")
|
||||
self.session.add(person)
|
||||
|
||||
with patch.multiple(mod.MasterView, create=True,
|
||||
model_class=model.Person,
|
||||
has_rows=True,
|
||||
row_model_class=model.User):
|
||||
|
||||
# no labels by default
|
||||
view = self.make_view()
|
||||
grid = view.make_row_model_grid(person, key='person.users', data=[])
|
||||
view.set_row_labels(grid)
|
||||
self.assertEqual(grid.labels, {})
|
||||
|
||||
# labels come from all classes; subclass wins
|
||||
with patch.object(View, 'row_labels', create=True, new={'username': "USERNAME"}):
|
||||
with patch.object(mod.MasterView, 'row_labels', create=True, new={'username': "UserName"}):
|
||||
view = self.make_view()
|
||||
grid = view.make_row_model_grid(person, key='person.users', data=[])
|
||||
view.set_row_labels(grid)
|
||||
self.assertEqual(grid.labels, {'username': "UserName"})
|
||||
|
||||
def test_get_row_grid_data(self):
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Fred Flintstone")
|
||||
self.session.add(person)
|
||||
view = self.make_view()
|
||||
self.assertRaises(NotImplementedError, view.get_row_grid_data, person)
|
||||
|
||||
def test_get_row_grid_columns(self):
|
||||
|
||||
# no default
|
||||
view = self.make_view()
|
||||
self.assertIsNone(view.get_row_grid_columns())
|
||||
|
||||
# class may specify
|
||||
with patch.object(view, 'row_grid_columns', create=True, new=['foo', 'bar']):
|
||||
self.assertEqual(view.get_row_grid_columns(), ['foo', 'bar'])
|
||||
|
||||
def test_get_row_grid_key(self):
|
||||
view = self.make_view()
|
||||
with patch.multiple(mod.MasterView, create=True,
|
||||
model_key='id',
|
||||
grid_key='widgets'):
|
||||
|
||||
self.request.matchdict = {'id': 42}
|
||||
self.assertEqual(view.get_row_grid_key(), 'widgets.42')
|
||||
|
||||
def test_make_row_model_grid(self):
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Barney Rubble")
|
||||
self.session.add(person)
|
||||
self.session.commit()
|
||||
|
||||
self.request.matchdict = {'uuid': person.uuid}
|
||||
with patch.multiple(mod.MasterView, create=True,
|
||||
model_class=model.Person):
|
||||
view = self.make_view()
|
||||
|
||||
# specify data
|
||||
grid = view.make_row_model_grid(person, data=[])
|
||||
self.assertIsNone(grid.model_class)
|
||||
self.assertEqual(grid.data, [])
|
||||
|
||||
# fetch data
|
||||
with patch.object(view, 'get_row_grid_data', return_value=[]):
|
||||
grid = view.make_row_model_grid(person)
|
||||
self.assertIsNone(grid.model_class)
|
||||
self.assertEqual(grid.data, [])
|
||||
|
||||
def test_get_rows_title(self):
|
||||
view = self.make_view()
|
||||
|
||||
# no default
|
||||
self.assertIsNone(view.get_rows_title())
|
||||
|
||||
# class may specify
|
||||
with patch.object(view, 'rows_title', create=True, new="Mock Rows"):
|
||||
self.assertEqual(view.get_rows_title(), "Mock Rows")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue