3
0
Fork 0

feat: add basic support for batch execution

no execution options yet, and no progress indicator

also basic delete support, invoking handler
This commit is contained in:
Lance Edgar 2024-12-14 20:42:57 -06:00
parent e3beb9953d
commit dd1fd8c0ce
9 changed files with 404 additions and 11 deletions

View file

@ -8,7 +8,7 @@ from pyramid.httpexceptions import HTTPFound
from wuttjamaican.db import model
from wuttjamaican.batch import BatchHandler
from wuttaweb.views import batch as mod
from wuttaweb.views import MasterView, batch as mod
from wuttaweb.progress import SessionProgress
from tests.util import WebTestCase
@ -34,6 +34,9 @@ class TestBatchMasterView(WebTestCase):
# nb. create MockBatch, MockBatchRow
model.Base.metadata.create_all(bind=self.session.bind)
def make_handler(self):
return MockBatchHandler(self.config)
def make_view(self):
return mod.BatchMasterView(self.request)
@ -44,6 +47,35 @@ class TestBatchMasterView(WebTestCase):
view = mod.BatchMasterView(self.request)
self.assertEqual(view.batch_handler, 42)
def test_get_fallback_templates(self):
handler = MockBatchHandler(self.config)
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
view = self.make_view()
templates = view.get_fallback_templates('view')
self.assertEqual(templates, [
'/batch/view.mako',
'/master/view.mako',
])
def test_render_to_response(self):
model = self.app.model
handler = MockBatchHandler(self.config)
user = model.User(username='barney')
self.session.add(user)
batch = handler.make_batch(self.session, created_by=user)
self.session.add(batch)
self.session.flush()
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
with patch.object(MasterView, 'render_to_response') as render_to_response:
view = self.make_view()
response = view.render_to_response('view', {'instance': batch})
self.assertTrue(render_to_response.called)
context = render_to_response.call_args[0][1]
self.assertIs(context['batch'], batch)
self.assertIs(context['batch_handler'], handler)
def test_configure_grid(self):
handler = MockBatchHandler(self.config)
with patch.multiple(mod.BatchMasterView, create=True, model_class=MockBatch):
@ -162,6 +194,24 @@ class TestBatchMasterView(WebTestCase):
thread.start.assert_called_once_with()
self.assertTrue(render_progress.called)
def test_delete_instance(self):
model = self.app.model
handler = self.make_handler()
user = model.User(username='barney')
self.session.add(user)
batch = handler.make_batch(self.session, created_by=user)
self.session.add(batch)
self.session.flush()
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
view = self.make_view()
self.assertEqual(self.session.query(MockBatch).count(), 1)
view.delete_instance(batch)
self.assertEqual(self.session.query(MockBatch).count(), 0)
def test_populate_thread(self):
model = self.app.model
handler = MockBatchHandler(self.config)
@ -213,6 +263,35 @@ class TestBatchMasterView(WebTestCase):
# nb. should give up waiting after 1 second
self.assertRaises(RuntimeError, view.populate_thread, batch.uuid)
def test_execute(self):
self.pyramid_config.add_route('mock_batches.view', '/batch/mock/{uuid}')
model = self.app.model
handler = MockBatchHandler(self.config)
user = model.User(username='barney')
self.session.add(user)
batch = handler.make_batch(self.session, created_by=user)
self.session.add(batch)
self.session.commit()
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)):
view = self.make_view()
# batch executes okay
response = view.execute()
self.assertEqual(response.status_code, 302) # redirect to "view batch"
self.assertFalse(self.request.session.peek_flash('error'))
# but cannot be executed again
response = view.execute()
self.assertEqual(response.status_code, 302) # redirect to "view batch"
# nb. flash has error this time
self.assertTrue(self.request.session.peek_flash('error'))
def test_get_row_model_class(self):
handler = MockBatchHandler(self.config)
with patch.object(mod.BatchMasterView, 'get_batch_handler', return_value=handler):
@ -287,3 +366,8 @@ class TestBatchMasterView(WebTestCase):
grid = view.make_row_model_grid(batch)
self.assertIn('sequence', grid.labels)
self.assertEqual(grid.labels['sequence'], "Seq.")
def test_defaults(self):
# nb. coverage only
with patch.object(mod.BatchMasterView, 'model_class', new=MockBatch, create=True):
mod.BatchMasterView.defaults(self.pyramid_config)