3
0
Fork 0

fix: add basic create_row() support, esp. for batch views

This commit is contained in:
Lance Edgar 2025-12-04 22:57:12 -06:00
parent 66eccc52a2
commit 10610d5809
6 changed files with 696 additions and 48 deletions

View file

@ -156,6 +156,17 @@ class TestBatchMasterView(WebTestCase):
form = view.make_model_form(model_instance=batch)
view.configure_form(form)
def test_is_editable(self):
handler = self.make_handler()
with patch.object(
mod.BatchMasterView, "get_batch_handler", return_value=handler
):
view = self.make_view()
batch = handler.make_batch(self.session)
self.assertTrue(view.is_editable(batch))
batch.executed = datetime.datetime.now()
self.assertFalse(view.is_editable(batch))
def test_objectify(self):
handler = self.make_handler()
with patch.multiple(mod.BatchMasterView, create=True, model_class=MockBatch):
@ -345,24 +356,33 @@ class TestBatchMasterView(WebTestCase):
):
view = self.make_view()
self.assertRaises(AttributeError, view.get_row_model_class)
self.assertIsNone(view.get_row_model_class())
# row class determined from batch class
with patch.object(
mod.BatchMasterView, "model_class", new=MockBatch, create=True
):
with patch.object(mod.BatchMasterView, "model_class", new=MockBatch):
cls = view.get_row_model_class()
self.assertIs(cls, MockBatchRow)
self.assertRaises(AttributeError, view.get_row_model_class)
self.assertIsNone(view.get_row_model_class())
# view may specify row class
with patch.object(
mod.BatchMasterView, "row_model_class", new=MockBatchRow, create=True
):
with patch.object(mod.BatchMasterView, "row_model_class", new=MockBatchRow):
cls = view.get_row_model_class()
self.assertIs(cls, MockBatchRow)
def test_get_row_parent(self):
handler = self.make_handler()
with patch.object(
mod.BatchMasterView, "get_batch_handler", return_value=handler
):
view = self.make_view()
batch = handler.make_batch(self.session)
self.session.add(batch)
row = handler.make_row()
handler.add_row(batch, row)
parent = view.get_row_parent(row)
self.assertIs(parent, batch)
def test_get_row_grid_data(self):
handler = self.make_handler()
model = self.app.model
@ -395,6 +415,9 @@ class TestBatchMasterView(WebTestCase):
self.assertEqual(data.count(), 1)
def test_configure_row_grid(self):
self.pyramid_config.add_route(
"mock_batches.create_row", "/batch/mock/{uuid}/new-row"
)
handler = self.make_handler()
model = self.app.model
@ -410,18 +433,50 @@ class TestBatchMasterView(WebTestCase):
with patch.object(
mod.BatchMasterView, "get_batch_handler", return_value=handler
):
view = self.make_view()
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(
mod.BatchMasterView, "Session", return_value=self.session
):
with patch.multiple(
mod.BatchMasterView,
model_class=MockBatch,
route_prefix="mock_batches",
create=True,
):
with patch.object(
self.request, "matchdict", new={"uuid": batch.uuid}
):
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.")
# basic sanity check
grid = view.make_row_model_grid(batch)
self.assertEqual(
grid.columns, ["sequence", "status_code", "modified"]
)
self.assertIn("sequence", grid.labels)
self.assertEqual(grid.labels["sequence"], "Seq.")
self.assertEqual(grid.tools, {})
# missing 'sequence' column
grid = view.make_row_model_grid(
batch, columns=["status_code", "modified"]
)
self.assertEqual(grid.columns, ["status_code", "modified"])
# sequence column is made to be first if present
grid = view.make_row_model_grid(
batch, columns=["status_code", "modified", "sequence"]
)
self.assertEqual(
grid.columns, ["sequence", "status_code", "modified"]
)
# with "create row" button
with patch.object(
self.request, "is_root", new=True, create=True
):
grid = view.make_row_model_grid(batch)
self.assertIn("create_row", grid.tools)
def test_render_row_status(self):
with patch.object(mod.BatchMasterView, "get_batch_handler", return_value=None):
@ -429,9 +484,53 @@ class TestBatchMasterView(WebTestCase):
row = MagicMock(foo=1, STATUS={1: "bar"})
self.assertEqual(view.render_row_status(row, "foo", 1), "bar")
def test_configure_row_form(self):
handler = self.make_handler()
with patch.object(
mod.BatchMasterView, "get_batch_handler", return_value=handler
):
view = self.make_view()
# some fields are readonly by default
form = view.make_form(model_class=MockBatchRow)
view.configure_row_form(form)
self.assertIn("sequence", form.fields)
self.assertTrue(form.is_readonly("sequence"))
self.assertIn("status_code", form.fields)
self.assertTrue(form.is_readonly("status_code"))
self.assertIn("modified", form.fields)
self.assertTrue(form.is_readonly("modified"))
# but those fields are removed when creating
with patch.object(view, "creating", new=True):
form = view.make_form(model_class=MockBatchRow)
view.configure_row_form(form)
self.assertNotIn("sequence", form.fields)
self.assertNotIn("status_code", form.fields)
self.assertNotIn("modified", form.fields)
def test_create_row_save_form(self):
handler = self.make_handler()
batch = MockBatch()
row = MockBatchRow()
with patch.object(
mod.BatchMasterView, "get_batch_handler", return_value=handler
):
with patch.object(
mod.BatchMasterView, "Session", return_value=self.session
):
view = self.make_view()
form = view.make_form(model_class=MockBatchRow)
with patch.object(view, "get_instance", return_value=batch):
with patch.object(view, "objectify", return_value=row):
with patch.object(handler, "add_row") as add_row:
view.create_row_save_form(form)
add_row.assert_called_once_with(batch, row)
def test_defaults(self):
# nb. coverage only
with patch.object(
mod.BatchMasterView, "model_class", new=MockBatch, create=True
):
with patch.object(mod.BatchMasterView, "model_class", new=MockBatch):
mod.BatchMasterView.defaults(self.pyramid_config)