Files
shopdb-flask/tests/test_plugins/test_board_order.py

107 lines
4.1 KiB
Python

"""Tests for notificationtypes.boardorder (row order on the shopfloor board).
Rows used to run in display-style order and then alphabetically, so what led
the screen was an accident of styling and the alphabet. Each type now carries a
position, low first, and a shared category row sits wherever its
earliest-ordered type puts it.
The sort itself is frontend (ShopfloorDashboard.vue); pinned here is the
contract it sorts on - the feed carries boardorder per card, the type API
round-trips and validates it, and the migration seeds the shipped order.
"""
from plugins.notifications.models import Notification, NotificationType
def _make_type(db, typename, boardorder=100, displaystyle='grid', boardcategory=None):
t = NotificationType(typename=typename, typecolor='#17a2b8', isactive=True,
displaystyle=displaystyle, boardcategory=boardcategory,
boardorder=boardorder)
db.session.add(t)
db.session.commit()
return t
def _make_note(db, ntype, text):
n = Notification(notificationtypeid=ntype.notificationtypeid,
notification=text, businessunitid=None,
isactive=True, isshopfloor=True)
db.session.add(n)
db.session.commit()
return n
def _current(client):
resp = client.get('/api/notifications/shopfloor')
assert resp.status_code == 200, resp.get_json()
return resp.get_json()['data']['current']
def test_feed_carries_the_order_per_card(client, db):
ntype = _make_type(db, 'Recognition', boardorder=10)
_make_note(db, ntype, 'ten years')
assert _current(client)[0]['boardorder'] == 10
def test_a_type_defaults_to_the_back(client, db):
"""A new type lands behind the seeded rows rather than jumping the queue."""
ntype = NotificationType(typename='Fresh', typecolor='#17a2b8', isactive=True)
db.session.add(ntype)
db.session.commit()
assert ntype.boardorder == 100
def test_api_round_trips_the_order(client, db, auth_headers):
create = client.post('/api/notifications/types',
json={'typename': 'Awareness', 'boardorder': 30},
headers=auth_headers)
assert create.status_code in (200, 201), create.get_json()
typeid = create.get_json()['data']['notificationtypeid']
assert create.get_json()['data']['boardorder'] == 30
updated = client.put(f'/api/notifications/types/{typeid}',
json={'boardorder': 40}, headers=auth_headers)
assert updated.get_json()['data']['boardorder'] == 40
def test_api_rejects_a_nonsense_order(client, db, auth_headers):
resp = client.post('/api/notifications/types',
json={'typename': 'Bad', 'boardorder': 'first'},
headers=auth_headers)
assert resp.status_code == 400
assert 'boardorder' in resp.get_data(as_text=True)
def test_api_rejects_an_out_of_range_order(client, db, auth_headers):
resp = client.post('/api/notifications/types',
json={'typename': 'Bad', 'boardorder': 1000},
headers=auth_headers)
assert resp.status_code == 400
def test_order_change_moves_the_config_version(client, db, auth_headers):
"""Open kiosks reload on a layout change; a re-ordered board is one."""
ntype = _make_type(db, 'Awareness')
before = client.get('/api/notifications/shopfloor').get_json()['data']['configversion']
client.put(f'/api/notifications/types/{ntype.notificationtypeid}',
json={'boardorder': 30}, headers=auth_headers)
after = client.get('/api/notifications/shopfloor').get_json()['data']['configversion']
assert before != after
def test_types_in_one_category_can_carry_different_orders(client, db):
"""The row takes the lowest; the feed still reports each type's own."""
change = _make_type(db, 'Change', boardorder=30, boardcategory='Current Events')
incident = _make_type(db, 'Incident', boardorder=50, boardcategory='Current Events')
_make_note(db, change, 'retooling')
_make_note(db, incident, 'press down')
orders = {c['typename']: c['boardorder'] for c in _current(client)}
assert orders == {'Change': 30, 'Incident': 50}