| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | # -*- coding: utf-8; -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import datetime | 
					
						
							|  |  |  | from unittest.mock import patch, MagicMock | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | from sqlalchemy import orm | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | from pyramid.httpexceptions import HTTPFound | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from wuttjamaican.db import model | 
					
						
							|  |  |  | from wuttjamaican.batch import BatchHandler | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | from wuttaweb.views import MasterView, batch as mod | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | from wuttaweb.progress import SessionProgress | 
					
						
							| 
									
										
										
										
											2025-01-06 16:47:48 -06:00
										 |  |  | from wuttaweb.testing import WebTestCase | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MockBatch(model.BatchMixin, model.Base): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |     __tablename__ = "testing_batch_mock" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MockBatchRow(model.BatchRowMixin, model.Base): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |     __tablename__ = "testing_batch_mock_row" | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |     __batch_class__ = MockBatch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | MockBatch.__row_class__ = MockBatchRow | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | class MockBatchHandler(BatchHandler): | 
					
						
							|  |  |  |     model_class = MockBatch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestBatchMasterView(WebTestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |     def make_handler(self): | 
					
						
							|  |  |  |         return MockBatchHandler(self.config) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |     def make_view(self): | 
					
						
							|  |  |  |         return mod.BatchMasterView(self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |     def test_get_batch_handler(self): | 
					
						
							|  |  |  |         self.assertRaises(NotImplementedError, mod.BatchMasterView, self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(mod.BatchMasterView, "get_batch_handler", return_value=42): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |             view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  |             self.assertEqual(view.batch_handler, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |     def test_get_fallback_templates(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |             view = self.make_view() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             templates = view.get_fallback_templates("view") | 
					
						
							|  |  |  |             self.assertEqual( | 
					
						
							|  |  |  |                 templates, | 
					
						
							|  |  |  |                 [ | 
					
						
							|  |  |  |                     "/batch/view.mako", | 
					
						
							|  |  |  |                     "/master/view.mako", | 
					
						
							|  |  |  |                 ], | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_render_to_response(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |         self.session.add(user) | 
					
						
							|  |  |  |         batch = handler.make_batch(self.session, created_by=user) | 
					
						
							|  |  |  |         self.session.add(batch) | 
					
						
							|  |  |  |         self.session.flush() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							|  |  |  |             with patch.object(MasterView, "render_to_response") as render_to_response: | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |                 view = self.make_view() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 response = view.render_to_response("view", {"instance": batch}) | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |                 self.assertTrue(render_to_response.called) | 
					
						
							|  |  |  |                 context = render_to_response.call_args[0][1] | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 self.assertIs(context["batch"], batch) | 
					
						
							|  |  |  |                 self.assertIs(context["batch_handler"], handler) | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |     def test_configure_grid(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |         with patch.multiple(mod.BatchMasterView, create=True, model_class=MockBatch): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object( | 
					
						
							|  |  |  |                 mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                 view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  |                 grid = view.make_model_grid() | 
					
						
							|  |  |  |                 # nb. coverage only; tests nothing | 
					
						
							|  |  |  |                 view.configure_grid(grid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_render_batch_id(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |             view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  |             batch = MockBatch(id=42) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             result = view.render_batch_id(batch, "id", 42) | 
					
						
							|  |  |  |             self.assertEqual(result, "00000042") | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             result = view.render_batch_id(batch, "id", None) | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |             self.assertIsNone(result) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_instance_title(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |             view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             batch = MockBatch(id=42) | 
					
						
							|  |  |  |             result = view.get_instance_title(batch) | 
					
						
							|  |  |  |             self.assertEqual(result, "00000042") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             batch = MockBatch(id=43, description="runnin some numbers") | 
					
						
							|  |  |  |             result = view.get_instance_title(batch) | 
					
						
							|  |  |  |             self.assertEqual(result, "00000043 runnin some numbers") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_configure_form(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |         with patch.multiple(mod.BatchMasterView, create=True, model_class=MockBatch): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object( | 
					
						
							|  |  |  |                 mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                 view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # creating | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(view, "creating", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     form = view.make_model_form(model_instance=None) | 
					
						
							|  |  |  |                     view.configure_form(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 batch = MockBatch(id=42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # viewing | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(view, "viewing", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     form = view.make_model_form(model_instance=batch) | 
					
						
							|  |  |  |                     view.configure_form(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # editing | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(view, "editing", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     form = view.make_model_form(model_instance=batch) | 
					
						
							|  |  |  |                     view.configure_form(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # deleting | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(view, "deleting", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     form = view.make_model_form(model_instance=batch) | 
					
						
							|  |  |  |                     view.configure_form(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # viewing (executed) | 
					
						
							|  |  |  |                 batch.executed = datetime.datetime.now() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(view, "viewing", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     form = view.make_model_form(model_instance=batch) | 
					
						
							|  |  |  |                     view.configure_form(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_objectify(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |         with patch.multiple(mod.BatchMasterView, create=True, model_class=MockBatch): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object( | 
					
						
							|  |  |  |                 mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |             ): | 
					
						
							|  |  |  |                 with patch.object( | 
					
						
							|  |  |  |                     mod.BatchMasterView, "Session", return_value=self.session | 
					
						
							|  |  |  |                 ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # create batch | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                     with patch.object(view, "creating", new=True): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                         form = view.make_model_form(model_instance=None) | 
					
						
							|  |  |  |                         form.validated = {} | 
					
						
							|  |  |  |                         batch = view.objectify(form) | 
					
						
							|  |  |  |                         self.assertIsInstance(batch.id, int) | 
					
						
							|  |  |  |                         self.assertTrue(batch.id > 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # edit batch | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                     with patch.object(view, "editing", new=True): | 
					
						
							|  |  |  |                         with patch.object( | 
					
						
							|  |  |  |                             view.batch_handler, "make_batch" | 
					
						
							|  |  |  |                         ) as make_batch: | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                             form = view.make_model_form(model_instance=batch) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                             form.validated = {"description": "foo"} | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                             self.assertIsNone(batch.description) | 
					
						
							|  |  |  |                             batch = view.objectify(form) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                             self.assertEqual(batch.description, "foo") | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_redirect_after_create(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config.add_route("mock_batches.view", "/batch/mock/{uuid}") | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							|  |  |  |             with patch.multiple( | 
					
						
							|  |  |  |                 mod.BatchMasterView, | 
					
						
							|  |  |  |                 create=True, | 
					
						
							|  |  |  |                 model_class=MockBatch, | 
					
						
							|  |  |  |                 route_prefix="mock_batches", | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                 view = mod.BatchMasterView(self.request) | 
					
						
							|  |  |  |                 batch = MockBatch(id=42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # typically redirect to view batch | 
					
						
							|  |  |  |                 result = view.redirect_after_create(batch) | 
					
						
							|  |  |  |                 self.assertIsInstance(result, HTTPFound) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # unless populating in which case thread is launched | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 self.request.session.id = "abcdefghijk" | 
					
						
							|  |  |  |                 with patch.object(mod, "threading") as threading: | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                     thread = MagicMock() | 
					
						
							|  |  |  |                     threading.Thread.return_value = thread | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                     with patch.object( | 
					
						
							|  |  |  |                         view.batch_handler, "should_populate", return_value=True | 
					
						
							|  |  |  |                     ): | 
					
						
							|  |  |  |                         with patch.object(view, "render_progress") as render_progress: | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                             view.redirect_after_create(batch) | 
					
						
							|  |  |  |                             self.assertTrue(threading.Thread.called) | 
					
						
							|  |  |  |                             thread.start.assert_called_once_with() | 
					
						
							|  |  |  |                             self.assertTrue(render_progress.called) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |     def test_delete_instance(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							|  |  |  |         handler = self.make_handler() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |         self.session.add(user) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         batch = handler.make_batch(self.session, created_by=user) | 
					
						
							|  |  |  |         self.session.add(batch) | 
					
						
							|  |  |  |         self.session.flush() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |             view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertEqual(self.session.query(MockBatch).count(), 1) | 
					
						
							|  |  |  |             view.delete_instance(batch) | 
					
						
							|  |  |  |             self.assertEqual(self.session.query(MockBatch).count(), 0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |     def test_populate_thread(self): | 
					
						
							|  |  |  |         model = self.app.model | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							|  |  |  |             with patch.multiple( | 
					
						
							|  |  |  |                 mod.BatchMasterView, create=True, model_class=MockBatch | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                 view = mod.BatchMasterView(self.request) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                 self.session.add(user) | 
					
						
							|  |  |  |                 batch = MockBatch(id=42, created_by=user) | 
					
						
							|  |  |  |                 self.session.add(batch) | 
					
						
							|  |  |  |                 self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # nb. use our session within thread method | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(self.app, "make_session", return_value=self.session): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     # nb. prevent closing our session | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                     with patch.object(self.session, "close") as close: | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         # without progress | 
					
						
							|  |  |  |                         view.populate_thread(batch.uuid) | 
					
						
							|  |  |  |                         close.assert_called_once_with() | 
					
						
							|  |  |  |                         close.reset_mock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         # with progress | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                         self.request.session.id = "abcdefghijk" | 
					
						
							|  |  |  |                         view.populate_thread( | 
					
						
							|  |  |  |                             batch.uuid, | 
					
						
							|  |  |  |                             progress=SessionProgress( | 
					
						
							|  |  |  |                                 self.request, "populate_mock_batch" | 
					
						
							|  |  |  |                             ), | 
					
						
							|  |  |  |                         ) | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                         close.assert_called_once_with() | 
					
						
							|  |  |  |                         close.reset_mock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         # failure to populate, without progress | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                         with patch.object( | 
					
						
							|  |  |  |                             view.batch_handler, "do_populate", side_effect=RuntimeError | 
					
						
							|  |  |  |                         ): | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                             view.populate_thread(batch.uuid) | 
					
						
							|  |  |  |                             close.assert_called_once_with() | 
					
						
							|  |  |  |                             close.reset_mock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         # failure to populate, with progress | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                         with patch.object( | 
					
						
							|  |  |  |                             view.batch_handler, "do_populate", side_effect=RuntimeError | 
					
						
							|  |  |  |                         ): | 
					
						
							|  |  |  |                             view.populate_thread( | 
					
						
							|  |  |  |                                 batch.uuid, | 
					
						
							|  |  |  |                                 progress=SessionProgress( | 
					
						
							|  |  |  |                                     self.request, "populate_mock_batch" | 
					
						
							|  |  |  |                                 ), | 
					
						
							|  |  |  |                             ) | 
					
						
							| 
									
										
										
										
											2024-12-13 22:20:04 -06:00
										 |  |  |                             close.assert_called_once_with() | 
					
						
							|  |  |  |                             close.reset_mock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         # failure for batch to appear | 
					
						
							|  |  |  |                         self.session.delete(batch) | 
					
						
							|  |  |  |                         self.session.commit() | 
					
						
							|  |  |  |                         # nb. should give up waiting after 1 second | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                         self.assertRaises( | 
					
						
							|  |  |  |                             RuntimeError, view.populate_thread, batch.uuid | 
					
						
							|  |  |  |                         ) | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |     def test_execute(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         self.pyramid_config.add_route("mock_batches.view", "/batch/mock/{uuid}") | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |         model = self.app.model | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |         self.session.add(user) | 
					
						
							|  |  |  |         batch = handler.make_batch(self.session, created_by=user) | 
					
						
							|  |  |  |         self.session.add(batch) | 
					
						
							|  |  |  |         self.session.commit() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.multiple( | 
					
						
							|  |  |  |             mod.BatchMasterView, | 
					
						
							|  |  |  |             create=True, | 
					
						
							|  |  |  |             model_class=MockBatch, | 
					
						
							|  |  |  |             route_prefix="mock_batches", | 
					
						
							|  |  |  |             get_batch_handler=MagicMock(return_value=handler), | 
					
						
							|  |  |  |             get_instance=MagicMock(return_value=batch), | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |             view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # batch executes okay | 
					
						
							|  |  |  |             response = view.execute() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             self.assertEqual(response.status_code, 302)  # redirect to "view batch" | 
					
						
							|  |  |  |             self.assertFalse(self.request.session.peek_flash("error")) | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             # but cannot be executed again | 
					
						
							|  |  |  |             response = view.execute() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             self.assertEqual(response.status_code, 302)  # redirect to "view batch" | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |             # nb. flash has error this time | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             self.assertTrue(self.request.session.peek_flash("error")) | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |     def test_get_row_model_class(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |             view = self.make_view() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertRaises(AttributeError, view.get_row_model_class) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # row class determined from batch class | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object( | 
					
						
							|  |  |  |                 mod.BatchMasterView, "model_class", new=MockBatch, create=True | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |                 cls = view.get_row_model_class() | 
					
						
							|  |  |  |                 self.assertIs(cls, MockBatchRow) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.assertRaises(AttributeError, view.get_row_model_class) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # view may specify row class | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.object( | 
					
						
							|  |  |  |                 mod.BatchMasterView, "row_model_class", new=MockBatchRow, create=True | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |                 cls = view.get_row_model_class() | 
					
						
							|  |  |  |                 self.assertIs(cls, MockBatchRow) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_get_row_grid_data(self): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |         model = self.app.model | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |         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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             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) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.multiple( | 
					
						
							|  |  |  |                 mod.BatchMasterView, create=True, Session=Session, model_class=MockBatch | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 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): | 
					
						
							| 
									
										
										
										
											2025-10-29 18:32:35 -05:00
										 |  |  |         handler = self.make_handler() | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |         model = self.app.model | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         user = model.User(username="barney") | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |         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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "get_batch_handler", return_value=handler | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |             Session = MagicMock(return_value=self.session) | 
					
						
							|  |  |  |             Session.query.side_effect = lambda m: self.session.query(m) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             with patch.multiple( | 
					
						
							|  |  |  |                 mod.BatchMasterView, create=True, Session=Session, model_class=MockBatch | 
					
						
							|  |  |  |             ): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                 with patch.object(self.request, "matchdict", new={"uuid": batch.uuid}): | 
					
						
							| 
									
										
										
										
											2024-12-14 10:38:49 -06:00
										 |  |  |                     view = self.make_view() | 
					
						
							|  |  |  |                     grid = view.make_row_model_grid(batch) | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |                     self.assertIn("sequence", grid.labels) | 
					
						
							|  |  |  |                     self.assertEqual(grid.labels["sequence"], "Seq.") | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-02 23:14:10 -06:00
										 |  |  |     def test_render_row_status(self): | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object(mod.BatchMasterView, "get_batch_handler", return_value=None): | 
					
						
							| 
									
										
										
										
											2025-01-02 23:14:10 -06:00
										 |  |  |             view = self.make_view() | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |             row = MagicMock(foo=1, STATUS={1: "bar"}) | 
					
						
							|  |  |  |             self.assertEqual(view.render_row_status(row, "foo", 1), "bar") | 
					
						
							| 
									
										
										
										
											2025-01-02 23:14:10 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |     def test_defaults(self): | 
					
						
							|  |  |  |         # nb. coverage only | 
					
						
							| 
									
										
										
										
											2025-08-31 12:26:43 -05:00
										 |  |  |         with patch.object( | 
					
						
							|  |  |  |             mod.BatchMasterView, "model_class", new=MockBatch, create=True | 
					
						
							|  |  |  |         ): | 
					
						
							| 
									
										
										
										
											2024-12-14 20:42:57 -06:00
										 |  |  |             mod.BatchMasterView.defaults(self.pyramid_config) |