feat: move lookup logic to handler; improve support for external lookup
This commit is contained in:
parent
f8f4933ca1
commit
811a37995d
7 changed files with 553 additions and 151 deletions
|
@ -177,7 +177,9 @@ class TestOrderView(WebTestCase):
|
|||
|
||||
def test_customer_autocomplete(self):
|
||||
model = self.app.model
|
||||
handler = self.make_handler()
|
||||
view = self.make_view()
|
||||
view.batch_handler = handler
|
||||
|
||||
with patch.object(view, 'Session', return_value=self.session):
|
||||
|
||||
|
@ -205,9 +207,16 @@ class TestOrderView(WebTestCase):
|
|||
result = view.customer_autocomplete()
|
||||
self.assertEqual(result, [])
|
||||
|
||||
# external lookup not implemented by default
|
||||
with patch.object(handler, 'use_local_customers', return_value=False):
|
||||
with patch.object(self.request, 'GET', new={'term': 'sally'}, create=True):
|
||||
self.assertRaises(NotImplementedError, view.customer_autocomplete)
|
||||
|
||||
def test_product_autocomplete(self):
|
||||
model = self.app.model
|
||||
handler = self.make_handler()
|
||||
view = self.make_view()
|
||||
view.batch_handler = handler
|
||||
|
||||
with patch.object(view, 'Session', return_value=self.session):
|
||||
|
||||
|
@ -244,6 +253,11 @@ class TestOrderView(WebTestCase):
|
|||
result = view.product_autocomplete()
|
||||
self.assertEqual(result, [])
|
||||
|
||||
# external lookup not implemented by default
|
||||
with patch.object(handler, 'use_local_products', return_value=False):
|
||||
with patch.object(self.request, 'GET', new={'term': 'juice'}, create=True):
|
||||
self.assertRaises(NotImplementedError, view.product_autocomplete)
|
||||
|
||||
def test_get_pending_product_required_fields(self):
|
||||
model = self.app.model
|
||||
view = self.make_view()
|
||||
|
@ -529,20 +543,27 @@ class TestOrderView(WebTestCase):
|
|||
self.assertEqual(context['case_size'], 12)
|
||||
self.assertEqual(context['unit_price_reg'], 5.99)
|
||||
|
||||
# error if local product missing
|
||||
mock_uuid = self.app.make_true_uuid()
|
||||
context = view.get_product_info(batch, {'product_id': mock_uuid.hex})
|
||||
self.assertEqual(context, {'error': "Product not found"})
|
||||
|
||||
# error if no product_id
|
||||
context = view.get_product_info(batch, {})
|
||||
self.assertEqual(context, {'error': "Must specify a product ID"})
|
||||
|
||||
# external lookup not implemented (yet)
|
||||
# error if product not found
|
||||
mock_uuid = self.app.make_true_uuid()
|
||||
self.assertRaises(ValueError, view.get_product_info,
|
||||
batch, {'product_id': mock_uuid.hex})
|
||||
|
||||
with patch.object(handler, 'use_local_products', return_value=False):
|
||||
|
||||
# external lookup not implemented by default
|
||||
self.assertRaises(NotImplementedError, view.get_product_info,
|
||||
batch, {'product_id': '42'})
|
||||
|
||||
# external lookup may return its own error
|
||||
with patch.object(handler, 'get_product_info_external',
|
||||
return_value={'error': "something smells fishy"}):
|
||||
context = view.get_product_info(batch, {'product_id': '42'})
|
||||
self.assertEqual(context, {'error': "something smells fishy"})
|
||||
|
||||
def test_add_item(self):
|
||||
model = self.app.model
|
||||
enum = self.app.enum
|
||||
|
@ -970,33 +991,47 @@ class TestOrderView(WebTestCase):
|
|||
|
||||
# the next few tests will morph 2nd row..
|
||||
|
||||
def refresh_external(row):
|
||||
row.product_scancode = '012345'
|
||||
row.product_brand = 'Acme'
|
||||
row.product_description = 'Bricks'
|
||||
row.product_size = '1 ton'
|
||||
row.product_weighed = True
|
||||
row.department_id = 1
|
||||
row.department_name = "Bricks & Mortar"
|
||||
row.special_order = False
|
||||
row.case_size = None
|
||||
row.unit_cost = decimal.Decimal('599.99')
|
||||
row.unit_price_reg = decimal.Decimal('999.99')
|
||||
|
||||
# typical, external product
|
||||
row2.product_id = '42'
|
||||
with patch.object(handler, 'use_local_products', return_value=False):
|
||||
data = view.normalize_row(row2)
|
||||
with patch.object(handler, 'refresh_row_from_external_product', new=refresh_external):
|
||||
handler.update_item(row2, '42', 1, enum.ORDER_UOM_UNIT)
|
||||
data = view.normalize_row(row2)
|
||||
self.assertEqual(data['uuid'], row2.uuid.hex)
|
||||
self.assertEqual(data['sequence'], 2)
|
||||
self.assertEqual(data['product_id'], '42')
|
||||
self.assertIsNone(data['product_scancode'])
|
||||
self.assertNotIn('product_full_description', data) # TODO
|
||||
self.assertEqual(data['product_scancode'], '012345')
|
||||
self.assertEqual(data['product_full_description'], 'Acme Bricks 1 ton')
|
||||
self.assertIsNone(data['case_size'])
|
||||
self.assertNotIn('vendor_name', data) # TODO
|
||||
self.assertEqual(data['order_qty'], 1)
|
||||
self.assertEqual(data['order_uom'], 'EA')
|
||||
self.assertEqual(data['order_qty_display'], '1 Units')
|
||||
self.assertEqual(data['unit_price_reg'], 3.29)
|
||||
self.assertEqual(data['unit_price_reg_display'], '$3.29')
|
||||
self.assertEqual(data['unit_price_reg'], 999.99)
|
||||
self.assertEqual(data['unit_price_reg_display'], '$999.99')
|
||||
self.assertNotIn('unit_price_sale', data)
|
||||
self.assertNotIn('unit_price_sale_display', data)
|
||||
self.assertNotIn('sale_ends', data)
|
||||
self.assertNotIn('sale_ends_display', data)
|
||||
self.assertEqual(data['unit_price_quoted'], 3.29)
|
||||
self.assertEqual(data['unit_price_quoted_display'], '$3.29')
|
||||
self.assertEqual(data['unit_price_quoted'], 999.99)
|
||||
self.assertEqual(data['unit_price_quoted_display'], '$999.99')
|
||||
self.assertIsNone(data['case_price_quoted'])
|
||||
self.assertEqual(data['case_price_quoted_display'], '')
|
||||
self.assertEqual(data['total_price'], 3.29)
|
||||
self.assertEqual(data['total_price_display'], '$3.29')
|
||||
self.assertIsNone(data['special_order'])
|
||||
self.assertEqual(data['total_price'], 999.99)
|
||||
self.assertEqual(data['total_price_display'], '$999.99')
|
||||
self.assertFalse(data['special_order'])
|
||||
self.assertEqual(data['status_code'], row2.STATUS_OK)
|
||||
self.assertNotIn('pending_product', data)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue