2020-11-06 20:01:29 +00:00
|
|
|
import uuid
|
2023-03-21 11:08:13 +00:00
|
|
|
|
|
|
|
import pytest
|
2018-06-12 14:50:05 +00:00
|
|
|
|
2018-06-14 13:14:23 +00:00
|
|
|
from ereuse_devicehub.client import UserClient
|
|
|
|
from ereuse_devicehub.db import db
|
|
|
|
from ereuse_devicehub.devicehub import Devicehub
|
2019-05-11 14:27:22 +00:00
|
|
|
from ereuse_devicehub.resources.action.models import Snapshot
|
2023-03-21 11:08:13 +00:00
|
|
|
from ereuse_devicehub.resources.device.models import (
|
|
|
|
Desktop,
|
|
|
|
Device,
|
|
|
|
GraphicCard,
|
|
|
|
Laptop,
|
|
|
|
Server,
|
|
|
|
SolidStateDrive,
|
|
|
|
)
|
2018-10-18 08:09:10 +00:00
|
|
|
from ereuse_devicehub.resources.device.search import DeviceSearch
|
2018-10-04 08:59:31 +00:00
|
|
|
from ereuse_devicehub.resources.device.views import Filters, Sorting
|
2018-06-26 13:35:13 +00:00
|
|
|
from ereuse_devicehub.resources.enums import ComputerChassis
|
2018-10-06 10:45:56 +00:00
|
|
|
from ereuse_devicehub.resources.lot.models import Lot
|
2023-03-21 11:08:13 +00:00
|
|
|
from ereuse_devicehub.teal.utils import compiled
|
2018-08-03 18:07:05 +00:00
|
|
|
from tests import conftest
|
2023-03-21 11:08:13 +00:00
|
|
|
from tests.conftest import file, json_encode, yaml2json
|
2018-06-12 14:50:05 +00:00
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-08-03 18:07:05 +00:00
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_filters():
|
2018-06-12 14:50:05 +00:00
|
|
|
schema = Filters()
|
2023-03-21 11:08:13 +00:00
|
|
|
q = schema.load(
|
|
|
|
{
|
|
|
|
'type': ['Computer', 'Laptop'],
|
|
|
|
'manufacturer': 'Dell',
|
|
|
|
'rating': {'rating': [3, 6], 'appearance': [2, 4]},
|
|
|
|
'tag': {'id': ['bcn-', 'activa-02']},
|
2018-06-12 14:50:05 +00:00
|
|
|
}
|
2023-03-21 11:08:13 +00:00
|
|
|
)
|
2018-06-12 14:50:05 +00:00
|
|
|
s, params = compiled(Device, q)
|
|
|
|
# Order between query clauses can change
|
2023-03-21 11:08:13 +00:00
|
|
|
assert (
|
|
|
|
'(device.type IN (%(type_1)s, %(type_2)s, %(type_3)s, %(type_4)s) '
|
|
|
|
'OR device.type IN (%(type_5)s))' in s
|
|
|
|
)
|
2018-06-12 14:50:05 +00:00
|
|
|
assert 'device.manufacturer ILIKE %(manufacturer_1)s' in s
|
|
|
|
assert 'rate.rating BETWEEN %(rating_1)s AND %(rating_2)s' in s
|
|
|
|
assert 'rate.appearance BETWEEN %(appearance_1)s AND %(appearance_2)s' in s
|
|
|
|
assert '(tag.id ILIKE %(id_1)s OR tag.id ILIKE %(id_2)s)' in s
|
2018-06-14 13:14:23 +00:00
|
|
|
|
|
|
|
# type_x can be assigned at different values
|
|
|
|
# ex: type_1 can be 'Desktop' in one execution but the next one 'Laptop'
|
2023-03-21 11:08:13 +00:00
|
|
|
assert set(params.keys()) == {
|
|
|
|
'id_2',
|
|
|
|
'appearance_1',
|
|
|
|
'type_1',
|
|
|
|
'type_4',
|
|
|
|
'rating_2',
|
|
|
|
'type_5',
|
|
|
|
'type_3',
|
|
|
|
'type_2',
|
|
|
|
'appearance_2',
|
|
|
|
'id_1',
|
|
|
|
'rating_1',
|
|
|
|
'manufacturer_1',
|
|
|
|
}
|
|
|
|
assert set(params.values()) == {
|
|
|
|
2.0,
|
|
|
|
'Laptop',
|
|
|
|
4.0,
|
|
|
|
3.0,
|
|
|
|
6.0,
|
|
|
|
'Desktop',
|
|
|
|
'activa-02%',
|
|
|
|
'Server',
|
|
|
|
'Dell%',
|
|
|
|
'Computer',
|
|
|
|
'bcn-%',
|
|
|
|
}
|
2018-06-12 14:50:05 +00:00
|
|
|
|
|
|
|
|
2018-08-03 18:07:05 +00:00
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_sort():
|
2018-06-14 13:14:23 +00:00
|
|
|
schema = Sorting()
|
|
|
|
r = next(schema.load({'created': True}))
|
|
|
|
assert str(r) == 'device.created ASC'
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture()
|
2018-10-04 08:59:31 +00:00
|
|
|
def device_query_dummy(app: Devicehub):
|
2019-06-19 11:35:26 +00:00
|
|
|
"""3 computers, where:
|
2018-11-04 21:40:14 +00:00
|
|
|
|
|
|
|
1. s1 Desktop with a Processor
|
|
|
|
2. s2 Desktop with an SSD
|
|
|
|
3. s3 Laptop
|
|
|
|
4. s4 Server with another SSD
|
|
|
|
|
|
|
|
:param app:
|
|
|
|
:return:
|
|
|
|
"""
|
2018-06-14 13:14:23 +00:00
|
|
|
with app.app_context():
|
2018-09-29 10:24:22 +00:00
|
|
|
devices = ( # The order matters ;-)
|
2023-03-21 11:08:13 +00:00
|
|
|
Desktop(
|
|
|
|
serial_number='1',
|
|
|
|
model='ml1',
|
|
|
|
manufacturer='mr1',
|
|
|
|
chassis=ComputerChassis.Tower,
|
|
|
|
),
|
|
|
|
Desktop(
|
|
|
|
serial_number='2',
|
|
|
|
model='ml2',
|
|
|
|
manufacturer='mr2',
|
|
|
|
chassis=ComputerChassis.Microtower,
|
|
|
|
),
|
|
|
|
Laptop(
|
|
|
|
serial_number='3',
|
|
|
|
model='ml3',
|
|
|
|
manufacturer='mr3',
|
|
|
|
chassis=ComputerChassis.Detachable,
|
|
|
|
),
|
|
|
|
Server(
|
|
|
|
serial_number='4',
|
|
|
|
model='ml4',
|
|
|
|
manufacturer='mr4',
|
|
|
|
chassis=ComputerChassis.Tower,
|
|
|
|
),
|
2018-11-04 21:40:14 +00:00
|
|
|
)
|
|
|
|
devices[0].components.add(
|
|
|
|
GraphicCard(serial_number='1-gc', model='s1ml', manufacturer='s1mr')
|
|
|
|
)
|
|
|
|
devices[1].components.add(
|
|
|
|
SolidStateDrive(serial_number='2-ssd', model='s2ml', manufacturer='s2mr')
|
|
|
|
)
|
|
|
|
devices[-1].components.add(
|
|
|
|
SolidStateDrive(serial_number='4-ssd', model='s4ml', manufacturer='s4mr')
|
2018-09-29 10:24:22 +00:00
|
|
|
)
|
|
|
|
db.session.add_all(devices)
|
2018-06-14 13:14:23 +00:00
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
|
2018-10-04 08:59:31 +00:00
|
|
|
@pytest.mark.usefixtures(device_query_dummy.__name__)
|
|
|
|
def test_device_query_no_filters(user: UserClient):
|
|
|
|
i, _ = user.get(res=Device)
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3', '4', '1-gc', '2-ssd', '4-ssd') == tuple(
|
|
|
|
d['serialNumber'] for d in i['items']
|
2018-06-14 13:14:23 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-10-04 08:59:31 +00:00
|
|
|
@pytest.mark.usefixtures(device_query_dummy.__name__)
|
|
|
|
def test_device_query_filter_type(user: UserClient):
|
|
|
|
i, _ = user.get(res=Device, query=[('filter', {'type': ['Desktop', 'Laptop']})])
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3') == tuple(d['serialNumber'] for d in i['items'])
|
2018-06-14 13:14:23 +00:00
|
|
|
|
|
|
|
|
2018-10-04 08:59:31 +00:00
|
|
|
@pytest.mark.usefixtures(device_query_dummy.__name__)
|
|
|
|
def test_device_query_filter_sort(user: UserClient):
|
2023-03-21 11:08:13 +00:00
|
|
|
i, _ = user.get(
|
|
|
|
res=Device,
|
|
|
|
query=[
|
|
|
|
('sort', {'created': Sorting.DESCENDING}),
|
|
|
|
('filter', {'type': ['Computer']}),
|
|
|
|
],
|
|
|
|
)
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('4', '3', '2', '1') == tuple(d['serialNumber'] for d in i['items'])
|
2018-07-17 17:00:07 +00:00
|
|
|
|
|
|
|
|
2018-10-06 10:45:56 +00:00
|
|
|
@pytest.mark.usefixtures(device_query_dummy.__name__)
|
|
|
|
def test_device_query_filter_lots(user: UserClient):
|
|
|
|
parent, _ = user.post({'name': 'Parent'}, res=Lot)
|
|
|
|
child, _ = user.post({'name': 'Child'}, res=Lot)
|
2018-10-11 09:22:59 +00:00
|
|
|
|
2023-03-21 11:08:13 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('filter', {'lot': {'id': [parent['id']]}})])
|
2018-11-04 21:40:14 +00:00
|
|
|
assert not i['items'], 'No devices in lot'
|
2018-10-11 09:22:59 +00:00
|
|
|
|
2023-03-21 11:08:13 +00:00
|
|
|
parent, _ = user.post(
|
|
|
|
{},
|
|
|
|
res=Lot,
|
|
|
|
item='{}/children'.format(parent['id']),
|
|
|
|
query=[('id', child['id'])],
|
|
|
|
)
|
|
|
|
i, _ = user.get(res=Device, query=[('filter', {'type': ['Computer']})])
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3', '4') == tuple(d['serialNumber'] for d in i['items'])
|
2023-03-21 11:08:13 +00:00
|
|
|
parent, _ = user.post(
|
|
|
|
{},
|
|
|
|
res=Lot,
|
|
|
|
item='{}/devices'.format(parent['id']),
|
|
|
|
query=[('id', d['id']) for d in i['items'][:2]],
|
|
|
|
)
|
|
|
|
child, _ = user.post(
|
|
|
|
{},
|
|
|
|
res=Lot,
|
|
|
|
item='{}/devices'.format(child['id']),
|
|
|
|
query=[('id', d['id']) for d in i['items'][2:]],
|
|
|
|
)
|
|
|
|
i, _ = user.get(res=Device, query=[('filter', {'lot': {'id': [parent['id']]}})])
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3', '4', '1-gc', '2-ssd', '4-ssd') == tuple(
|
|
|
|
x['serialNumber'] for x in i['items']
|
2023-03-21 11:08:13 +00:00
|
|
|
), (
|
|
|
|
'The parent lot contains 2 items plus indirectly the other '
|
|
|
|
'2 from the child lot, with all their 2 components'
|
|
|
|
)
|
2018-10-06 10:45:56 +00:00
|
|
|
|
2023-03-21 11:08:13 +00:00
|
|
|
i, _ = user.get(
|
|
|
|
res=Device,
|
|
|
|
query=[
|
|
|
|
('filter', {'type': ['Computer'], 'lot': {'id': [parent['id']]}}),
|
|
|
|
],
|
|
|
|
)
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3', '4') == tuple(x['serialNumber'] for x in i['items'])
|
2023-03-21 11:08:13 +00:00
|
|
|
s, _ = user.get(res=Device, query=[('filter', {'lot': {'id': [child['id']]}})])
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('3', '4', '4-ssd') == tuple(x['serialNumber'] for x in s['items'])
|
2023-03-21 11:08:13 +00:00
|
|
|
s, _ = user.get(
|
|
|
|
res=Device, query=[('filter', {'lot': {'id': [child['id'], parent['id']]}})]
|
|
|
|
)
|
2018-11-04 21:40:14 +00:00
|
|
|
assert ('1', '2', '3', '4', '1-gc', '2-ssd', '4-ssd') == tuple(
|
|
|
|
x['serialNumber'] for x in s['items']
|
|
|
|
), 'Adding both lots is redundant in this case and we have the 4 elements.'
|
2018-10-06 10:45:56 +00:00
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_query(user: UserClient):
|
2018-07-17 17:00:07 +00:00
|
|
|
"""Checks result of inventory."""
|
2021-04-16 11:25:41 +00:00
|
|
|
snapshot, _ = user.post(conftest.file('basic.snapshot'), res=Snapshot)
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device)
|
2018-10-05 15:13:23 +00:00
|
|
|
assert i['url'] == '/devices/'
|
2021-04-16 16:16:07 +00:00
|
|
|
assert i['items'][0]['url'] == '/devices/%s' % snapshot['device']['devicehubID']
|
2018-10-04 08:59:31 +00:00
|
|
|
pc = next(d for d in i['items'] if d['type'] == 'Desktop')
|
2022-03-29 16:42:43 +00:00
|
|
|
assert len(pc['actions']) == 3
|
2018-07-17 17:00:07 +00:00
|
|
|
assert len(pc['components']) == 3
|
2018-09-21 09:25:22 +00:00
|
|
|
|
|
|
|
|
2020-11-06 20:01:29 +00:00
|
|
|
@pytest.mark.mvp
|
|
|
|
def test_device_query_permitions(user: UserClient, user2: UserClient):
|
|
|
|
"""Checks result of inventory for two users"""
|
|
|
|
user.post(file('basic.snapshot'), res=Snapshot)
|
|
|
|
i, _ = user.get(res=Device)
|
|
|
|
pc1 = next(d for d in i['items'] if d['type'] == 'Desktop')
|
|
|
|
|
|
|
|
i2, _ = user2.get(res=Device)
|
|
|
|
assert i2['items'] == []
|
|
|
|
|
2021-07-02 15:40:20 +00:00
|
|
|
basic_snapshot = yaml2json('basic.snapshot')
|
2020-11-06 20:01:29 +00:00
|
|
|
basic_snapshot['uuid'] = f"{uuid.uuid4()}"
|
2021-07-02 15:40:20 +00:00
|
|
|
user2.post(json_encode(basic_snapshot), res=Snapshot)
|
2020-11-06 20:01:29 +00:00
|
|
|
i2, _ = user2.get(res=Device)
|
|
|
|
pc2 = next(d for d in i2['items'] if d['type'] == 'Desktop')
|
2021-10-22 20:34:32 +00:00
|
|
|
|
2020-11-06 20:01:29 +00:00
|
|
|
assert pc1['id'] != pc2['id']
|
|
|
|
assert pc1['hid'] == pc2['hid']
|
2021-10-22 20:34:32 +00:00
|
|
|
|
2020-11-06 20:01:29 +00:00
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-10-18 08:09:10 +00:00
|
|
|
def test_device_search_all_devices_token_if_empty(app: Devicehub, user: UserClient):
|
|
|
|
"""Ensures DeviceSearch can regenerate itself when the table is empty."""
|
|
|
|
user.post(file('basic.snapshot'), res=Snapshot)
|
|
|
|
with app.app_context():
|
|
|
|
app.db.session.execute('TRUNCATE TABLE {}'.format(DeviceSearch.__table__.name))
|
|
|
|
app.db.session.commit()
|
|
|
|
i, _ = user.get(res=Device, query=[('search', 'Desktop')])
|
|
|
|
assert not len(i['items'])
|
|
|
|
with app.app_context():
|
|
|
|
DeviceSearch.set_all_devices_tokens_if_empty(app.db.session)
|
|
|
|
app.db.session.commit()
|
|
|
|
i, _ = user.get(res=Device, query=[('search', 'Desktop')])
|
|
|
|
assert i['items']
|
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-10-31 11:27:16 +00:00
|
|
|
def test_device_search_regenerate_table(app: DeviceSearch, user: UserClient):
|
|
|
|
user.post(file('basic.snapshot'), res=Snapshot)
|
|
|
|
i, _ = user.get(res=Device, query=[('search', 'Desktop')])
|
|
|
|
assert i['items'], 'Normal search works'
|
|
|
|
with app.app_context():
|
|
|
|
app.db.session.execute('TRUNCATE TABLE {}'.format(DeviceSearch.__table__.name))
|
|
|
|
app.db.session.commit()
|
|
|
|
i, _ = user.get(res=Device, query=[('search', 'Desktop')])
|
|
|
|
assert not i['items'], 'Truncate deleted all items'
|
|
|
|
runner = app.test_cli_runner()
|
2019-02-11 20:34:45 +00:00
|
|
|
runner.invoke('inv', 'search')
|
2018-10-31 11:27:16 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'Desktop')])
|
|
|
|
assert i['items'], 'Regenerated re-made the table'
|
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2022-09-02 10:42:26 +00:00
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_query_search(user: UserClient):
|
2018-09-29 10:24:22 +00:00
|
|
|
# todo improve
|
2021-04-16 11:25:41 +00:00
|
|
|
snapshot, _ = user.post(file('basic.snapshot'), res=Snapshot)
|
2022-09-02 10:42:26 +00:00
|
|
|
dev = Device.query.filter_by(id=snapshot['device']['id']).one()
|
2018-09-29 10:24:22 +00:00
|
|
|
user.post(file('computer-monitor.snapshot'), res=Snapshot)
|
|
|
|
user.post(file('real-eee-1001pxd.snapshot.11'), res=Snapshot)
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'desktop')])
|
2022-09-02 10:42:26 +00:00
|
|
|
assert i['items'][0]['id'] == dev.id
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'intel')])
|
|
|
|
assert len(i['items']) == 1
|
2022-09-02 10:42:26 +00:00
|
|
|
dev1 = Device.query.filter_by(id=i['items'][0]['id']).one()
|
|
|
|
i, _ = user.get(res=Device, query=[('search', dev1.devicehub_id)])
|
2021-04-26 13:22:09 +00:00
|
|
|
assert len(i['items']) == 1
|
2022-09-02 10:42:26 +00:00
|
|
|
dev2 = Device.query.filter_by(id=i['items'][0]['id']).one()
|
|
|
|
i, _ = user.get(res=Device, query=[('search', dev2.devicehub_id)])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert len(i['items']) == 1
|
2018-09-29 10:24:22 +00:00
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_query_search_synonyms_asus(user: UserClient):
|
2018-09-29 10:24:22 +00:00
|
|
|
user.post(file('real-eee-1001pxd.snapshot.11'), res=Snapshot)
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'asustek')])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert 1 == len(i['items'])
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'asus')])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert 1 == len(i['items'])
|
2018-09-29 10:24:22 +00:00
|
|
|
|
|
|
|
|
2020-07-07 15:17:41 +00:00
|
|
|
@pytest.mark.mvp
|
2018-10-04 08:59:31 +00:00
|
|
|
def test_device_query_search_synonyms_intel(user: UserClient):
|
2021-07-02 15:40:20 +00:00
|
|
|
s = yaml2json('real-hp.snapshot.11')
|
2018-09-29 10:24:22 +00:00
|
|
|
s['device']['model'] = 'foo' # The model had the word 'HP' in it
|
2021-07-02 15:40:20 +00:00
|
|
|
user.post(json_encode(s), res=Snapshot)
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'hewlett packard')])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert 1 == len(i['items'])
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'hewlett')])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert 1 == len(i['items'])
|
2018-10-04 08:59:31 +00:00
|
|
|
i, _ = user.get(res=Device, query=[('search', 'hp')])
|
2018-10-31 10:40:45 +00:00
|
|
|
assert 1 == len(i['items'])
|
|
|
|
i, _ = user.get(res=Device, query=[('search', 'h.p')])
|
|
|
|
assert 1 == len(i['items'])
|