96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
"""Machines list search covers the columns the list actually shows.
|
|
|
|
The table displays Machine #, Name, Serial Number, Type and Vendor, so all of
|
|
them must be searchable. Searching a type name ('Part Washer') used to return
|
|
zero rows because the filter only looked at the asset fields.
|
|
"""
|
|
|
|
from shopdb.extensions import db as _db
|
|
from shopdb.core.models import Asset, AssetType
|
|
from shopdb.core.models.vendor import Vendor
|
|
|
|
from plugins.machines.models import Machine, MachineType
|
|
|
|
|
|
def _seed_machines():
|
|
"""Two machines: one Part Washer by Acme, one Lathe with no type or vendor.
|
|
|
|
The typeless machine guards the outer joins - it must still be findable by
|
|
its own asset fields.
|
|
"""
|
|
assettype = AssetType(assettype='machine')
|
|
_db.session.add(assettype)
|
|
_db.session.flush()
|
|
|
|
washertype = MachineType(machinetype='Part Washer')
|
|
lathe_vendor = Vendor(vendor='Acme Industrial')
|
|
_db.session.add_all([washertype, lathe_vendor])
|
|
_db.session.flush()
|
|
|
|
washer_asset = Asset(assetnumber='0410', name='Cell 4 washer',
|
|
serialnumber='SN-WASH-1', assettypeid=assettype.assettypeid)
|
|
plain_asset = Asset(assetnumber='0999', name='Old lathe',
|
|
serialnumber='SN-LATHE-9', assettypeid=assettype.assettypeid)
|
|
_db.session.add_all([washer_asset, plain_asset])
|
|
_db.session.flush()
|
|
|
|
_db.session.add_all([
|
|
Machine(assetid=washer_asset.assetid,
|
|
machinetypeid=washertype.machinetypeid,
|
|
vendorid=lathe_vendor.vendorid),
|
|
Machine(assetid=plain_asset.assetid),
|
|
])
|
|
_db.session.commit()
|
|
|
|
|
|
def _numbers(resp):
|
|
return sorted(item['assetnumber'] for item in resp.get_json()['data'])
|
|
|
|
|
|
def test_search_matches_machine_type_name(client, db):
|
|
_seed_machines()
|
|
|
|
resp = client.get('/api/machines?search=Part Washer')
|
|
|
|
assert resp.status_code == 200, resp.get_json()
|
|
assert _numbers(resp) == ['0410']
|
|
|
|
|
|
def test_search_matches_vendor_name(client, db):
|
|
_seed_machines()
|
|
|
|
resp = client.get('/api/machines?search=Acme')
|
|
|
|
assert resp.status_code == 200, resp.get_json()
|
|
assert _numbers(resp) == ['0410']
|
|
|
|
|
|
def test_search_still_matches_asset_fields(client, db):
|
|
_seed_machines()
|
|
|
|
for term, expected in [('0999', ['0999']),
|
|
('Old lathe', ['0999']),
|
|
('SN-WASH', ['0410'])]:
|
|
resp = client.get(f'/api/machines?search={term}')
|
|
assert resp.status_code == 200, resp.get_json()
|
|
assert _numbers(resp) == expected, term
|
|
|
|
|
|
def test_search_does_not_drop_machines_without_type_or_vendor(client, db):
|
|
"""The outer joins must not turn into inner joins."""
|
|
_seed_machines()
|
|
|
|
resp = client.get('/api/machines?search=lathe')
|
|
|
|
assert resp.status_code == 200, resp.get_json()
|
|
assert _numbers(resp) == ['0999']
|
|
|
|
|
|
def test_search_miss_returns_empty(client, db):
|
|
_seed_machines()
|
|
|
|
resp = client.get('/api/machines?search=zzzznotathing')
|
|
|
|
assert resp.status_code == 200, resp.get_json()
|
|
assert _numbers(resp) == []
|