fix: add "other" menu entry, plus docs/tests
This commit is contained in:
parent
ce54ca6bd6
commit
c2f76f6c97
20 changed files with 546 additions and 15 deletions
261
tests/batch/test_neworder.py
Normal file
261
tests/batch/test_neworder.py
Normal file
|
@ -0,0 +1,261 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
import datetime
|
||||
import decimal
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from corepos.db.office_op import model as op_model, Session as OpSession
|
||||
|
||||
from wuttjamaican.testing import DataTestCase
|
||||
|
||||
from sideshow_corepos.batch import neworder as mod
|
||||
|
||||
|
||||
class TestNewOrderBatchHandler(DataTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
self.op_engine = sa.create_engine('sqlite://')
|
||||
self.config.core_office_op_engines = {'default': self.op_engine}
|
||||
self.config.core_office_op_engine = self.op_engine
|
||||
|
||||
op_model.Base.metadata.create_all(bind=self.op_engine)
|
||||
|
||||
self.op_session = OpSession(bind=self.op_engine)
|
||||
|
||||
def tearDown(self):
|
||||
self.op_session.close()
|
||||
super().tearDown()
|
||||
|
||||
def make_config(self, **kwargs):
|
||||
config = super().make_config(**kwargs)
|
||||
config.setdefault('wutta.enum_spec', 'sideshow.enum')
|
||||
return config
|
||||
|
||||
def make_handler(self):
|
||||
return mod.NewOrderBatchHandler(self.config)
|
||||
|
||||
def test_autocomplete_cutomers_external(self):
|
||||
handler = self.make_handler()
|
||||
|
||||
# empty results by default
|
||||
self.assertEqual(handler.autocomplete_customers_external(self.session, 'foo'), [])
|
||||
|
||||
# add a member
|
||||
member = op_model.MemberInfo(card_number=42)
|
||||
self.op_session.add(member)
|
||||
customer = op_model.CustomerClassic(first_name="Chuck", last_name="Norris",
|
||||
last_change=datetime.datetime.now())
|
||||
member.customers.append(customer)
|
||||
self.op_session.add(customer)
|
||||
self.op_session.flush()
|
||||
|
||||
# search for chuck finds chuck
|
||||
results = handler.autocomplete_customers_external(self.session, 'chuck')
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0], {
|
||||
'value': '42',
|
||||
'label': "Chuck Norris",
|
||||
})
|
||||
|
||||
# search for sally finds nothing
|
||||
self.assertEqual(handler.autocomplete_customers_external(self.session, 'sally'), [])
|
||||
|
||||
def test_refresh_batch_from_external_customer(self):
|
||||
model = self.app.model
|
||||
handler = self.make_handler()
|
||||
|
||||
user = model.User(username='barney')
|
||||
self.session.add(user)
|
||||
self.session.flush()
|
||||
|
||||
batch = handler.make_batch(self.session, created_by=user)
|
||||
self.session.add(batch)
|
||||
self.session.flush()
|
||||
|
||||
# add a member
|
||||
member = op_model.MemberInfo(card_number=42, phone='555-1234', email='chuck@example.com')
|
||||
self.op_session.add(member)
|
||||
customer = op_model.CustomerClassic(first_name="Chuck", last_name="Norris",
|
||||
last_change=datetime.datetime.now())
|
||||
member.customers.append(customer)
|
||||
self.op_session.add(customer)
|
||||
self.op_session.flush()
|
||||
|
||||
# error if invalid customer_id
|
||||
batch.customer_id = 'BreakThings!'
|
||||
self.assertRaises(ValueError, handler.refresh_batch_from_external_customer, batch)
|
||||
|
||||
# error if customer not found
|
||||
batch.customer_id = '9999'
|
||||
self.assertRaises(ValueError, handler.refresh_batch_from_external_customer, batch)
|
||||
|
||||
# batch should reflect customer info
|
||||
batch.customer_id = '42'
|
||||
self.assertIsNone(batch.customer_name)
|
||||
self.assertIsNone(batch.phone_number)
|
||||
self.assertIsNone(batch.email_address)
|
||||
handler.refresh_batch_from_external_customer(batch)
|
||||
self.assertEqual(batch.customer_name, "Chuck Norris")
|
||||
self.assertEqual(batch.phone_number, '555-1234')
|
||||
self.assertEqual(batch.email_address, 'chuck@example.com')
|
||||
|
||||
def test_autocomplete_products_local(self):
|
||||
handler = self.make_handler()
|
||||
|
||||
# empty results by default
|
||||
self.assertEqual(handler.autocomplete_products_external(self.session, 'foo'), [])
|
||||
|
||||
# add a product
|
||||
product = op_model.Product(upc='07430500132', brand="Bragg's",
|
||||
description="Vinegar", size='32oz')
|
||||
self.op_session.add(product)
|
||||
self.op_session.commit()
|
||||
|
||||
# search for vinegar finds product
|
||||
results = handler.autocomplete_products_external(self.session, 'vinegar')
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0], {
|
||||
'value': '07430500132',
|
||||
'label': "Bragg's Vinegar 32oz",
|
||||
})
|
||||
|
||||
# search for brag finds product
|
||||
results = handler.autocomplete_products_external(self.session, 'brag')
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0], {
|
||||
'value': '07430500132',
|
||||
'label': "Bragg's Vinegar 32oz",
|
||||
})
|
||||
|
||||
# search for juice finds nothing
|
||||
self.assertEqual(handler.autocomplete_products_external(self.session, 'juice'), [])
|
||||
|
||||
def test_get_case_size_for_external_product(self):
|
||||
handler = self.make_handler()
|
||||
|
||||
# null
|
||||
product = op_model.Product(upc='07430500132', brand="Bragg's",
|
||||
description="Vinegar", size='32oz')
|
||||
self.op_session.add(product)
|
||||
self.op_session.commit()
|
||||
self.op_session.refresh(product)
|
||||
self.assertIsNone(handler.get_case_size_for_external_product(product))
|
||||
|
||||
# typical
|
||||
vendor = op_model.Vendor(id=42, name='Acme Distributors')
|
||||
self.op_session.add(vendor)
|
||||
item = op_model.VendorItem(vendor=vendor, sku='1234', units=12.34,
|
||||
vendor_item_id=1)
|
||||
product.vendor_items.append(item)
|
||||
self.op_session.commit()
|
||||
self.op_session.refresh(product)
|
||||
self.assertEqual(handler.get_case_size_for_external_product(product),
|
||||
decimal.Decimal('12.3400'))
|
||||
|
||||
def test_get_unit_price_reg_for_external_product(self):
|
||||
handler = self.make_handler()
|
||||
|
||||
# null
|
||||
product = op_model.Product(upc='07430500132', brand="Bragg's",
|
||||
description="Vinegar", size='32oz')
|
||||
self.op_session.add(product)
|
||||
self.op_session.commit()
|
||||
self.op_session.refresh(product)
|
||||
self.assertIsNone(handler.get_unit_price_reg_for_external_product(product))
|
||||
|
||||
# typical
|
||||
product.normal_price = 4.19
|
||||
self.op_session.commit()
|
||||
self.op_session.refresh(product)
|
||||
self.assertEqual(handler.get_unit_price_reg_for_external_product(product),
|
||||
decimal.Decimal('4.19'))
|
||||
|
||||
def test_get_product_info_external(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()
|
||||
|
||||
vendor = op_model.Vendor(id=42, name='Acme Distributors')
|
||||
self.op_session.add(vendor)
|
||||
product = op_model.Product(upc='07430500132', brand="Bragg",
|
||||
description="Vinegar", size='32oz',
|
||||
normal_price=4.19)
|
||||
item = op_model.VendorItem(vendor=vendor, sku='1234', units=12.34,
|
||||
vendor_item_id=1)
|
||||
product.vendor_items.append(item)
|
||||
self.op_session.add(product)
|
||||
self.op_session.commit()
|
||||
|
||||
# typical
|
||||
info = handler.get_product_info_external(self.session, '07430500132')
|
||||
self.assertEqual(info['product_id'], '07430500132')
|
||||
self.assertEqual(info['scancode'], '07430500132')
|
||||
self.assertEqual(info['brand_name'], 'Bragg')
|
||||
self.assertEqual(info['description'], 'Vinegar')
|
||||
self.assertEqual(info['size'], '32oz')
|
||||
self.assertEqual(info['full_description'], 'Bragg Vinegar 32oz')
|
||||
self.assertEqual(info['case_size'], decimal.Decimal('12.3400'))
|
||||
self.assertEqual(info['unit_price_reg'], decimal.Decimal('4.19'))
|
||||
|
||||
# error if no product_id
|
||||
self.assertRaises(ValueError, handler.get_product_info_external, self.session, None)
|
||||
|
||||
# error if product not found
|
||||
self.assertRaises(ValueError, handler.get_product_info_external, self.session, 'BADUPC')
|
||||
|
||||
def test_refresh_row_from_external_product(self):
|
||||
model = self.app.model
|
||||
enum = self.app.enum
|
||||
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)
|
||||
row = handler.make_row(order_qty=1, order_uom=enum.ORDER_UOM_UNIT)
|
||||
handler.add_row(batch, row)
|
||||
self.session.add(row)
|
||||
self.session.flush()
|
||||
|
||||
vendor = op_model.Vendor(id=42, name='Acme Distributors')
|
||||
self.op_session.add(vendor)
|
||||
product = op_model.Product(upc='07430500132', brand="Bragg",
|
||||
description="Vinegar", size='32oz',
|
||||
normal_price=4.19)
|
||||
item = op_model.VendorItem(vendor=vendor, sku='1234', units=12.34,
|
||||
vendor_item_id=1)
|
||||
product.vendor_items.append(item)
|
||||
self.op_session.add(product)
|
||||
self.op_session.commit()
|
||||
|
||||
# error if invalid product_id
|
||||
row.product_id = 'BreakThings!'
|
||||
self.assertRaises(ValueError, handler.refresh_row_from_external_product, row)
|
||||
|
||||
# error if product not found
|
||||
row.product_id = '9999'
|
||||
self.assertRaises(ValueError, handler.refresh_row_from_external_product, row)
|
||||
|
||||
# row should reflect product info
|
||||
row.product_id = '07430500132'
|
||||
self.assertIsNone(row.product_scancode)
|
||||
self.assertIsNone(row.product_brand)
|
||||
self.assertIsNone(row.product_description)
|
||||
self.assertIsNone(row.product_size)
|
||||
self.assertIsNone(row.case_size)
|
||||
self.assertIsNone(row.unit_price_reg)
|
||||
handler.refresh_row_from_external_product(row)
|
||||
self.assertEqual(row.product_scancode, '07430500132')
|
||||
self.assertEqual(row.product_brand, "Bragg")
|
||||
self.assertEqual(row.product_description, "Vinegar")
|
||||
self.assertEqual(row.product_size, "32oz")
|
||||
self.assertEqual(row.case_size, decimal.Decimal('12.3400'))
|
||||
self.assertEqual(row.unit_price_reg, decimal.Decimal('4.19'))
|
32
tests/web/test_app.py
Normal file
32
tests/web/test_app.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from wuttjamaican.testing import FileTestCase, ConfigTestCase
|
||||
|
||||
from asgiref.wsgi import WsgiToAsgi
|
||||
from pyramid.router import Router
|
||||
|
||||
from sideshow_corepos.web import app as mod
|
||||
|
||||
|
||||
class TestMain(FileTestCase):
|
||||
|
||||
def test_basic(self):
|
||||
global_config = None
|
||||
myconf = self.write_file('my.conf', '')
|
||||
settings = {'wutta.config': myconf}
|
||||
app = mod.main(global_config, **settings)
|
||||
self.assertIsInstance(app, Router)
|
||||
|
||||
|
||||
class TestMakeWsgiApp(ConfigTestCase):
|
||||
|
||||
def test_basic(self):
|
||||
wsgi = mod.make_wsgi_app()
|
||||
self.assertIsInstance(wsgi, Router)
|
||||
|
||||
|
||||
class TestMakeAsgiApp(ConfigTestCase):
|
||||
|
||||
def test_basic(self):
|
||||
asgi = mod.make_asgi_app()
|
||||
self.assertIsInstance(asgi, WsgiToAsgi)
|
11
tests/web/test_init.py
Normal file
11
tests/web/test_init.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from wuttaweb.testing import WebTestCase
|
||||
|
||||
from sideshow_corepos import web as mod
|
||||
|
||||
|
||||
class TestIncludeme(WebTestCase):
|
||||
|
||||
def test_coverage(self):
|
||||
mod.includeme(self.pyramid_config)
|
51
tests/web/test_menus.py
Normal file
51
tests/web/test_menus.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from wuttaweb.testing import WebTestCase
|
||||
|
||||
from sideshow_corepos.web import menus as mod
|
||||
|
||||
|
||||
class TestSideshowMenuHandler(WebTestCase):
|
||||
|
||||
def make_handler(self):
|
||||
return mod.SideshowMenuHandler(self.config)
|
||||
|
||||
def test_make_customers_menu(self):
|
||||
handler = self.make_handler()
|
||||
menu = handler.make_customers_menu(self.request)
|
||||
item = menu['items'][-1]
|
||||
self.assertEqual(item, {
|
||||
'title': "CORE-POS Members",
|
||||
'route': 'corepos_members',
|
||||
'perm': 'corepos_members.list',
|
||||
})
|
||||
|
||||
def test_make_products_menu(self):
|
||||
handler = self.make_handler()
|
||||
menu = handler.make_products_menu(self.request)
|
||||
item = menu['items'][-1]
|
||||
self.assertEqual(item, {
|
||||
'title': "CORE-POS Products",
|
||||
'route': 'corepos_products',
|
||||
'perm': 'corepos_products.list',
|
||||
})
|
||||
|
||||
def test_make_other_menu(self):
|
||||
handler = self.make_handler()
|
||||
|
||||
# no url configured by default
|
||||
menu = handler.make_other_menu(self.request)
|
||||
if menu['items']:
|
||||
item = menu['items'][-1]
|
||||
self.assertNotEqual(item['title'], "CORE Office")
|
||||
|
||||
# entry added if url configured
|
||||
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/')
|
||||
menu = handler.make_other_menu(self.request)
|
||||
item = menu['items'][-1]
|
||||
self.assertEqual(item, {
|
||||
'title': "CORE Office",
|
||||
# nb. trailing slash gets stripped
|
||||
'url': 'http://localhost/fannie',
|
||||
'target': '_blank',
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue