Merge pull request #423 from eReuse/changes/4025-new-hid

Changes/4025 new hid
This commit is contained in:
cayop 2023-01-18 17:49:41 +01:00 committed by GitHub
commit 149bc1c6f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
46 changed files with 1055 additions and 798 deletions

View File

@ -58,6 +58,8 @@ class InventoryView(LoginMixin, SnapshotMixin):
self.snapshot_json = ParseSnapshotLsHw(snapshot_json).get_snapshot() self.snapshot_json = ParseSnapshotLsHw(snapshot_json).get_snapshot()
snapshot = self.build() snapshot = self.build()
snapshot.device.set_hid()
snapshot.device.binding.device.set_hid()
db.session.add(snapshot) db.session.add(snapshot)
snap_log = SnapshotsLog( snap_log = SnapshotsLog(

View File

@ -1,5 +1,6 @@
import itertools import itertools
import json import json
import uuid
from pathlib import Path from pathlib import Path
import click import click
@ -113,6 +114,8 @@ class Dummy:
for path in bar: for path in bar:
with path.open() as f: with path.open() as f:
snapshot = yaml.load(f) snapshot = yaml.load(f)
if snapshot['device']['type'] in ['Desktop', 'Laptop']:
snapshot['device']['system_uuid'] = uuid.uuid4()
s, _ = user1.post(res=m.Snapshot, data=self.json_encode(snapshot)) s, _ = user1.post(res=m.Snapshot, data=self.json_encode(snapshot))
if s.get('uuid', None) == 'ec23c11b-80b6-42cd-ac5c-73ba7acddbc4': if s.get('uuid', None) == 'ec23c11b-80b6-42cd-ac5c-73ba7acddbc4':
sample_pc = s['device']['id'] sample_pc = s['device']['id']

View File

@ -178,6 +178,7 @@
], ],
"type": "Laptop" "type": "Laptop"
}, },
"debug": {"lshw": {"configuration": {"uuid": "79c5098f-bc44-4834-8a59-9ea61d956c31"}}},
"elapsed": 14725, "elapsed": 14725,
"endTime": "2018-11-24T18:06:37.611704+00:00", "endTime": "2018-11-24T18:06:37.611704+00:00",
"software": "Workbench", "software": "Workbench",

View File

@ -119,6 +119,7 @@
"manufacturer": "ASUSTeK Computer INC." "manufacturer": "ASUSTeK Computer INC."
} }
], ],
"debug": {"lshw": {"configuration": {"uuid": "645f00bf-1ec0-4fdb-9608-b5ac73e285f6"}}},
"version": "11.0a4", "version": "11.0a4",
"elapsed": 6, "elapsed": 6,
"endTime": "2016-11-03T17:17:17.266543+00:00" "endTime": "2016-11-03T17:17:17.266543+00:00"

View File

@ -148,6 +148,7 @@
"model": "0UG982" "model": "0UG982"
} }
], ],
"debug": {"lshw": {"configuration": {"uuid": "5dcdd380-5a54-48bc-99bf-aff6019e8491"}}},
"version": "11.0a3", "version": "11.0a3",
"closed": false, "closed": false,
"elapsed": 1512, "elapsed": 1512,

View File

@ -132,5 +132,6 @@
"model": "HP Compaq 8100 Elite SFF", "model": "HP Compaq 8100 Elite SFF",
"manufacturer": "Hewlett-Packard" "manufacturer": "Hewlett-Packard"
}, },
"debug": {"lshw": {"configuration": {"uuid": "f6cfe48a-93d5-4e94-ab7b-3ee371e4d048"}}},
"version": "11.0a3" "version": "11.0a3"
} }

View File

@ -170,5 +170,6 @@
}, },
"software": "Workbench", "software": "Workbench",
"endTime": "2018-07-11T10:30:22.395958+00:00", "endTime": "2018-07-11T10:30:22.395958+00:00",
"debug": {"lshw": {"configuration": {"uuid": "75dcb454-ae80-4a87-a192-185d3b0250c0"}}},
"elapsed": 2766 "elapsed": 2766
} }

View File

@ -146,6 +146,7 @@
"pcmcia": 0 "pcmcia": 0
} }
], ],
"debug": {"lshw": {"configuration": {"uuid": "fcaf784e-5e57-43a2-b03f-8c56dabd0415"}}},
"uuid": "a01eacdb-db01-43ec-b6fb-a9b8cd21492d", "uuid": "a01eacdb-db01-43ec-b6fb-a9b8cd21492d",
"type": "Snapshot", "type": "Snapshot",
"version": "11.0a4", "version": "11.0a4",

View File

@ -4,6 +4,7 @@
"closed": false, "closed": false,
"endTime": "2018-07-11T13:26:29.365504+00:00", "endTime": "2018-07-11T13:26:29.365504+00:00",
"type": "Snapshot", "type": "Snapshot",
"debug": {"lshw": {"configuration": {"uuid": "4f256440-e43f-429a-a2c6-1e8f3365de56"}}},
"device": { "device": {
"serialNumber": "PB357N0", "serialNumber": "PB357N0",
"actions": [ "actions": [

View File

@ -148,6 +148,7 @@
"slots": 4 "slots": 4
} }
], ],
"debug": {"lshw": {"configuration": {"uuid": "077cad5d-ae1b-4156-a9a1-98bca6fa5c35"}}},
"version": "11.0a3", "version": "11.0a3",
"endTime": "2018-07-11T10:28:55.879745+00:00", "endTime": "2018-07-11T10:28:55.879745+00:00",
"type": "Snapshot", "type": "Snapshot",

View File

@ -136,8 +136,8 @@
], ],
"elapsed": 203, "elapsed": 203,
"device": { "device": {
"manufacturer": null, "manufacturer": "Asus",
"model": null, "model": "P7P55D",
"chassis": "Tower", "chassis": "Tower",
"type": "Desktop", "type": "Desktop",
"serialNumber": null, "serialNumber": null,
@ -158,7 +158,7 @@
] ]
}, },
"version": "11.0a6", "version": "11.0a6",
"debug": {"lshw": {"configuration": {"uuid": "59ca9a2a-65bd-4802-89bb-315156a9352b"}}},
"type": "Snapshot", "type": "Snapshot",
"closed": true, "closed": true,
"software": "Workbench" "software": "Workbench"

View File

@ -142,7 +142,7 @@
}, },
"elapsed": 238, "elapsed": 238,
"endTime": "2018-10-15T13:59:37.431309+00:00", "endTime": "2018-10-15T13:59:37.431309+00:00",
"debug": {"lshw": {"configuration": {"uuid": "43686b8e-e1ae-4e4e-bc51-f98f51e97c2d"}}},
"software": "Workbench", "software": "Workbench",
"type": "Snapshot", "type": "Snapshot",
"uuid": "ec23c11b-80b6-42cd-ac5c-73ba7acddbc4", "uuid": "ec23c11b-80b6-42cd-ac5c-73ba7acddbc4",

View File

@ -158,5 +158,6 @@
} }
] ]
}, },
"debug": {"lshw": {"configuration": {"uuid": "a0cef731-9a78-4087-889c-dfb6ba5c2e9b"}}},
"closed": false "closed": false
} }

View File

@ -114,6 +114,7 @@
} }
], ],
"version": "11.0a3", "version": "11.0a3",
"debug": {"lshw": {"configuration": {"uuid": "f2c50acd-501a-4f0b-b07c-58254b2ab8c9"}}},
"device": { "device": {
"type": "Desktop", "type": "Desktop",
"model": "HP Compaq 8000 Elite SFF", "model": "HP Compaq 8000 Elite SFF",

View File

@ -1,6 +1,7 @@
{ {
"closed": false, "closed": false,
"uuid": "f9e5e587-baee-44e1-9a94-255d216bbda9", "uuid": "f9e5e587-baee-44e1-9a94-255d216bbda9",
"debug": {"lshw": {"configuration": {"uuid": "4d21dd26-aa45-4902-a5f2-8a06e364cf25"}}},
"components": [ "components": [
{ {
"actions": [], "actions": [],

View File

@ -131,6 +131,7 @@
"model": "NB200" "model": "NB200"
}, },
"uuid": "918726ae-c6bc-40aa-97cf-ad80d69268f9", "uuid": "918726ae-c6bc-40aa-97cf-ad80d69268f9",
"debug": {"lshw": {"configuration": {"uuid": "33627ef0-89a9-4659-bb29-faa936727e0b"}}},
"closed": false, "closed": false,
"type": "Snapshot" "type": "Snapshot"
} }

View File

@ -31,7 +31,7 @@ from wtforms.fields import FormField
from ereuse_devicehub.db import db from ereuse_devicehub.db import db
from ereuse_devicehub.inventory.models import DeliveryNote, ReceiverNote, Transfer from ereuse_devicehub.inventory.models import DeliveryNote, ReceiverNote, Transfer
from ereuse_devicehub.parser.models import PlaceholdersLog from ereuse_devicehub.parser.models import PlaceholdersLog, SnapshotsLog
from ereuse_devicehub.parser.parser import ParseSnapshotLsHw from ereuse_devicehub.parser.parser import ParseSnapshotLsHw
from ereuse_devicehub.parser.schemas import Snapshot_lite from ereuse_devicehub.parser.schemas import Snapshot_lite
from ereuse_devicehub.resources.action.models import Snapshot, Trade from ereuse_devicehub.resources.action.models import Snapshot, Trade
@ -203,7 +203,9 @@ class FilterForm(FlaskForm):
if filter_type: if filter_type:
self.devices = self.devices.filter(Device.type.in_(filter_type)) self.devices = self.devices.filter(Device.type.in_(filter_type))
return self.devices.order_by(Device.updated.desc()) return self.devices.filter(Device.active.is_(True)).order_by(
Device.updated.desc()
)
class LotForm(FlaskForm): class LotForm(FlaskForm):
@ -247,6 +249,10 @@ class LotForm(FlaskForm):
class UploadSnapshotForm(SnapshotMixin, FlaskForm): class UploadSnapshotForm(SnapshotMixin, FlaskForm):
snapshot = MultipleFileField('Select a Snapshot File', [validators.DataRequired()]) snapshot = MultipleFileField('Select a Snapshot File', [validators.DataRequired()])
def __init__(self, *args, **kwargs):
self.create_new_devices = kwargs.pop('create_new_devices', False)
super().__init__(*args, **kwargs)
def validate(self, extra_validators=None): def validate(self, extra_validators=None):
is_valid = super().validate(extra_validators) is_valid = super().validate(extra_validators)
@ -313,10 +319,13 @@ class UploadSnapshotForm(SnapshotMixin, FlaskForm):
system_uuid = self.get_uuid(debug) system_uuid = self.get_uuid(debug)
if system_uuid: if system_uuid:
snapshot_json['device']['system_uuid'] = system_uuid snapshot_json['device']['system_uuid'] = system_uuid
self.get_fields_extra(debug, snapshot_json)
try: try:
snapshot_json = schema.load(snapshot_json) snapshot_json = schema.load(snapshot_json)
response = self.build(snapshot_json) response = self.build(
snapshot_json, create_new_device=self.create_new_devices
)
except ValidationError as err: except ValidationError as err:
txt = "{}".format(err) txt = "{}".format(err)
self.errors(txt=txt) self.errors(txt=txt)
@ -579,6 +588,7 @@ class NewDeviceForm(FlaskForm):
device.image = URL(self.image.data) device.image = URL(self.image.data)
device.placeholder = self.get_placeholder() device.placeholder = self.get_placeholder()
device.set_hid()
db.session.add(device) db.session.add(device)
placeholder_log = PlaceholdersLog( placeholder_log = PlaceholdersLog(
@ -1690,3 +1700,118 @@ class BindingForm(FlaskForm):
return False return False
return True return True
class UserTrustsForm(FlaskForm):
snapshot_type = SelectField(
'',
[validators.DataRequired()],
choices=[("new_device", "New Device"), ("update", "Update")],
default="new_device",
render_kw={'class': "form-select"},
)
def __init__(self, snapshot_uuid, *args, **kwargs):
self.snapshot = Snapshot.query.filter_by(uuid=snapshot_uuid).one()
self.device = None
if self.snapshot.device:
self.device = self.snapshot.device
self.snapshot_type.kwargs['default'] = self.snapshot.get_new_device()
super().__init__(*args, **kwargs)
def validate(self, extra_validators=None):
is_valid = super().validate(extra_validators)
if not is_valid:
txt = ""
self.snapthot_type.errors = [txt]
return False
return True
def unic(self):
try:
return self._unic
except Exception:
self._devices = (
Device.query.filter_by(
hid=self.device.hid, owner=g.user, placeholder=None, active=True
)
.order_by(Device.updated.asc())
.all()
)
self._unic = len(self._devices) < 2
return self._unic
def dhids_all_devices(self):
self.unic()
return ", ".join([x.dhid for x in self._devices][1:])
def dhid_base(self):
self.unic()
if not self._devices:
return ''
return self._devices[0].dhid
def show(self):
if not self.snapshot or not self.device:
return False
if not hasattr(self.device, 'system_uuid'):
return False
if not self.device.system_uuid:
return False
if self.snapshot.get_new_device() == 'update':
# To do Split
return True
if not self.unic():
if self.device == self._devices[0]:
return False
# To do merge
return True
return False
def save(self, commit=True):
if not self.show():
return
if self.snapshot_type.data == self.snapshot.get_new_device():
return
if self.snapshot_type.data == 'update' and not self.unic():
self.device.reliable()
if self.snapshot_type.data == 'new_device' and self.unic():
self.device.unreliable()
txt = "This devices is assigned as unreliable for the user "
txt += "and never is possible to do an update of this device."
self.error_log(txt)
if commit:
db.session.commit()
return self.snapshot
def error_log(self, txt):
snapshot = self.get_first_snapshot()
error = SnapshotsLog(
description=txt,
snapshot=snapshot,
snapshot_uuid=snapshot.uuid,
severity=Severity.Error,
sid=snapshot.sid,
version="{}".format(snapshot.version),
)
db.session.add(error)
def get_first_snapshot(self):
device = self.snapshot.device
for ac in device.actions:
if ac.type == 'Snapshot':
return ac

View File

@ -33,6 +33,7 @@ from ereuse_devicehub.inventory.forms import (
TransferForm, TransferForm,
UploadPlaceholderForm, UploadPlaceholderForm,
UploadSnapshotForm, UploadSnapshotForm,
UserTrustsForm,
) )
from ereuse_devicehub.labels.forms import PrintLabelsForm from ereuse_devicehub.labels.forms import PrintLabelsForm
from ereuse_devicehub.parser.models import PlaceholdersLog, SnapshotsLog from ereuse_devicehub.parser.models import PlaceholdersLog, SnapshotsLog
@ -67,7 +68,6 @@ class DeviceListMixin(GenericMixin):
page = int(request.args.get('page', 1)) page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', PER_PAGE)) per_page = int(request.args.get('per_page', PER_PAGE))
filter = request.args.get('filter', "All+Computers") filter = request.args.get('filter', "All+Computers")
# import pdb; pdb.set_trace()
lots = self.context['lots'] lots = self.context['lots']
form_filter = FilterForm(lots, lot_id, all_devices=all_devices) form_filter = FilterForm(lots, lot_id, all_devices=all_devices)
@ -1229,9 +1229,12 @@ class SnapshotListView(GenericMixin):
class SnapshotDetailView(GenericMixin): class SnapshotDetailView(GenericMixin):
template_name = 'inventory/snapshot_detail.html' template_name = 'inventory/snapshot_detail.html'
methods = ['GET', 'POST']
form_class = UserTrustsForm
def dispatch_request(self, snapshot_uuid): def dispatch_request(self, snapshot_uuid):
self.snapshot_uuid = snapshot_uuid self.snapshot_uuid = snapshot_uuid
form = self.form_class(snapshot_uuid)
self.get_context() self.get_context()
self.context['page_title'] = "Snapshot Detail" self.context['page_title'] = "Snapshot Detail"
self.context['snapshots_log'] = self.get_snapshots_log() self.context['snapshots_log'] = self.get_snapshots_log()
@ -1239,6 +1242,10 @@ class SnapshotDetailView(GenericMixin):
self.context['snapshot_sid'] = '' self.context['snapshot_sid'] = ''
if self.context['snapshots_log'].count(): if self.context['snapshots_log'].count():
self.context['snapshot_sid'] = self.context['snapshots_log'][0].sid self.context['snapshot_sid'] = self.context['snapshots_log'][0].sid
self.context['form'] = form
if form.validate_on_submit():
form.save()
return flask.render_template(self.template_name, **self.context) return flask.render_template(self.template_name, **self.context)

View File

@ -0,0 +1,35 @@
"""add vendor family in device
Revision ID: 564952310b17
Revises: af038a8a388c
Create Date: 2022-11-14 13:12:22.916848
"""
import citext
import sqlalchemy as sa
from alembic import context, op
# revision identifiers, used by Alembic.
revision = '564952310b17'
down_revision = 'af038a8a388c'
branch_labels = None
depends_on = None
def get_inv():
INV = context.get_x_argument(as_dictionary=True).get('inventory')
if not INV:
raise ValueError("Inventory value is not specified")
return INV
def upgrade():
op.add_column(
'device',
sa.Column('family', citext.CIText(), nullable=True),
schema=f'{get_inv()}',
)
def downgrade():
op.drop_column('device', 'family', schema=f'{get_inv()}')

View File

@ -0,0 +1,65 @@
"""add hash hid to device
Revision ID: 93daff872771
Revises: 564952310b17
Create Date: 2022-12-13 10:14:45.500087
"""
import hashlib
import citext
import sqlalchemy as sa
from alembic import context, op
# revision identifiers, used by Alembic.
revision = '93daff872771'
down_revision = '564952310b17'
branch_labels = None
depends_on = None
def get_inv():
INV = context.get_x_argument(as_dictionary=True).get('inventory')
if not INV:
raise ValueError("Inventory value is not specified")
return INV
def upgrade_data():
con = op.get_bind()
sql = f"update {get_inv()}.computer set user_trusts='t';"
con.execute(sql)
dev_sql = f"select id, hid from {get_inv()}.device;"
for d in con.execute(dev_sql):
if not d.hid:
continue
dev_id = d.id
chid = hashlib.sha3_256(d.hid.encode('utf-8')).hexdigest()
sql = f"update {get_inv()}.device set chid='{chid}' where id={dev_id};"
con.execute(sql)
con.execute(sql)
def upgrade():
op.add_column(
'computer',
sa.Column('user_trusts', sa.Boolean(), default=True, nullable=True),
schema=f'{get_inv()}',
)
op.add_column(
'device',
sa.Column('chid', citext.CIText(), nullable=True),
schema=f'{get_inv()}',
)
upgrade_data()
op.alter_column('computer', 'user_trusts', nullable=False, schema=f'{get_inv()}')
def downgrade():
op.drop_column('computer', 'user_trusts', schema=f'{get_inv()}')
op.drop_column('device', 'chid', schema=f'{get_inv()}')

View File

@ -38,7 +38,10 @@ class SnapshotsLog(Thing):
db.session.commit() db.session.commit()
def get_status(self): def get_status(self):
return Severity(self.severity) if self.snapshot:
return Severity(self.severity)
return ''
def get_device(self): def get_device(self):
if self.snapshot: if self.snapshot:

View File

@ -548,6 +548,12 @@ class ParseSnapshotLsHw:
return action return action
def get_hid_datas(self):
self.device.family = self.get_family()
def get_family(self):
return self.dmi.get("System", [{}])[0].get("Family", '')
def errors(self, txt=None, severity=Severity.Error): def errors(self, txt=None, severity=Severity.Error):
if not txt: if not txt:
return self._errors return self._errors

View File

@ -48,17 +48,14 @@ from sqlalchemy.util import OrderedSet
from teal.db import ( from teal.db import (
CASCADE_OWN, CASCADE_OWN,
INHERIT_COND, INHERIT_COND,
IP,
POLYMORPHIC_ID, POLYMORPHIC_ID,
POLYMORPHIC_ON, POLYMORPHIC_ON,
URL, URL,
ResourceNotFound,
StrictVersionType, StrictVersionType,
check_lower, check_lower,
check_range, check_range,
) )
from teal.enums import Country, Currency, Subdivision from teal.enums import Currency
from teal.marshmallow import ValidationError
from teal.resource import url_for_resource from teal.resource import url_for_resource
from ereuse_devicehub.db import db from ereuse_devicehub.db import db
@ -701,6 +698,19 @@ class Snapshot(JoinedWithOneDeviceMixin, ActionWithOneDevice):
return hdds return hdds
def get_new_device(self):
if not self.device:
return ''
snapshots = []
for s in self.device.actions:
if s == self:
break
if s.type == self.type:
snapshots.append(s)
return snapshots and 'update' or 'new_device'
def __str__(self) -> str: def __str__(self) -> str:
return '{}. {} version {}.'.format(self.severity, self.software, self.version) return '{}. {} version {}.'.format(self.severity, self.software, self.version)
@ -2009,7 +2019,7 @@ def update_components_action_one(target: ActionWithOneDevice, device: Device, __
if isinstance(device, Computer): if isinstance(device, Computer):
target.components |= device.components target.components |= device.components
elif isinstance(device, Computer): elif isinstance(device, Computer):
device.add_mac_to_hid() device.set_hid()
@event.listens_for( @event.listens_for(

View File

@ -64,7 +64,8 @@ def move_json(tmp_snapshots, path_name, user, live=False):
class SnapshotMixin: class SnapshotMixin:
sync = Sync() sync = Sync()
def build(self, snapshot_json=None): # noqa: C901 def build(self, snapshot_json=None, create_new_device=False): # noqa: C901
self.create_new_device = create_new_device
if not snapshot_json: if not snapshot_json:
snapshot_json = self.snapshot_json snapshot_json = self.snapshot_json
device = snapshot_json.pop('device') # type: Computer device = snapshot_json.pop('device') # type: Computer
@ -72,9 +73,7 @@ class SnapshotMixin:
if snapshot_json['software'] == ( if snapshot_json['software'] == (
SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid SnapshotSoftware.Workbench or SnapshotSoftware.WorkbenchAndroid
): ):
components = snapshot_json.pop('components', None) # type: List[Component] components = snapshot_json.pop('components', None)
if isinstance(device, Computer) and device.hid:
device.add_mac_to_hid(components_snap=components)
snapshot = Snapshot(**snapshot_json) snapshot = Snapshot(**snapshot_json)
# Remove new actions from devices so they don't interfere with sync # Remove new actions from devices so they don't interfere with sync
@ -89,7 +88,9 @@ class SnapshotMixin:
assert not device.actions_one assert not device.actions_one
assert all(not c.actions_one for c in components) if components else True assert all(not c.actions_one for c in components) if components else True
db_device, remove_actions = self.sync.run(device, components) db_device, remove_actions = self.sync.run(
device, components, self.create_new_device
)
del device # Do not use device anymore del device # Do not use device anymore
snapshot.device = db_device snapshot.device = db_device
@ -117,6 +118,9 @@ class SnapshotMixin:
self.is_server_erase(snapshot) self.is_server_erase(snapshot)
snapshot.device.set_hid()
snapshot.device.binding.device.set_hid()
return snapshot return snapshot
def is_server_erase(self, snapshot): def is_server_erase(self, snapshot):
@ -151,6 +155,30 @@ class SnapshotMixin:
uuid = UUID(hw_uuid) uuid = UUID(hw_uuid)
return UUID(bytes_le=uuid.bytes) return UUID(bytes_le=uuid.bytes)
def get_fields_extra(self, debug, snapshot_json):
if not debug or not isinstance(debug, dict):
return
lshw = debug.get('lshw', {})
family = lshw.get('configuration', {}).get('family', '')
snapshot_json['device']['family'] = family
# lshw_mothers = []
# for mt in lshw.get('children', []):
# if mt.get('description') == "Motherboard":
# lshw_mothers.append(mt)
# for comp in snapshot_json.get('components', []):
# if comp.get('type') != 'Motherboard':
# continue
# for mt in lshw_mothers:
# if comp['serialNumber'] == mt.get('serial', ''):
# comp['vendor'] = mt.get('vendor', '')
# comp['product'] = mt.get('product', '')
# comp['version'] = mt.get('version', '')
def errors(self, txt=None, severity=Severity.Error, snapshot=None, commit=False): def errors(self, txt=None, severity=Severity.Error, snapshot=None, commit=False):
if not txt: if not txt:
return return
@ -187,10 +215,13 @@ class SnapshotView(SnapshotMixin):
self.version = snapshot_json.get('version') self.version = snapshot_json.get('version')
self.uuid = snapshot_json.get('uuid') self.uuid = snapshot_json.get('uuid')
self.sid = None self.sid = None
system_uuid = self.get_uuid(snapshot_json.pop('debug', None)) self.debug = snapshot_json.pop('debug', {})
system_uuid = self.get_uuid(self.debug)
if system_uuid: if system_uuid:
snapshot_json['device']['system_uuid'] = system_uuid snapshot_json['device']['system_uuid'] = system_uuid
self.get_fields_extra(self.debug, snapshot_json)
try: try:
self.snapshot_json = resource_def.schema.load(snapshot_json) self.snapshot_json = resource_def.schema.load(snapshot_json)
snapshot = self.build() snapshot = self.build()

View File

@ -142,11 +142,14 @@ class LiveView(View):
return hid return hid
if macs: if macs:
mac = "-{mac}".format(mac=macs[0]) mac = "-{mac}".format(mac=macs[0])
hid += mac # hid += mac
return hid return hid
def live(self, snapshot): def live(self, snapshot):
"""If the device.allocated == True, then this snapshot create an action live.""" """If the device.allocated == True, then this snapshot create an action live."""
for c in snapshot['components']:
c.parent = snapshot['device']
snapshot['device'].set_hid()
hid = self.get_hid(snapshot) hid = self.get_hid(snapshot)
if not hid or not Device.query.filter(Device.hid == hid).count(): if not hid or not Device.query.filter(Device.hid == hid).count():
raise ValidationError('Device not exist.') raise ValidationError('Device not exist.')

View File

@ -21,27 +21,29 @@ class MetricsMix:
""" """
This is a template of a row. This is a template of a row.
""" """
return {'type': '', return {
'action_type': 'Status', 'type': '',
'document_name': '', 'action_type': 'Status',
'status_receiver': self.status_receiver, 'document_name': '',
'status_supplier': self.status_supplier, 'status_receiver': self.status_receiver,
'status_receiver_created': '', 'status_supplier': self.status_supplier,
'status_supplier_created': '', 'status_receiver_created': '',
'trade_supplier': '', 'status_supplier_created': '',
'trade_receiver': self.act.author.email, 'trade_supplier': '',
'trade_confirmed': '', 'trade_receiver': self.act.author.email,
'trade_weight': 0, 'trade_confirmed': '',
'action_create_by': self.action_create_by, 'trade_weight': 0,
'devicehubID': self.devicehub_id, 'action_create_by': self.action_create_by,
'hid': self.hid, 'devicehubID': self.devicehub_id,
'finalUserCode': '', 'hid': self.hid,
'numEndUsers': 0, 'finalUserCode': '',
'liveCreate': 0, 'numEndUsers': 0,
'usageTimeHdd': self.lifetime, 'liveCreate': 0,
'created': self.act.created, 'usageTimeHdd': self.lifetime,
'start': '', 'created': self.act.created,
'usageTimeAllocate': 0} 'start': '',
'usageTimeAllocate': 0,
}
def get_metrics(self): def get_metrics(self):
""" """
@ -57,7 +59,7 @@ class Metrics(MetricsMix):
self.device = kwargs.pop('device') self.device = kwargs.pop('device')
self.actions = copy.copy(self.device.actions) self.actions = copy.copy(self.device.actions)
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.hid = self.device.hid self.hid = self.device.chid
self.devicehub_id = self.device.devicehub_id self.devicehub_id = self.device.devicehub_id
def get_action_status(self): def get_action_status(self):

View File

@ -1,5 +1,9 @@
import copy import copy
import hashlib
import json
import os
import pathlib import pathlib
import uuid
from contextlib import suppress from contextlib import suppress
from fractions import Fraction from fractions import Fraction
from itertools import chain from itertools import chain
@ -8,7 +12,8 @@ from typing import Dict, List, Set
from boltons import urlutils from boltons import urlutils
from citext import CIText from citext import CIText
from ereuse_utils.naming import HID_CONVERSION_DOC, Naming from ereuse_utils.naming import HID_CONVERSION_DOC
from flask import current_app as app
from flask import g, request from flask import g, request
from more_itertools import unique_everseen from more_itertools import unique_everseen
from sqlalchemy import BigInteger, Boolean, Column from sqlalchemy import BigInteger, Boolean, Column
@ -181,6 +186,8 @@ class Device(Thing):
dhid_bk = db.Column(db.CIText(), nullable=True, unique=False) dhid_bk = db.Column(db.CIText(), nullable=True, unique=False)
phid_bk = db.Column(db.CIText(), nullable=True, unique=False) phid_bk = db.Column(db.CIText(), nullable=True, unique=False)
active = db.Column(Boolean, default=True) active = db.Column(Boolean, default=True)
family = db.Column(db.CIText())
chid = db.Column(db.CIText())
_NON_PHYSICAL_PROPS = { _NON_PHYSICAL_PROPS = {
'id', 'id',
@ -201,6 +208,7 @@ class Device(Thing):
'production_date', 'production_date',
'variant', 'variant',
'version', 'version',
'family',
'sku', 'sku',
'image', 'image',
'allocated', 'allocated',
@ -209,6 +217,11 @@ class Device(Thing):
'active', 'active',
'phid_bk', 'phid_bk',
'dhid_bk', 'dhid_bk',
'chid',
'user_trusts',
'chassis',
'transfer_state',
'receiver_id',
} }
__table_args__ = ( __table_args__ = (
@ -254,16 +267,17 @@ class Device(Thing):
""" """
actions_multiple = copy.copy(self.actions_multiple) actions_multiple = copy.copy(self.actions_multiple)
actions_one = copy.copy(self.actions_one) actions_one = copy.copy(self.actions_one)
actions = []
for ac in actions_multiple: for ac in actions_multiple:
ac.real_created = ac.actions_device[0].created ac.real_created = ac.actions_device[0].created
actions.append(ac)
for ac in actions_one: for ac in actions_one:
ac.real_created = ac.created ac.real_created = ac.created
actions.append(ac)
return sorted( return sorted(actions, key=lambda x: x.real_created)
chain(actions_multiple, actions_one), key=lambda x: x.real_created
)
@property @property
def problems(self): def problems(self):
@ -742,11 +756,52 @@ class Device(Thing):
return "" return ""
def get_from_db(self):
if 'property_hid' in app.blueprints.keys():
try:
from modules.device.utils import get_from_db
return get_from_db(self)
except Exception:
pass
if not self.hid:
return
return Device.query.filter_by(
hid=self.hid,
owner_id=g.user.id,
active=True,
placeholder=None,
).first()
def set_hid(self): def set_hid(self):
with suppress(TypeError): if 'property_hid' in app.blueprints.keys():
self.hid = Naming.hid( try:
self.type, self.manufacturer, self.model, self.serial_number from modules.device.utils import set_hid
)
self.hid = set_hid(self)
self.set_chid()
return
except Exception:
pass
self.hid = "{}-{}-{}-{}".format(
self._clean_string(self.type),
self._clean_string(self.manufacturer),
self._clean_string(self.model),
self._clean_string(self.serial_number),
).lower()
self.set_chid()
def _clean_string(self, s):
if not s:
return ''
return s.replace(' ', '_')
def set_chid(self):
if self.hid:
self.chid = hashlib.sha3_256(self.hid.encode()).hexdigest()
def last_action_of(self, *types): def last_action_of(self, *types):
"""Gets the last action of the given types. """Gets the last action of the given types.
@ -826,6 +881,122 @@ class Device(Thing):
} }
return types.get(self.type, '') return types.get(self.type, '')
def unreliable(self):
self.user_trusts = False
i = 0
snapshot1 = None
snapshots = {}
for ac in self.actions:
if ac.type == 'Snapshot':
if i == 0:
snapshot1 = ac
if i > 0:
snapshots[ac] = self.get_snapshot_file(ac)
i += 1
if not snapshot1:
return
self.create_new_device(snapshots.values())
self.remove_snapshot(snapshots.keys())
return
def get_snapshot_file(self, action):
uuid = action.uuid
user = g.user.email
name_file = f"*_{user}_{uuid}.json"
tmp_snapshots = app.config['TMP_SNAPSHOTS']
path_dir_base = os.path.join(tmp_snapshots, user)
for _file in pathlib.Path(path_dir_base).glob(name_file):
with open(_file) as file_snapshot:
snapshot = file_snapshot.read()
return json.loads(snapshot)
def create_new_device(self, snapshots):
from ereuse_devicehub.inventory.forms import UploadSnapshotForm
new_snapshots = []
for snapshot in snapshots:
snapshot['uuid'] = str(uuid.uuid4())
filename = "{}.json".format(snapshot['uuid'])
new_snapshots.append((filename, snapshot))
form = UploadSnapshotForm()
form.result = {}
form.snapshots = new_snapshots
form.create_new_devices = True
form.save(commit=False)
def remove_snapshot(self, snapshots):
from ereuse_devicehub.parser.models import SnapshotsLog
for ac in snapshots:
for slog in SnapshotsLog.query.filter_by(snapshot=ac):
slog.snapshot_id = None
slog.snapshot_uuid = None
db.session.delete(ac)
def remove_devices(self, devices):
from ereuse_devicehub.parser.models import SnapshotsLog
for dev in devices:
for ac in dev.actions:
if ac.type != 'Snapshot':
continue
for slog in SnapshotsLog.query.filter_by(snapshot=ac):
slog.snapshot_id = None
slog.snapshot_uuid = None
for c in dev.components:
c.parent_id = None
for tag in dev.tags:
tag.device_id = None
placeholder = dev.binding or dev.placeholder
if placeholder:
db.session.delete(placeholder.binding)
db.session.delete(placeholder.device)
db.session.delete(placeholder)
def reliable(self):
computers = Computer.query.filter_by(
hid=self.hid,
owner_id=g.user.id,
active=True,
placeholder=None,
).order_by(Device.created.asc())
i = 0
computer1 = None
computers_to_remove = []
for d in computers:
if i == 0:
d.user_trusts = True
computer1 = d
i += 1
continue
computers_to_remove.append(d)
self.remove_devices(computers_to_remove)
if not computer1:
return
snapshot1 = None
for ac in computer1.actions_one:
if ac.type == 'Snapshot':
snapshot1 = ac
break
if not snapshot1:
return
return
def __lt__(self, other): def __lt__(self, other):
return self.id < other.id return self.id < other.id
@ -1026,6 +1197,7 @@ class Computer(Device):
receiver_id = db.Column(UUID(as_uuid=True), db.ForeignKey(User.id), nullable=True) receiver_id = db.Column(UUID(as_uuid=True), db.ForeignKey(User.id), nullable=True)
receiver = db.relationship(User, primaryjoin=receiver_id == User.id) receiver = db.relationship(User, primaryjoin=receiver_id == User.id)
system_uuid = db.Column(UUID(as_uuid=True), nullable=True) system_uuid = db.Column(UUID(as_uuid=True), nullable=True)
user_trusts = db.Column(Boolean(), default=True)
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
if args: if args:

View File

@ -120,6 +120,7 @@ class Device(Thing):
dhid = SanitizedStr( dhid = SanitizedStr(
data_key='devicehubID', description=m.Device.devicehub_id.comment data_key='devicehubID', description=m.Device.devicehub_id.comment
) )
family = SanitizedStr(validate=Length(max=STR_BIG_SIZE))
@pre_load @pre_load
def from_actions_to_actions_one(self, data: dict): def from_actions_to_actions_one(self, data: dict):

View File

@ -1,6 +1,5 @@
import copy import copy
import difflib import difflib
from contextlib import suppress
from itertools import groupby from itertools import groupby
from typing import Iterable, Set from typing import Iterable, Set
@ -17,7 +16,6 @@ from ereuse_devicehub.resources.action.models import Remove
from ereuse_devicehub.resources.device.models import ( from ereuse_devicehub.resources.device.models import (
Component, Component,
Computer, Computer,
DataStorage,
Device, Device,
Placeholder, Placeholder,
) )
@ -32,19 +30,15 @@ DEVICES_ALLOW_DUPLICITY = [
'GraphicCard', 'GraphicCard',
] ]
err_motherboard = "Error: We have detected that a there is a device"
err_motherboard += " in your inventory with this system UUID. "
err_motherboard += "We proceed to block this snapshot to prevent its"
err_motherboard += " information from being updated incorrectly."
err_motherboard += " The solution we offer you to inventory this device "
err_motherboard += "is to do it by creating a placeholder."
class Sync: class Sync:
"""Synchronizes the device and components with the database.""" """Synchronizes the device and components with the database."""
def run( def run(
self, device: Device, components: Iterable[Component] or None self,
device: Device,
components: Iterable[Component] or None,
create_new_device=False,
) -> (Device, OrderedSet): ) -> (Device, OrderedSet):
"""Synchronizes the device and components with the database. """Synchronizes the device and components with the database.
@ -76,17 +70,11 @@ class Sync:
of the passed-in components. of the passed-in components.
2. A list of Add / Remove (not yet added to session). 2. A list of Add / Remove (not yet added to session).
""" """
db_device = self.execute_register(device)
motherboard = None
if components: if components:
for c in components: device.components = OrderedSet(components)
if c.type == "Motherboard": device.set_hid()
motherboard = c device.components = OrderedSet()
db_device = self.execute_register(device, create_new_device)
if motherboard:
for c in db_device.components:
if c.type == "Motherboard" and motherboard.hid != c.hid:
raise ValidationError(err_motherboard)
db_components, actions = OrderedSet(), OrderedSet() db_components, actions = OrderedSet(), OrderedSet()
if components is not None: # We have component info (see above) if components is not None: # We have component info (see above)
@ -94,12 +82,9 @@ class Sync:
# Until a good reason is given, we synthetically forbid # Until a good reason is given, we synthetically forbid
# non-computers with components # non-computers with components
raise ValidationError('Only computers can have components.') raise ValidationError('Only computers can have components.')
blacklist = set() # type: Set[int]
not_new_components = set() not_new_components = set()
for component in components: for component in components:
db_component, is_new = self.execute_register_component( db_component, is_new = self.execute_register_component(component)
component, blacklist, parent=db_device
)
db_components.add(db_component) db_components.add(db_component)
if not is_new: if not is_new:
not_new_components.add(db_component) not_new_components.add(db_component)
@ -110,9 +95,7 @@ class Sync:
self.create_placeholder(db_device) self.create_placeholder(db_device)
return db_device, actions return db_device, actions
def execute_register_component( def execute_register_component(self, component: Component):
self, component: Component, blacklist: Set[int], parent: Computer
):
"""Synchronizes one component to the DB. """Synchronizes one component to the DB.
This method is a specialization of :meth:`.execute_register` This method is a specialization of :meth:`.execute_register`
@ -134,7 +117,6 @@ class Sync:
- A flag stating if the device is new or it already - A flag stating if the device is new or it already
existed in the DB. existed in the DB.
""" """
# if device.serial_number == 'b8oaas048286':
assert inspect(component).transient, 'Component should not be synced from DB' assert inspect(component).transient, 'Component should not be synced from DB'
# if not is a DataStorage, then need build a new one # if not is a DataStorage, then need build a new one
if component.t in DEVICES_ALLOW_DUPLICITY: if component.t in DEVICES_ALLOW_DUPLICITY:
@ -142,33 +124,20 @@ class Sync:
is_new = True is_new = True
return component, is_new return component, is_new
# if not, then continue with the traditional behaviour db_component = None
try:
if component.hid: if component.hid:
db_component = Device.query.filter_by( db_component = Device.query.filter_by(
hid=component.hid, owner_id=g.user.id, placeholder=None hid=component.hid, owner_id=g.user.id, placeholder=None, active=True
).one() ).first()
assert isinstance( is_new = False
db_component, Device if not db_component:
), '{} must be a component'.format(db_component)
else:
# Is there a component similar to ours?
db_component = component.similar_one(parent, blacklist)
# We blacklist this component so we
# ensure we don't get it again for another component
# with the same physical properties
blacklist.add(db_component.id)
except ResourceNotFound:
db.session.add(component) db.session.add(component)
# db.session.flush()
db_component = component db_component = component
is_new = True is_new = True
else:
self.merge(component, db_component)
is_new = False
return db_component, is_new return db_component, is_new
def execute_register(self, device: Device) -> Device: def execute_register(self, device: Device, create_new_device=False) -> Device:
"""Synchronizes one device to the DB. """Synchronizes one device to the DB.
This method tries to get an existing device using the HID This method tries to get an existing device using the HID
@ -195,84 +164,22 @@ class Sync:
:raise DatabaseError: Any other error from the DB. :raise DatabaseError: Any other error from the DB.
:return: The synced device from the db with the tags linked. :return: The synced device from the db with the tags linked.
""" """
assert inspect(device).transient, 'Device cannot be already synced from DB' db_device = device.get_from_db()
assert all(
inspect(tag).transient for tag in device.tags
), 'Tags cannot be synced from DB'
db_device = None
if isinstance(device, Computer):
# first search by uuid
if device.system_uuid:
with suppress(ResourceNotFound):
db_device = Computer.query.filter_by(
system_uuid=device.system_uuid,
owner_id=g.user.id,
active=True,
placeholder=None,
).one()
# if no there are any Computer by uuid search by hid
if not db_device and device.hid:
with suppress(ResourceNotFound):
db_device = Device.query.filter_by(
hid=device.hid,
owner_id=g.user.id,
active=True,
placeholder=None,
).one()
elif device.hid:
with suppress(ResourceNotFound):
db_device = Device.query.filter_by(
hid=device.hid, owner_id=g.user.id, active=True, placeholder=None
).one()
if db_device and db_device.allocated: if db_device and db_device.allocated:
raise ResourceNotFound('device is actually allocated {}'.format(device)) raise ResourceNotFound('device is actually allocated {}'.format(device))
try: if not db_device or create_new_device:
tags = {
Tag.from_an_id(tag.id).one() for tag in device.tags
} # type: Set[Tag]
except ResourceNotFound:
raise ResourceNotFound('tag you are linking to device {}'.format(device))
linked_tags = {tag for tag in tags if tag.device_id} # type: Set[Tag]
if linked_tags:
sample_tag = next(iter(linked_tags))
for tag in linked_tags:
if tag.device_id != sample_tag.device_id:
raise MismatchBetweenTags(
tag, sample_tag
) # Tags linked to different devices
if db_device: # Device from hid
if (
sample_tag.device_id != db_device.id
): # Device from hid != device from tags
raise MismatchBetweenTagsAndHid(db_device.id, db_device.hid)
else: # There was no device from hid
if sample_tag.device.physical_properties != device.physical_properties:
# Incoming physical props of device != props from tag's device
# which means that the devices are not the same
raise MismatchBetweenProperties(
sample_tag.device.physical_properties,
device.physical_properties,
)
db_device = sample_tag.device
if db_device: # Device from hid or tags
self.merge(device, db_device)
else: # Device is new and tags are not linked to a device
device.tags.clear() # We don't want to add the transient dummy tags device.tags.clear() # We don't want to add the transient dummy tags
db.session.add(device) db.session.add(device)
db_device = device db_device = device
db_device.tags |= (
tags # Union of tags the device had plus the (potentially) new ones
)
try: try:
db.session.flush() db.session.flush()
except IntegrityError as e: except IntegrityError as e:
# Manage 'one tag per organization' unique constraint # Manage 'one tag per organization' unique constraint
if 'One tag per organization' in e.args[0]: if 'One tag per organization' in e.args[0]:
# todo test for this # todo test for this
id = int(e.args[0][135 : e.args[0].index(',', 135)]) id = int(e.args[0][135 : e.args[0].index(',', 135)]) # noqa: E203
raise ValidationError( raise ValidationError(
'The device is already linked to tag {} ' 'The device is already linked to tag {} '
'from the same organization.'.format(id), 'from the same organization.'.format(id),
@ -283,29 +190,6 @@ class Sync:
assert db_device is not None assert db_device is not None
return db_device return db_device
@staticmethod
def merge(device: Device, db_device: Device):
"""Copies the physical properties of the device to the db_device.
This method mutates db_device.
"""
if db_device.owner_id != g.user.id:
return
if device.placeholder and not db_device.placeholder:
return
for field_name, value in device.physical_properties.items():
if value is not None:
setattr(db_device, field_name, value)
# if device.system_uuid and db_device.system_uuid and device.system_uuid != db_device.system_uuid:
# TODO @cayop send error to sentry.io
# there are 2 computers duplicate get db_device for hid
if hasattr(device, 'system_uuid') and device.system_uuid:
db_device.system_uuid = device.system_uuid
@staticmethod @staticmethod
def create_placeholder(device: Device): def create_placeholder(device: Device):
"""If the device is new, we need create automaticaly a new placeholder""" """If the device is new, we need create automaticaly a new placeholder"""

View File

@ -302,7 +302,7 @@ class DeviceMergeView(View):
setattr(self.base_device, field_name, value) setattr(self.base_device, field_name, value)
self.base_device.hid = self.with_device.hid self.base_device.hid = self.with_device.hid
self.base_device.add_mac_to_hid() self.base_device.set_hid()
class ManufacturerView(View): class ManufacturerView(View):

View File

@ -285,7 +285,7 @@ class DeviceRow(BaseDeviceRow):
self['Tag {} ID'.format(i)] = tag.id self['Tag {} ID'.format(i)] = tag.id
self['Tag {} Organization'.format(i)] = tag.org.name self['Tag {} Organization'.format(i)] = tag.org.name
self['Device Hardware ID'] = device.hid self['Device Hardware ID'] = device.chid
self['Device Type'] = device.t self['Device Type'] = device.t
if isinstance(device, d.Computer) and not device.placeholder: if isinstance(device, d.Computer) and not device.placeholder:
self['Device Chassis'] = device.chassis.name self['Device Chassis'] = device.chassis.name
@ -433,12 +433,12 @@ class DeviceRow(BaseDeviceRow):
] ]
erasure = erasures[-1] if erasures else None erasure = erasures[-1] if erasures else None
if not erasure: if not erasure:
self['Erasure {} {}'.format(ctype, i)] = none2str(component.hid) self['Erasure {} {}'.format(ctype, i)] = none2str(component.chid)
serial_number = none2str(component.serial_number) serial_number = none2str(component.serial_number)
self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number
self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size) self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size)
elif hasattr(erasure, 'type') and erasure.type == 'DataWipe': elif hasattr(erasure, 'type') and erasure.type == 'DataWipe':
self['Erasure {} {}'.format(ctype, i)] = none2str(component.hid) self['Erasure {} {}'.format(ctype, i)] = none2str(component.chid)
serial_number = none2str(component.serial_number) serial_number = none2str(component.serial_number)
self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number
self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size) self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size)
@ -448,7 +448,7 @@ class DeviceRow(BaseDeviceRow):
erasure.document.url and erasure.document.url.to_text() or '' erasure.document.url and erasure.document.url.to_text() or ''
) )
else: else:
self['Erasure {} {}'.format(ctype, i)] = none2str(component.hid) self['Erasure {} {}'.format(ctype, i)] = none2str(component.chid)
serial_number = none2str(component.serial_number) serial_number = none2str(component.serial_number)
self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number self['Erasure {} {} Serial Number'.format(ctype, i)] = serial_number
self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size) self['Erasure {} {} Size (MB)'.format(ctype, i)] = none2str(component.size)

View File

@ -93,6 +93,10 @@ class Lot(Thing):
) )
receiver = db.relationship(User, primaryjoin=receiver_address == User.email) receiver = db.relationship(User, primaryjoin=receiver_address == User.email)
# __table_args__ = (
# {'schema': 'dbtest'},
# )
def __init__( def __init__(
self, name: str, closed: bool = closed.default.arg, description: str = None self, name: str, closed: bool = closed.default.arg, description: str = None
) -> None: ) -> None:

View File

@ -20,9 +20,46 @@
<div class="card-body pt-3"> <div class="card-body pt-3">
<h3>{{ snapshot_sid }} | {{ snapshot_uuid }}</h3> <h3>{{ snapshot_sid }} | {{ snapshot_uuid }}</h3>
<!-- Bordered Tabs --> <!-- Bordered Tabs -->
{% if form.show() %}
<ul class="nav nav-tabs nav-tabs-bordered">
<li class="nav-item">
<button class="nav-link active" data-bs-toggle="tab" data-bs-target="#log">Log</button>
</li>
<li class="nav-item">
<button class="nav-link" data-bs-toggle="tab" data-bs-target="#change-type">Change type updated</button>
</li>
</ul>
{% endif %}
<div class="tab-content pt-2"> <div class="tab-content pt-2">
<div class="tab-pane fade show active"> {% if form.show() %}
<div class="tab-pane fade" id="change-type">
<h5 class="card-title">Change Snapshot Type Upload</h5>
<div class="list-group col-6">
<div class="list-group-item">
<form method="post" class="row g-3 needs-validation" id="form_change_updated">
{{ form.csrf_token }}
{% for f in form %}
{% if f != form.csrf_token %}
<p class="mb-1">
{{ f }}
</p>
{% endif %}
{% endfor %}
<p class="mb-1">
<!-- <button class="btn btn-primary" type="submit">Save</button> -->
<a href="javascript:change_updated()" type="button" class="btn btn-primary">Save</a>
<span class="d-none" id="activeChangeUpdatedModal" data-bs-toggle="modal" data-bs-target="#btnChangeStatus"></span>
</p>
</form>
</div>
</div>
</div>
{% endif %}
<div class="tab-pane fade show active" id="log">
<h5 class="card-title">Traceability log Details</h5> <h5 class="card-title">Traceability log Details</h5>
<div class="list-group col-6"> <div class="list-group col-6">
{% for log in snapshots_log %} {% for log in snapshots_log %}
@ -51,4 +88,62 @@
</div> </div>
</div> </div>
</section> </section>
<div class="modal fade" id="btnChangeStatus" tabindex="-1" style="display: none;" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Change type updated</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="new_device" class="d-none">
Are you sure that you want to Change to <strong>New device</strong>?
<p class="text-danger mt-3">
Please be certain, once you confirm this step there is no going back.<br />
<br />
All the updates that have the {{ form.device.dhid }} device will become new devices and
you will not be able to do any update over these devices.
</p>
</div>
<div id="update" class="d-none">
Are you sure that you want to Change to <strong>Update</strong>?
<p class="text-danger mt-3">
Please be certain, once you confirm there is no going back.<br />
<br />
All the devices {{ form.dhids_all_devices() }}
will be deleted and the device {{ form.dhid_base() }} will be set as the device base.<br />
After this change you will be able to update this device.
</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary-outline" data-bs-dismiss="modal">Cancel</button>
<a href="javascript:send_form_change_updated()" type="button" class="btn btn-danger">
Confirm Save!
</a>
</div>
</div>
</div>
</div>
<script>
function change_updated() {
$("#update").attr('class', 'd-none');
$("#new_device").attr('class', 'd-none');
const stype = $("#snapshot_type").val();
$("#"+stype).attr('class', 'd-block');
$("#activeChangeUpdatedModal").click();
}
function send_form_change_updated() {
$("#form_change_updated").trigger('submit');
}
</script>
{% endblock main %} {% endblock main %}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -158,5 +158,6 @@
} }
] ]
}, },
"debug": {"lshw": {"configuration": {"uuid": "79c5098f-bc44-4834-8a59-9ea61d956c31"}}},
"closed": false "closed": false
} }

View File

@ -2941,7 +2941,7 @@ def test_delete_devices_check_sync(user: UserClient):
in [y.device.id for y in x.actions if hasattr(y, 'device')] in [y.device.id for y in x.actions if hasattr(y, 'device')]
] ]
) )
== 1 == 2
) )

View File

@ -141,47 +141,14 @@ def test_physical_properties():
'ram_slots': None, 'ram_slots': None,
} }
assert pc.physical_properties == { assert pc.physical_properties == {
'chassis': ComputerChassis.Tower,
'amount': 0, 'amount': 0,
'manufacturer': 'bar', 'manufacturer': 'bar',
'model': 'foo', 'model': 'foo',
'receiver_id': None,
'serial_number': 'foo-bar', 'serial_number': 'foo-bar',
'part_number': None, 'part_number': None,
'transfer_state': TransferState.Initial,
} }
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_component_similar_one():
user = User.query.filter().first()
snapshot = yaml2json('pc-components.db')
pc = snapshot['device']
snapshot['components'][0]['serial_number'] = snapshot['components'][1][
'serial_number'
] = None
pc = d.Desktop(
**pc, components=OrderedSet(d.Component(**c) for c in snapshot['components'])
)
component1, component2 = pc.components # type: d.Component
db.session.add(pc)
db.session.flush()
# Let's create a new component named 'A' similar to 1
componentA = d.Component(
model=component1.model, manufacturer=component1.manufacturer, owner_id=user.id
)
similar_to_a = componentA.similar_one(pc, set())
assert similar_to_a == component1
# d.Component B does not have the same model
componentB = d.Component(model='nope', manufacturer=component1.manufacturer)
with pytest.raises(ResourceNotFound):
assert componentB.similar_one(pc, set())
# If we blacklist component A we won't get anything
with pytest.raises(ResourceNotFound):
assert componentA.similar_one(pc, blacklist={componentA.id})
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__) @pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_add_remove(): def test_add_remove():
@ -301,69 +268,6 @@ def test_sync_execute_register_desktop_no_hid_no_tag(user: UserClient):
assert returned_pc == pc assert returned_pc == pc
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_desktop_tag_not_linked():
"""Syncs a new d.Desktop with HID and a non-linked tag.
It is OK if the tag was not linked, it will be linked in this process.
"""
tag = Tag(id='foo')
db.session.add(tag)
db.session.commit()
# Create a new transient non-db object
pc = d.Desktop(
**yaml2json('pc-components.db')['device'], tags=OrderedSet([Tag(id='foo')])
)
returned_pc = Sync().execute_register(pc)
assert returned_pc == pc
assert tag.device == pc, 'Tag has to be linked'
assert d.Desktop.query.one() == pc, 'd.Desktop had to be set to db'
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_no_hid_tag_not_linked(tag_id: str):
"""Validates registering a d.Desktop without HID and a non-linked tag.
In this case it is ok still, as the non-linked tag proves that
the d.Desktop was not existing before (otherwise the tag would
be linked), and thus it creates a new d.Desktop.
"""
tag = Tag(id=tag_id)
pc = d.Desktop(**yaml2json('pc-components.db')['device'], tags=OrderedSet([tag]))
db.session.add(g.user)
returned_pc = Sync().execute_register(pc)
db.session.commit()
assert returned_pc == pc
db_tag = next(iter(returned_pc.tags))
# they are not the same tags though
# tag is a transient obj and db_tag the one from the db
# they have the same pk though
assert d.Desktop.query.one() == pc, 'd.Desktop had to be set to db'
assert tag != db_tag, 'They are not the same tags though'
for tag in pc.tags:
assert tag.id in ['foo', pc.devicehub_id]
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_tag_does_not_exist():
"""Ensures not being able to register if the tag does not exist,
even if the device has HID or it existed before.
Tags have to be created before trying to link them through a Snapshot.
"""
user = User.query.filter().first()
pc = d.Desktop(
**yaml2json('pc-components.db')['device'], tags=OrderedSet([Tag('foo')])
)
pc.owner_id = user.id
with raises(ResourceNotFound):
Sync().execute_register(pc)
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__) @pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_tag_linked_same_device(): def test_sync_execute_register_tag_linked_same_device():
@ -387,53 +291,6 @@ def test_sync_execute_register_tag_linked_same_device():
assert tag.id in ['foo', db_pc.devicehub_id] assert tag.id in ['foo', db_pc.devicehub_id]
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_tag_linked_other_device_mismatch_between_tags():
"""Checks that sync raises an error if finds that at least two passed-in
tags are not linked to the same device.
"""
pc1 = d.Desktop(**yaml2json('pc-components.db')['device'])
db.session.add(Tag(id='foo-1', device=pc1))
pc2 = d.Desktop(**yaml2json('pc-components.db')['device'])
pc2.serial_number = 'pc2-serial'
pc2.hid = Naming.hid(pc2.type, pc2.manufacturer, pc2.model, pc2.serial_number)
db.session.add(Tag(id='foo-2', device=pc2))
db.session.commit()
pc1 = d.Desktop(
**yaml2json('pc-components.db')['device']
) # Create a new transient non-db object
pc1.tags.add(Tag(id='foo-1'))
pc1.tags.add(Tag(id='foo-2'))
with raises(MismatchBetweenTags):
Sync().execute_register(pc1)
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
def test_sync_execute_register_mismatch_between_tags_and_hid():
"""Checks that sync raises an error if it finds that the HID does
not point at the same device as the tag does.
In this case we set HID -> pc1 but tag -> pc2
"""
pc1 = d.Desktop(**yaml2json('pc-components.db')['device'])
db.session.add(Tag(id='foo-1', device=pc1))
pc2 = d.Desktop(**yaml2json('pc-components.db')['device'])
pc2.serial_number = 'pc2-serial'
pc2.hid = Naming.hid(pc2.type, pc2.manufacturer, pc2.model, pc2.serial_number)
db.session.add(Tag(id='foo-2', device=pc2))
db.session.commit()
pc1 = d.Desktop(
**yaml2json('pc-components.db')['device']
) # Create a new transient non-db object
pc1.tags.add(Tag(id='foo-2'))
with raises(MismatchBetweenTagsAndHid):
Sync().execute_register(pc1)
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_get_device(user: UserClient): def test_get_device(user: UserClient):
@ -753,138 +610,10 @@ def test_cooking_mixer_api(user: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_hid_with_mac(app: Devicehub, user: UserClient): def test_hid_with_placeholder(app: Devicehub, user: UserClient):
"""Checks hid with mac.""" """Checks hid with mac."""
snapshot = file('asus-eee-1000h.snapshot.11') snapshot = file('asus-eee-1000h.snapshot.11')
snap, _ = user.post(snapshot, res=m.Snapshot) snap, _ = user.post(snapshot, res=m.Snapshot)
pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID']) pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID'])
assert pc['hid'] == 'laptop-asustek_computer_inc-1000h-94oaaq021116'
pc = d.Device.query.filter_by(devicehub_id=snap['device']['devicehubID']).one() pc = d.Device.query.filter_by(devicehub_id=snap['device']['devicehubID']).one()
assert ( assert pc.placeholder.binding.hid == pc.hid
pc.placeholder.binding.hid
== 'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d'
)
@pytest.mark.mvp
def test_hid_without_mac(app: Devicehub, user: UserClient):
"""Checks hid without mac."""
snapshot = yaml2json('asus-eee-1000h.snapshot.11')
snapshot['components'] = [
c for c in snapshot['components'] if c['type'] != 'NetworkAdapter'
]
snap, _ = user.post(json_encode(snapshot), res=m.Snapshot)
pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID'])
assert pc['hid'] == 'laptop-asustek_computer_inc-1000h-94oaaq021116'
@pytest.mark.mvp
def test_hid_with_mac_none(app: Devicehub, user: UserClient):
"""Checks hid with mac = None."""
snapshot = yaml2json('asus-eee-1000h.snapshot.11')
network = [c for c in snapshot['components'] if c['type'] == 'NetworkAdapter'][0]
network['serialNumber'] = None
snap, _ = user.post(json_encode(snapshot), res=m.Snapshot)
pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID'])
assert pc['hid'] == 'laptop-asustek_computer_inc-1000h-94oaaq021116'
@pytest.mark.mvp
def test_hid_with_2networkadapters(app: Devicehub, user: UserClient):
"""Checks hid with 2 networks adapters"""
snapshot = yaml2json('asus-eee-1000h.snapshot.11')
network = [c for c in snapshot['components'] if c['type'] == 'NetworkAdapter'][0]
network2 = copy.copy(network)
snapshot['components'].append(network2)
network['serialNumber'] = 'a0:24:8c:7f:cf:2d'
user.post(json_encode(snapshot), res=m.Snapshot)
devices, _ = user.get(res=d.Device)
laptop = devices['items'][0]
assert (
laptop['hid']
== 'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d'
)
assert len([c for c in devices['items'] if c['type'] == 'Laptop']) == 2
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_hid_with_2network_and_drop_no_mac_in_hid(app: Devicehub, user: UserClient):
"""Checks hid with 2 networks adapters and next drop the network is not used in hid"""
snapshot = yaml2json('asus-eee-1000h.snapshot.11')
network = [c for c in snapshot['components'] if c['type'] == 'NetworkAdapter'][0]
network2 = copy.copy(network)
snapshot['components'].append(network2)
network['serialNumber'] = 'a0:24:8c:7f:cf:2d'
snap, _ = user.post(json_encode(snapshot), res=m.Snapshot)
pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID'])
assert pc['hid'] == 'laptop-asustek_computer_inc-1000h-94oaaq021116'
pc = d.Device.query.filter_by(devicehub_id=snap['device']['devicehubID']).one()
assert (
pc.placeholder.binding.hid
== 'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d'
)
snapshot['uuid'] = 'd1b70cb8-8929-4f36-99b7-fe052cec0abb'
snapshot['components'] = [c for c in snapshot['components'] if c != network]
user.post(json_encode(snapshot), res=m.Snapshot)
devices, _ = user.get(res=d.Device)
laptop = devices['items'][0]
assert (
pc.placeholder.binding.hid
== 'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d'
)
assert len([c for c in devices['items'] if c['type'] == 'Laptop']) == 2
assert len([c for c in laptop['components'] if c['type'] == 'NetworkAdapter']) == 1
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_hid_with_2network_and_drop_mac_in_hid(app: Devicehub, user: UserClient):
"""Checks hid with 2 networks adapters and next drop the network is used in hid"""
# One tipical snapshot with 2 network cards
snapshot = yaml2json('asus-eee-1000h.snapshot.11')
network = [c for c in snapshot['components'] if c['type'] == 'NetworkAdapter'][0]
network2 = copy.copy(network)
snapshot['components'].append(network2)
network['serialNumber'] = 'a0:24:8c:7f:cf:2d'
snap, _ = user.post(json_encode(snapshot), res=m.Snapshot)
pc, _ = user.get(res=d.Device, item=snap['device']['devicehubID'])
assert pc['hid'] == 'laptop-asustek_computer_inc-1000h-94oaaq021116'
pc = d.Device.query.filter_by(devicehub_id=snap['device']['devicehubID']).one()
assert (
pc.placeholder.binding.hid
== 'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d'
)
# we drop the network card then is used for to build the hid
snapshot['uuid'] = 'd1b70cb8-8929-4f36-99b7-fe052cec0abb'
snapshot['components'] = [c for c in snapshot['components'] if c != network2]
user.post(json_encode(snapshot), res=m.Snapshot)
devices, _ = user.get(res=d.Device)
laptops = [c for c in devices['items'] if c['type'] == 'Laptop']
assert len(laptops) == 4
hids = [laptops[0]['hid'], laptops[2]['hid']]
proof_hid = [
'laptop-asustek_computer_inc-1000h-94oaaq021116-a0:24:8c:7f:cf:2d',
'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d',
]
assert all([h in proof_hid for h in hids])
# we drop all network cards
snapshot['uuid'] = 'd1b70cb8-8929-4f36-99b7-fe052cec0abc'
snapshot['components'] = [
c for c in snapshot['components'] if c not in [network, network2]
]
user.post(json_encode(snapshot), res=m.Snapshot)
devices, _ = user.get(res=d.Device)
laptops = [c for c in devices['items'] if c['type'] == 'Laptop']
assert len(laptops) == 4
hids = [laptops[0]['hid'], laptops[2]['hid']]
proof_hid = [
'laptop-asustek_computer_inc-1000h-94oaaq021116-a0:24:8c:7f:cf:2d',
'laptop-asustek_computer_inc-1000h-94oaaq021116-00:24:8c:7f:cf:2d',
'laptop-asustek_computer_inc-1000h-94oaaq021116',
]
assert all([h in proof_hid for h in hids])

View File

@ -6,24 +6,29 @@ from ereuse_devicehub.resources.documents import documents
from ereuse_devicehub.resources.lot.models import Lot from ereuse_devicehub.resources.lot.models import Lot
from ereuse_devicehub.resources.tradedocument.models import TradeDocument from ereuse_devicehub.resources.tradedocument.models import TradeDocument
from tests import conftest from tests import conftest
from tests.conftest import file, yaml2json, json_encode from tests.conftest import file, json_encode, yaml2json
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_simple_metrics(user: UserClient): def test_simple_metrics(user: UserClient):
""" Checks one standard query of metrics """ """Checks one standard query of metrics"""
# Insert computer # Insert computer
lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot') lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot')
acer = yaml2json('acer.happy.battery.snapshot') acer = yaml2json('acer.happy.battery.snapshot')
user.post(json_encode(lenovo), res=ma.Snapshot) user.post(json_encode(lenovo), res=ma.Snapshot)
snapshot, _ = user.post(json_encode(acer), res=ma.Snapshot) snapshot, _ = user.post(json_encode(acer), res=ma.Snapshot)
device_id = snapshot['device']['id'] device_id = snapshot['device']['id']
post_request = {"transaction": "ccc", "name": "John", "endUsers": 1, post_request = {
"finalUserCode": "abcdefjhi", "transaction": "ccc",
"devices": [device_id], "description": "aaa", "name": "John",
"startTime": "2020-11-01T02:00:00+00:00", "endUsers": 1,
"endTime": "2020-12-01T02:00:00+00:00"} "finalUserCode": "abcdefjhi",
"devices": [device_id],
"description": "aaa",
"startTime": "2020-11-01T02:00:00+00:00",
"endTime": "2020-12-01T02:00:00+00:00",
}
# Create Allocate # Create Allocate
user.post(res=ma.Allocate, data=post_request) user.post(res=ma.Allocate, data=post_request)
@ -58,16 +63,21 @@ def test_simple_metrics(user: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_second_hdd_metrics(user: UserClient): def test_second_hdd_metrics(user: UserClient):
""" Checks one standard query of metrics """ """Checks one standard query of metrics"""
# Insert computer # Insert computer
acer = yaml2json('acer.happy.battery.snapshot') acer = yaml2json('acer.happy.battery.snapshot')
snapshot, _ = user.post(json_encode(acer), res=ma.Snapshot) snapshot, _ = user.post(json_encode(acer), res=ma.Snapshot)
device_id = snapshot['device']['id'] device_id = snapshot['device']['id']
post_request = {"transaction": "ccc", "name": "John", "endUsers": 1, post_request = {
"finalUserCode": "abcdefjhi", "transaction": "ccc",
"devices": [device_id], "description": "aaa", "name": "John",
"startTime": "2020-11-01T02:00:00+00:00", "endUsers": 1,
"endTime": "2020-12-01T02:00:00+00:00"} "finalUserCode": "abcdefjhi",
"devices": [device_id],
"description": "aaa",
"startTime": "2020-11-01T02:00:00+00:00",
"endTime": "2020-12-01T02:00:00+00:00",
}
# Create Allocate # Create Allocate
user.post(res=ma.Allocate, data=post_request) user.post(res=ma.Allocate, data=post_request)
@ -101,16 +111,21 @@ def test_second_hdd_metrics(user: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_metrics_with_live_null(user: UserClient): def test_metrics_with_live_null(user: UserClient):
""" Checks one standard query of metrics """ """Checks one standard query of metrics"""
# Insert computer # Insert computer
acer = file('acer.happy.battery.snapshot') acer = file('acer.happy.battery.snapshot')
snapshot, _ = user.post(acer, res=ma.Snapshot) snapshot, _ = user.post(acer, res=ma.Snapshot)
device_id = snapshot['device']['id'] device_id = snapshot['device']['id']
post_request = {"transaction": "ccc", "name": "John", "endUsers": 1, post_request = {
"finalUserCode": "abcdefjhi", "transaction": "ccc",
"devices": [device_id], "description": "aaa", "name": "John",
"startTime": "2020-11-01T02:00:00+00:00", "endUsers": 1,
"endTime": "2020-12-01T02:00:00+00:00"} "finalUserCode": "abcdefjhi",
"devices": [device_id],
"description": "aaa",
"startTime": "2020-11-01T02:00:00+00:00",
"endTime": "2020-12-01T02:00:00+00:00",
}
# Create Allocate # Create Allocate
user.post(res=ma.Allocate, data=post_request) user.post(res=ma.Allocate, data=post_request)
@ -124,19 +139,29 @@ def test_metrics_with_live_null(user: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_metrics_action_status(user: UserClient, user2: UserClient): def test_metrics_action_status(user: UserClient, user2: UserClient):
""" Checks one standard query of metrics.""" """Checks one standard query of metrics."""
# Insert computer # Insert computer
lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot') lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot')
snap, _ = user.post(json_encode(lenovo), res=ma.Snapshot) snap, _ = user.post(json_encode(lenovo), res=ma.Snapshot)
device_id = snap['device']['id'] device_id = snap['device']['id']
action = {'type': ma.Use.t, 'devices': [device_id]} action = {'type': ma.Use.t, 'devices': [device_id]}
action_use, _ = user.post(action, res=ma.Action) action_use, _ = user.post(action, res=ma.Action)
csv_str, _ = user.get(res=documents.DocumentDef.t, csv_str, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})]) accept='text/csv',
head = '"DHID";"Hid";"Document-Name";"Action-Type";"Action-User-LastOwner-Supplier";"Action-User-LastOwner-Receiver";"Action-Create-By";"Trade-Confirmed";"Status-Created-By-Supplier-About-Reciber";"Status-Receiver";"Status Supplier Created Date";"Status Receiver Created Date";"Trade-Weight";"Action-Create";"Allocate-Start";"Allocate-User-Code";"Allocate-NumUsers";"UsageTimeAllocate";"Type";"LiveCreate";"UsageTimeHdd"\n' query=[('filter', {'type': ['Computer'], 'ids': [device_id]})],
body = '"O48N2";"desktop-lenovo-9644w8n-0169622-00:1a:6b:5e:7f:10";"";"Status";"";"foo@foo.com";"Receiver";"";"";"Use";"";"' )
head = (
'"DHID";"Hid";"Document-Name";"Action-Type";"Action-User-LastOwner-Supplier";'
)
head += '"Action-User-LastOwner-Receiver";"Action-Create-By";"Trade-Confirmed";'
head += '"Status-Created-By-Supplier-About-Reciber";"Status-Receiver";'
head += '"Status Supplier Created Date";"Status Receiver Created Date";"Trade-Weight";'
head += '"Action-Create";"Allocate-Start";"Allocate-User-Code";"Allocate-NumUsers";'
head += '"UsageTimeAllocate";"Type";"LiveCreate";"UsageTimeHdd"\n'
body = '"O48N2";"adebcc5506213fac43cd8473a9c81bcf0cadaed9cb98b2eae651e377a3533c5a";'
body += '"";"Status";"";"foo@foo.com";"Receiver";"";"";"Use";"";"'
assert head in csv_str assert head in csv_str
assert body in csv_str assert body in csv_str
@ -144,7 +169,7 @@ def test_metrics_action_status(user: UserClient, user2: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_complet_metrics_with_trade(user: UserClient, user2: UserClient): def test_complet_metrics_with_trade(user: UserClient, user2: UserClient):
""" Checks one standard query of metrics in a trade enviroment.""" """Checks one standard query of metrics in a trade enviroment."""
# Insert computer # Insert computer
lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot') lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot')
acer = yaml2json('acer.happy.battery.snapshot') acer = yaml2json('acer.happy.battery.snapshot')
@ -154,12 +179,8 @@ def test_complet_metrics_with_trade(user: UserClient, user2: UserClient):
device1_id = snap1['device']['id'] device1_id = snap1['device']['id']
device2_id = snap2['device']['id'] device2_id = snap2['device']['id']
devices_id = [device1_id, device2_id] devices_id = [device1_id, device2_id]
devices = [('id', device1_id), devices = [('id', device1_id), ('id', snap2['device']['id'])]
('id', snap2['device']['id'])] lot, _ = user.post({}, res=Lot, item='{}/devices'.format(lot['id']), query=devices)
lot, _ = user.post({},
res=Lot,
item='{}/devices'.format(lot['id']),
query=devices)
action = {'type': ma.Refurbish.t, 'devices': [device1_id]} action = {'type': ma.Refurbish.t, 'devices': [device1_id]}
user.post(action, res=ma.Action) user.post(action, res=ma.Action)
@ -179,17 +200,21 @@ def test_complet_metrics_with_trade(user: UserClient, user2: UserClient):
action = {'type': ma.Use.t, 'devices': [device1_id]} action = {'type': ma.Use.t, 'devices': [device1_id]}
action_use, _ = user.post(action, res=ma.Action) action_use, _ = user.post(action, res=ma.Action)
csv_str, _ = user.get(res=documents.DocumentDef.t, csv_str, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': devices_id})]) accept='text/csv',
query=[('filter', {'type': ['Computer'], 'ids': devices_id})],
)
body1_lenovo = '"O48N2";"desktop-lenovo-9644w8n-0169622-00:1a:6b:5e:7f:10";"";"Trade";"foo@foo.com";' body1_lenovo = '"O48N2";"adebcc5506213fac43cd8473a9c81bcf0cadaed9cb98b2eae651e377a3533c5a";"";"Trade";"foo@foo.com";'
body1_lenovo += '"foo2@foo.com";"Supplier";"NeedConfirmation";"Use";"";' body1_lenovo += '"foo2@foo.com";"Supplier";"NeedConfirmation";"Use";"";'
body2_lenovo = ';"";"0";"0";"Trade";"0";"0"\n' body2_lenovo = ';"";"0";"0";"Trade";"0";"0"\n'
body1_acer = '"K3XW2";"laptop-acer-aohappy-lusea0d010038879a01601-00:26:c7:8e:cb:8c";"";"Trade";' body1_acer = '"K3XW2";"55b1f6d0692d1569c7590f0aeabd1c9874a1c78b8dd3a7d481df95923a629748";"";"Trade";'
body1_acer += '"foo@foo.com";"foo2@foo.com";"Supplier";"NeedConfirmation";"";"";"";"";"0";' body1_acer += (
'"foo@foo.com";"foo2@foo.com";"Supplier";"NeedConfirmation";"";"";"";"";"0";'
)
body2_acer = ';"";"0";"0";"Trade";"0";"4692.0"\n' body2_acer = ';"";"0";"0";"Trade";"0";"4692.0"\n'
assert body1_lenovo in csv_str assert body1_lenovo in csv_str
@ -200,12 +225,14 @@ def test_complet_metrics_with_trade(user: UserClient, user2: UserClient):
# User2 mark this device as Refurbish # User2 mark this device as Refurbish
action = {'type': ma.Use.t, 'devices': [device1_id]} action = {'type': ma.Use.t, 'devices': [device1_id]}
action_use2, _ = user2.post(action, res=ma.Action) action_use2, _ = user2.post(action, res=ma.Action)
csv_str, _ = user.get(res=documents.DocumentDef.t, csv_str, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': devices_id})]) accept='text/csv',
query=[('filter', {'type': ['Computer'], 'ids': devices_id})],
)
body1_lenovo = '"O48N2";"desktop-lenovo-9644w8n-0169622-00:1a:6b:5e:7f:10";"";"Trade";"foo@foo.com";' body1_lenovo = '"O48N2";"adebcc5506213fac43cd8473a9c81bcf0cadaed9cb98b2eae651e377a3533c5a";"";"Trade";"foo@foo.com";'
body1_lenovo += '"foo2@foo.com";"Supplier";"NeedConfirmation";"Use";"Use";' body1_lenovo += '"foo2@foo.com";"Supplier";"NeedConfirmation";"Use";"Use";'
body2_lenovo = ';"";"0";"0";"Trade";"0";"0"\n' body2_lenovo = ';"";"0";"0";"Trade";"0";"0"\n'
body2_acer = ';"";"0";"0";"Trade";"0";"4692.0"\n' body2_acer = ';"";"0";"0";"Trade";"0";"4692.0"\n'
@ -215,20 +242,16 @@ def test_complet_metrics_with_trade(user: UserClient, user2: UserClient):
assert body2_acer in csv_str assert body2_acer in csv_str
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_metrics_action_status_for_containers(user: UserClient, user2: UserClient): def test_metrics_action_status_for_containers(user: UserClient, user2: UserClient):
""" Checks one standard query of metrics for a container.""" """Checks one standard query of metrics for a container."""
# Insert computer # Insert computer
lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot') lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot')
snap, _ = user.post(json_encode(lenovo), res=ma.Snapshot) snap, _ = user.post(json_encode(lenovo), res=ma.Snapshot)
lot, _ = user.post({'name': 'MyLot'}, res=Lot) lot, _ = user.post({'name': 'MyLot'}, res=Lot)
devices = [('id', snap['device']['id'])] devices = [('id', snap['device']['id'])]
lot, _ = user.post({}, lot, _ = user.post({}, res=Lot, item='{}/devices'.format(lot['id']), query=devices)
res=Lot,
item='{}/devices'.format(lot['id']),
query=devices)
request_post = { request_post = {
'type': 'Trade', 'type': 'Trade',
'devices': [snap['device']['id']], 'devices': [snap['device']['id']],
@ -247,7 +270,7 @@ def test_metrics_action_status_for_containers(user: UserClient, user2: UserClien
'hash': 'bbbbbbbb', 'hash': 'bbbbbbbb',
'url': 'http://www.ereuse.org/', 'url': 'http://www.ereuse.org/',
'weight': 150, 'weight': 150,
'lot': lot['id'] 'lot': lot['id'],
} }
tradedocument, _ = user.post(res=TradeDocument, data=request_post) tradedocument, _ = user.post(res=TradeDocument, data=request_post)
action = {'type': ma.Recycling.t, 'devices': [], 'documents': [tradedocument['id']]} action = {'type': ma.Recycling.t, 'devices': [], 'documents': [tradedocument['id']]}
@ -257,10 +280,12 @@ def test_metrics_action_status_for_containers(user: UserClient, user2: UserClien
assert str(trade.actions[-1].id) == action['id'] assert str(trade.actions[-1].id) == action['id']
# get metrics from botom in lot menu # get metrics from botom in lot menu
csv_str, _ = user.get(res=documents.DocumentDef.t, csv_str, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer']}), ('lot', lot['id'])]) accept='text/csv',
query=[('filter', {'type': ['Computer']}), ('lot', lot['id'])],
)
body1 = ';"bbbbbbbb";"test.pdf";"Trade-Container";"foo@foo.com";"foo2@foo.com";"Supplier";"False";"Recycling";"";' body1 = ';"bbbbbbbb";"test.pdf";"Trade-Container";"foo@foo.com";"foo2@foo.com";"Supplier";"False";"Recycling";"";'
body2 = ';"";"150.0";' body2 = ';"";"150.0";'
@ -272,10 +297,12 @@ def test_metrics_action_status_for_containers(user: UserClient, user2: UserClien
assert body3 in csv_str.split('\n')[-2] assert body3 in csv_str.split('\n')[-2]
# get metrics from botom in devices menu # get metrics from botom in devices menu
csv_str2, _ = user.get(res=documents.DocumentDef.t, csv_str2, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': [snap['device']['id']]})]) accept='text/csv',
query=[('filter', {'type': ['Computer'], 'ids': [snap['device']['id']]})],
)
assert len(csv_str2.split('\n')) == 4 assert len(csv_str2.split('\n')) == 4
assert body1 in csv_str2.split('\n')[-2] assert body1 in csv_str2.split('\n')[-2]
@ -286,17 +313,14 @@ def test_metrics_action_status_for_containers(user: UserClient, user2: UserClien
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_visual_metrics_for_old_owners(user: UserClient, user2: UserClient): def test_visual_metrics_for_old_owners(user: UserClient, user2: UserClient):
""" Checks if one old owner can see the metrics in a trade enviroment.""" """Checks if one old owner can see the metrics in a trade enviroment."""
# Insert computer # Insert computer
lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot') lenovo = yaml2json('desktop-9644w8n-lenovo-0169622.snapshot')
snap1, _ = user.post(json_encode(lenovo), res=ma.Snapshot) snap1, _ = user.post(json_encode(lenovo), res=ma.Snapshot)
lot, _ = user.post({'name': 'MyLot'}, res=Lot) lot, _ = user.post({'name': 'MyLot'}, res=Lot)
device_id = snap1['device']['id'] device_id = snap1['device']['id']
devices = [('id', device_id)] devices = [('id', device_id)]
lot, _ = user.post({}, lot, _ = user.post({}, res=Lot, item='{}/devices'.format(lot['id']), query=devices)
res=Lot,
item='{}/devices'.format(lot['id']),
query=devices)
request_post = { request_post = {
'type': 'Trade', 'type': 'Trade',
'devices': [device_id], 'devices': [device_id],
@ -309,24 +333,23 @@ def test_visual_metrics_for_old_owners(user: UserClient, user2: UserClient):
} }
trade, _ = user.post(res=ma.Action, data=request_post) trade, _ = user.post(res=ma.Action, data=request_post)
request_confirm = { request_confirm = {'type': 'Confirm', 'action': trade['id'], 'devices': [device_id]}
'type': 'Confirm',
'action': trade['id'],
'devices': [device_id]
}
user2.post(res=ma.Action, data=request_confirm) user2.post(res=ma.Action, data=request_confirm)
action = {'type': ma.Refurbish.t, 'devices': [device_id]} action = {'type': ma.Refurbish.t, 'devices': [device_id]}
action_use, _ = user.post(action, res=ma.Action) action_use, _ = user.post(action, res=ma.Action)
csv_supplier, _ = user.get(res=documents.DocumentDef.t, csv_supplier, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})]) accept='text/csv',
csv_receiver, _ = user2.get(res=documents.DocumentDef.t, query=[('filter', {'type': ['Computer'], 'ids': [device_id]})],
item='actions/', )
accept='text/csv', csv_receiver, _ = user2.get(
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})]) res=documents.DocumentDef.t,
item='actions/',
accept='text/csv',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})],
)
body = ';"";"0";"0";"Trade";"0";"0"\n' body = ';"";"0";"0";"Trade";"0";"0"\n'
assert body in csv_receiver assert body in csv_receiver
@ -343,10 +366,7 @@ def test_bug_trade_confirmed(user: UserClient, user2: UserClient):
lot, _ = user.post({'name': 'MyLot'}, res=Lot) lot, _ = user.post({'name': 'MyLot'}, res=Lot)
device_id = snap1['device']['id'] device_id = snap1['device']['id']
devices = [('id', device_id)] devices = [('id', device_id)]
lot, _ = user.post({}, lot, _ = user.post({}, res=Lot, item='{}/devices'.format(lot['id']), query=devices)
res=Lot,
item='{}/devices'.format(lot['id']),
query=devices)
request_post = { request_post = {
'type': 'Trade', 'type': 'Trade',
'devices': [device_id], 'devices': [device_id],
@ -359,22 +379,24 @@ def test_bug_trade_confirmed(user: UserClient, user2: UserClient):
} }
trade, _ = user.post(res=ma.Action, data=request_post) trade, _ = user.post(res=ma.Action, data=request_post)
csv_not_confirmed, _ = user.get(res=documents.DocumentDef.t, csv_not_confirmed, _ = user.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})]) accept='text/csv',
request_confirm = { query=[('filter', {'type': ['Computer'], 'ids': [device_id]})],
'type': 'Confirm', )
'action': trade['id'], request_confirm = {'type': 'Confirm', 'action': trade['id'], 'devices': [device_id]}
'devices': [device_id]
}
user2.post(res=ma.Action, data=request_confirm) user2.post(res=ma.Action, data=request_confirm)
csv_confirmed, _ = user2.get(res=documents.DocumentDef.t, csv_confirmed, _ = user2.get(
item='actions/', res=documents.DocumentDef.t,
accept='text/csv', item='actions/',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})]) accept='text/csv',
query=[('filter', {'type': ['Computer'], 'ids': [device_id]})],
)
body_not_confirmed = '"Trade";"foo2@foo.com";"foo@foo.com";"Receiver";"NeedConfirmation";' body_not_confirmed = (
'"Trade";"foo2@foo.com";"foo@foo.com";"Receiver";"NeedConfirmation";'
)
body_confirmed = '"Trade";"foo2@foo.com";"foo@foo.com";"Receiver";"TradeConfirmed";' body_confirmed = '"Trade";"foo2@foo.com";"foo@foo.com";"Receiver";"TradeConfirmed";'
assert body_not_confirmed in csv_not_confirmed assert body_not_confirmed in csv_not_confirmed

View File

@ -17,18 +17,36 @@ Excluded cases in tests
""" """
import math import math
import pytest import pytest
from ereuse_devicehub.resources.action.models import BenchmarkDataStorage, BenchmarkProcessor, \ from ereuse_devicehub.resources.action.models import (
VisualTest BenchmarkDataStorage,
from ereuse_devicehub.resources.action.rate.v1_0 import DataStorageRate, ProcessorRate, \ BenchmarkProcessor,
RamRate, RateAlgorithm VisualTest,
from ereuse_devicehub.resources.device.models import Desktop, HardDrive, Processor, RamModule )
from ereuse_devicehub.resources.enums import AppearanceRange, ComputerChassis, FunctionalityRange from ereuse_devicehub.resources.action.rate.v1_0 import (
DataStorageRate,
ProcessorRate,
RamRate,
RateAlgorithm,
)
from ereuse_devicehub.resources.device.models import (
Desktop,
HardDrive,
Processor,
RamModule,
)
from ereuse_devicehub.resources.enums import (
AppearanceRange,
ComputerChassis,
FunctionalityRange,
)
from tests import conftest from tests import conftest
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_data_storage_rate(): def test_rate_data_storage_rate():
"""Test to check if compute data storage rate have same value than """Test to check if compute data storage rate have same value than
previous score version. previous score version.
@ -65,6 +83,7 @@ def test_rate_data_storage_rate():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_data_storage_size_is_null(): def test_rate_data_storage_size_is_null():
"""Test where input DataStorage.size = NULL, BenchmarkDataStorage.read_speed = 0, """Test where input DataStorage.size = NULL, BenchmarkDataStorage.read_speed = 0,
BenchmarkDataStorage.write_speed = 0 is like no DataStorage has been detected; BenchmarkDataStorage.write_speed = 0 is like no DataStorage has been detected;
@ -78,6 +97,7 @@ def test_rate_data_storage_size_is_null():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_no_data_storage(): def test_rate_no_data_storage():
"""Test without data storage devices.""" """Test without data storage devices."""
@ -88,6 +108,7 @@ def test_rate_no_data_storage():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_ram_rate(): def test_rate_ram_rate():
"""Test to check if compute ram rate have same value than previous """Test to check if compute ram rate have same value than previous
score version only with 1 RamModule. score version only with 1 RamModule.
@ -97,10 +118,13 @@ def test_rate_ram_rate():
ram_rate = RamRate().compute([ram1]) ram_rate = RamRate().compute([ram1])
assert math.isclose(ram_rate, 2.02, rel_tol=0.002), 'RamRate returns incorrect value(rate)' assert math.isclose(
ram_rate, 2.02, rel_tol=0.002
), 'RamRate returns incorrect value(rate)'
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_ram_rate_2modules(): def test_rate_ram_rate_2modules():
"""Test to check if compute ram rate have same value than previous """Test to check if compute ram rate have same value than previous
score version with 2 RamModule. score version with 2 RamModule.
@ -111,10 +135,13 @@ def test_rate_ram_rate_2modules():
ram_rate = RamRate().compute([ram1, ram2]) ram_rate = RamRate().compute([ram1, ram2])
assert math.isclose(ram_rate, 3.79, rel_tol=0.001), 'RamRate returns incorrect value(rate)' assert math.isclose(
ram_rate, 3.79, rel_tol=0.001
), 'RamRate returns incorrect value(rate)'
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_ram_rate_4modules(): def test_rate_ram_rate_4modules():
"""Test to check if compute ram rate have same value than previous """Test to check if compute ram rate have same value than previous
score version with 2 RamModule. score version with 2 RamModule.
@ -127,10 +154,13 @@ def test_rate_ram_rate_4modules():
ram_rate = RamRate().compute([ram1, ram2, ram3, ram4]) ram_rate = RamRate().compute([ram1, ram2, ram3, ram4])
assert math.isclose(ram_rate, 1.993, rel_tol=0.001), 'RamRate returns incorrect value(rate)' assert math.isclose(
ram_rate, 1.993, rel_tol=0.001
), 'RamRate returns incorrect value(rate)'
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_ram_module_size_is_0(): def test_rate_ram_module_size_is_0():
"""Test where input data RamModule.size = 0; is like no RamModule """Test where input data RamModule.size = 0; is like no RamModule
has been detected. has been detected.
@ -143,6 +173,7 @@ def test_rate_ram_module_size_is_0():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_ram_speed_is_null(): def test_rate_ram_speed_is_null():
"""Test where RamModule.speed is NULL (not detected) but has size.""" """Test where RamModule.speed is NULL (not detected) but has size."""
@ -150,16 +181,21 @@ def test_rate_ram_speed_is_null():
ram_rate = RamRate().compute([ram0]) ram_rate = RamRate().compute([ram0])
assert math.isclose(ram_rate, 1.85, rel_tol=0.002), 'RamRate returns incorrect value(rate)' assert math.isclose(
ram_rate, 1.85, rel_tol=0.002
), 'RamRate returns incorrect value(rate)'
ram0 = RamModule(size=1024, speed=None) ram0 = RamModule(size=1024, speed=None)
ram_rate = RamRate().compute([ram0]) ram_rate = RamRate().compute([ram0])
assert math.isclose(ram_rate, 1.25, rel_tol=0.004), 'RamRate returns incorrect value(rate)' assert math.isclose(
ram_rate, 1.25, rel_tol=0.004
), 'RamRate returns incorrect value(rate)'
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_no_ram_module(): def test_rate_no_ram_module():
"""Test without RamModule.""" """Test without RamModule."""
ram0 = RamModule() ram0 = RamModule()
@ -169,6 +205,7 @@ def test_rate_no_ram_module():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_processor_rate(): def test_rate_processor_rate():
"""Test to check if compute processor rate have same value than previous """Test to check if compute processor rate have same value than previous
score version only with 1 core. score version only with 1 core.
@ -184,6 +221,7 @@ def test_rate_processor_rate():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_processor_rate_2cores(): def test_rate_processor_rate_2cores():
"""Test to check if compute processor rate have same value than previous """Test to check if compute processor rate have same value than previous
score version with 2 cores. score version with 2 cores.
@ -206,6 +244,7 @@ def test_rate_processor_rate_2cores():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_processor_with_null_cores(): def test_rate_processor_with_null_cores():
"""Test with processor device have null number of cores.""" """Test with processor device have null number of cores."""
cpu = Processor(cores=None, speed=3.3) cpu = Processor(cores=None, speed=3.3)
@ -217,6 +256,7 @@ def test_rate_processor_with_null_cores():
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_rate_processor_with_null_speed(): def test_rate_processor_with_null_speed():
"""Test with processor device have null speed value.""" """Test with processor device have null speed value."""
cpu = Processor(cores=1, speed=None) cpu = Processor(cores=1, speed=None)
@ -262,12 +302,14 @@ def test_rate_computer_1193():
data_storage, data_storage,
RamModule(size=4096, speed=1600), RamModule(size=4096, speed=1600),
RamModule(size=2048, speed=1067), RamModule(size=2048, speed=1067),
cpu cpu,
} }
# Add test visual with functionality and appearance range # Add test visual with functionality and appearance range
VisualTest(appearance_range=AppearanceRange.A, VisualTest(
functionality_range=FunctionalityRange.A, appearance_range=AppearanceRange.A,
device=pc_test) functionality_range=FunctionalityRange.A,
device=pc_test,
)
# Compute all components rates and general rating # Compute all components rates and general rating
rate_pc = RateAlgorithm().compute(pc_test) rate_pc = RateAlgorithm().compute(pc_test)
@ -311,15 +353,13 @@ def test_rate_computer_1201():
data_storage.actions_one.add(BenchmarkDataStorage(read_speed=158, write_speed=34.7)) data_storage.actions_one.add(BenchmarkDataStorage(read_speed=158, write_speed=34.7))
cpu = Processor(cores=2, speed=3.3) cpu = Processor(cores=2, speed=3.3)
cpu.actions_one.add(BenchmarkProcessor(rate=26339.48)) cpu.actions_one.add(BenchmarkProcessor(rate=26339.48))
pc_test.components |= { pc_test.components |= {data_storage, RamModule(size=2048, speed=1333), cpu}
data_storage,
RamModule(size=2048, speed=1333),
cpu
}
# Add test visual with functionality and appearance range # Add test visual with functionality and appearance range
VisualTest(appearance_range=AppearanceRange.B, VisualTest(
functionality_range=FunctionalityRange.A, appearance_range=AppearanceRange.B,
device=pc_test) functionality_range=FunctionalityRange.A,
device=pc_test,
)
# Compute all components rates and general rating # Compute all components rates and general rating
rate_pc = RateAlgorithm().compute(pc_test) rate_pc = RateAlgorithm().compute(pc_test)
@ -365,7 +405,9 @@ def test_rate_computer_multiple_ram_module():
pc_test = Desktop(chassis=ComputerChassis.Tower) pc_test = Desktop(chassis=ComputerChassis.Tower)
data_storage = HardDrive(size=76319) data_storage = HardDrive(size=76319)
data_storage.actions_one.add(BenchmarkDataStorage(read_speed=72.2, write_speed=24.3)) data_storage.actions_one.add(
BenchmarkDataStorage(read_speed=72.2, write_speed=24.3)
)
cpu = Processor(cores=1, speed=1.6) cpu = Processor(cores=1, speed=1.6)
cpu.actions_one.add(BenchmarkProcessor(rate=3192.34)) cpu.actions_one.add(BenchmarkProcessor(rate=3192.34))
pc_test.components |= { pc_test.components |= {
@ -374,12 +416,14 @@ def test_rate_computer_multiple_ram_module():
RamModule(size=512, speed=800), RamModule(size=512, speed=800),
RamModule(size=512, speed=667), RamModule(size=512, speed=667),
RamModule(size=512, speed=533), RamModule(size=512, speed=533),
cpu cpu,
} }
# Add test visual with functionality and appearance range # Add test visual with functionality and appearance range
VisualTest(appearance_range=AppearanceRange.C, VisualTest(
functionality_range=FunctionalityRange.A, appearance_range=AppearanceRange.C,
device=pc_test) functionality_range=FunctionalityRange.A,
device=pc_test,
)
# Compute all components rates and general rating # Compute all components rates and general rating
rate_pc = RateAlgorithm().compute(pc_test) rate_pc = RateAlgorithm().compute(pc_test)
@ -421,18 +465,18 @@ def test_rate_computer_one_ram_module():
pc_test = Desktop(chassis=ComputerChassis.Tower) pc_test = Desktop(chassis=ComputerChassis.Tower)
data_storage = HardDrive(size=152587) data_storage = HardDrive(size=152587)
data_storage.actions_one.add(BenchmarkDataStorage(read_speed=78.1, write_speed=24.4)) data_storage.actions_one.add(
BenchmarkDataStorage(read_speed=78.1, write_speed=24.4)
)
cpu = Processor(cores=2, speed=2.5) cpu = Processor(cores=2, speed=2.5)
cpu.actions_one.add(BenchmarkProcessor(rate=9974.3)) cpu.actions_one.add(BenchmarkProcessor(rate=9974.3))
pc_test.components |= { pc_test.components |= {data_storage, RamModule(size=0, speed=None), cpu}
data_storage,
RamModule(size=0, speed=None),
cpu
}
# Add test visual with functionality and appearance range # Add test visual with functionality and appearance range
VisualTest(appearance_range=AppearanceRange.B, VisualTest(
functionality_range=FunctionalityRange.A, appearance_range=AppearanceRange.B,
device=pc_test) functionality_range=FunctionalityRange.A,
device=pc_test,
)
# Compute all components rates and general rating # Compute all components rates and general rating
rate_pc = RateAlgorithm().compute(pc_test) rate_pc = RateAlgorithm().compute(pc_test)

View File

@ -12,7 +12,6 @@ from flask_wtf.csrf import generate_csrf
from ereuse_devicehub.client import UserClient, UserClientFlask from ereuse_devicehub.client import UserClient, UserClientFlask
from ereuse_devicehub.db import db from ereuse_devicehub.db import db
from ereuse_devicehub.devicehub import Devicehub from ereuse_devicehub.devicehub import Devicehub
from ereuse_devicehub.parser.models import SnapshotsLog
from ereuse_devicehub.resources.action.models import Snapshot from ereuse_devicehub.resources.action.models import Snapshot
from ereuse_devicehub.resources.device.models import Device, Placeholder from ereuse_devicehub.resources.device.models import Device, Placeholder
from ereuse_devicehub.resources.lot.models import Lot from ereuse_devicehub.resources.lot.models import Lot
@ -714,7 +713,9 @@ def test_add_laptop(user3: UserClientFlask):
assert typ == 'Laptop' assert typ == 'Laptop'
assert dev.placeholder.id_device_supplier == "b2" assert dev.placeholder.id_device_supplier == "b2"
assert dev.hid == 'laptop-samsung-lc27t55-aaaab' assert (
dev.chid == '274f05421e4d394c5b3cd10266fed6f0500029b104b5db3521689bda589e3150'
)
assert phid == '1' assert phid == '1'
assert dhid == 'O48N2' assert dhid == 'O48N2'
@ -753,7 +754,11 @@ def test_add_with_ammount_laptops(user3: UserClientFlask):
for dev in Device.query.all(): for dev in Device.query.all():
assert dev.type == 'Laptop' assert dev.type == 'Laptop'
assert dev.placeholder.id_device_supplier is None assert dev.placeholder.id_device_supplier is None
assert dev.hid is None assert dev.hid == 'laptop-samsung-lc27t55-'
assert (
dev.chid
== 'ff8e7794d33ed22046b8d94b8bba4d8d1507f0fee535150835cac28faabbcda1'
)
assert dev.placeholder.phid in [str(x) for x in range(1, num + 1)] assert dev.placeholder.phid in [str(x) for x in range(1, num + 1)]
assert Device.query.count() == num assert Device.query.count() == num
@ -1698,7 +1703,6 @@ def test_export_lots(user3: UserClientFlask):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_export_snapshot_json(user3: UserClientFlask): def test_export_snapshot_json(user3: UserClientFlask):
# ??
file_name = 'real-eee-1001pxd.snapshot.13.json' file_name = 'real-eee-1001pxd.snapshot.13.json'
snap = create_device(user3, file_name) snap = create_device(user3, file_name)
@ -1708,7 +1712,10 @@ def test_export_snapshot_json(user3: UserClientFlask):
uri = "/inventory/export/snapshot/?id={}".format(snap.uuid) uri = "/inventory/export/snapshot/?id={}".format(snap.uuid)
body, status = user3.get(uri) body, status = user3.get(uri)
assert status == '200 OK' assert status == '200 OK'
assert body == snapshot body = json.loads(body)
snapshot = json.loads(snapshot)
assert body['device'] == snapshot['device']
assert body['components'] == snapshot['components']
@pytest.mark.mvp @pytest.mark.mvp
@ -1729,7 +1736,8 @@ def test_add_placeholder_excel(user3: UserClientFlask):
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Device.query.count() == 3 assert Device.query.count() == 3
dev = Device.query.first() dev = Device.query.first()
assert dev.hid == 'laptop-sony-vaio-12345678' chid = 'f28ae12ffd513f5ed8fb6714a344a2326c48a7196fb140435065ab96ffda1a71'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.info == 'Good conditions' assert dev.placeholder.info == 'Good conditions'
assert dev.placeholder.pallet == '24A' assert dev.placeholder.pallet == '24A'
@ -1755,7 +1763,8 @@ def test_add_placeholder_csv(user3: UserClientFlask):
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Device.query.count() == 3 assert Device.query.count() == 3
dev = Device.query.first() dev = Device.query.first()
assert dev.hid == 'laptop-sony-vaio-12345678' chid = 'f28ae12ffd513f5ed8fb6714a344a2326c48a7196fb140435065ab96ffda1a71'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.info == 'Good conditions' assert dev.placeholder.info == 'Good conditions'
assert dev.placeholder.pallet == '24A' assert dev.placeholder.pallet == '24A'
@ -1781,7 +1790,8 @@ def test_add_placeholder_ods(user3: UserClientFlask):
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Device.query.count() == 3 assert Device.query.count() == 3
dev = Device.query.first() dev = Device.query.first()
assert dev.hid == 'laptop-sony-vaio-12345678' chid = 'f28ae12ffd513f5ed8fb6714a344a2326c48a7196fb140435065ab96ffda1a71'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.info == 'Good conditions' assert dev.placeholder.info == 'Good conditions'
assert dev.placeholder.pallet == '24A' assert dev.placeholder.pallet == '24A'
@ -1809,7 +1819,8 @@ def test_add_placeholder_office_open_xml(user3: UserClientFlask):
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Device.query.count() == 3 assert Device.query.count() == 3
dev = Device.query.first() dev = Device.query.first()
assert dev.hid == 'laptop-sony-vaio-12345678' chid = 'f28ae12ffd513f5ed8fb6714a344a2326c48a7196fb140435065ab96ffda1a71'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.info == 'Good conditions' assert dev.placeholder.info == 'Good conditions'
assert dev.placeholder.pallet == '24A' assert dev.placeholder.pallet == '24A'
@ -1847,7 +1858,8 @@ def test_edit_laptop(user3: UserClientFlask):
assert typ == 'Laptop' assert typ == 'Laptop'
assert dev.placeholder.id_device_supplier == "b2" assert dev.placeholder.id_device_supplier == "b2"
assert dev.hid == 'laptop-samsung-lc27t55-aaaab' chid = '274f05421e4d394c5b3cd10266fed6f0500029b104b5db3521689bda589e3150'
assert dev.chid == chid
assert dev.serial_number == 'aaaab' assert dev.serial_number == 'aaaab'
assert dev.model == 'lc27t55' assert dev.model == 'lc27t55'
assert phid == '1' assert phid == '1'
@ -1879,7 +1891,7 @@ def test_edit_laptop(user3: UserClientFlask):
assert 'Device &#34;Laptop&#34; edited successfully!' in body assert 'Device &#34;Laptop&#34; edited successfully!' in body
dev = Device.query.one() dev = Device.query.one()
assert dev.type == 'Laptop' assert dev.type == 'Laptop'
assert dev.hid == 'laptop-samsung-lc27t55-aaaab' assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.id_device_supplier == 'a2' assert dev.placeholder.id_device_supplier == 'a2'
assert dev.serial_number == 'aaaac' assert dev.serial_number == 'aaaac'
@ -2077,7 +2089,8 @@ def test_add_placeholder_excel_from_lot(user3: UserClientFlask):
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Device.query.count() == 3 assert Device.query.count() == 3
dev = Device.query.first() dev = Device.query.first()
assert dev.hid == 'laptop-sony-vaio-12345678' chid = 'f28ae12ffd513f5ed8fb6714a344a2326c48a7196fb140435065ab96ffda1a71'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.info == 'Good conditions' assert dev.placeholder.info == 'Good conditions'
assert dev.placeholder.pallet == '24A' assert dev.placeholder.pallet == '24A'
@ -2116,7 +2129,8 @@ def test_add_new_placeholder_from_lot(user3: UserClientFlask):
} }
user3.post(uri, data=data) user3.post(uri, data=data)
dev = Device.query.one() dev = Device.query.one()
assert dev.hid == 'laptop-samsung-lc27t55-aaaab' chid = '274f05421e4d394c5b3cd10266fed6f0500029b104b5db3521689bda589e3150'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert len(lot.devices) == 1 assert len(lot.devices) == 1
@ -2141,7 +2155,8 @@ def test_manual_binding(user3: UserClientFlask):
} }
user3.post(uri, data=data) user3.post(uri, data=data)
dev = Device.query.one() dev = Device.query.one()
assert dev.hid == 'laptop-samsung-lc27t55-aaaab' chid = '274f05421e4d394c5b3cd10266fed6f0500029b104b5db3521689bda589e3150'
assert dev.chid == chid
assert dev.placeholder.phid == '1' assert dev.placeholder.phid == '1'
assert dev.placeholder.is_abstract is False assert dev.placeholder.is_abstract is False
@ -2153,8 +2168,8 @@ def test_manual_binding(user3: UserClientFlask):
assert dev_wb.binding.is_abstract is True assert dev_wb.binding.is_abstract is True
assert ( assert (
dev_wb.hid dev_wb.chid
== 'laptop-asustek_computer_inc-1001pxd-b8oaas048285-14:da:e9:42:f6:7b' == '83cb9066430a8ea7def04af61d521d6517193a486c02ea3bc914c9eaeb2b718b'
) )
assert dev_wb.binding.phid == '11' assert dev_wb.binding.phid == '11'
old_placeholder = dev_wb.binding old_placeholder = dev_wb.binding
@ -2653,10 +2668,109 @@ def test_system_uuid_motherboard(user3: UserClientFlask):
} }
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
snapshot2 = Snapshot.query.filter_by(uuid=snapshot_json['uuid']).first() snapshot2 = Snapshot.query.filter_by(uuid=snapshot_json['uuid']).first()
assert snapshot2 is None assert snapshot2.device == snapshot.device
for c in snapshot.device.components: for c in snapshot.device.components:
if c.type == 'Motherboard': if c.type == 'Motherboard':
assert c.serial_number == 'eee0123456720' assert c.serial_number == 'abee0123456720'
txt = "We have detected that a there is a device in your inventory"
assert txt in SnapshotsLog.query.all()[-1].description @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_unreliable_device(user3: UserClientFlask):
# Create device
snapshot = create_device(user3, 'real-eee-1001pxd.snapshot.12.json')
# Update device
uri = '/inventory/upload-snapshot/'
file_name = 'real-eee-1001pxd.snapshot.12'
snapshot_json = conftest.yaml2json(file_name)
snapshot_json['uuid'] = 'c058e8d2-fb92-47cb-a4b7-522b75561136'
b_snapshot = bytes(json.dumps(snapshot_json), 'utf-8')
file_snap = (BytesIO(b_snapshot), file_name)
user3.get(uri)
data = {
'snapshot': file_snap,
'csrf_token': generate_csrf(),
}
user3.post(uri, data=data, content_type="multipart/form-data")
snapshot2 = Snapshot.query.filter_by(uuid=snapshot_json['uuid']).first()
assert snapshot2.device == snapshot.device
assert Snapshot.query.count() == 2
snapshots = Snapshot.query.all()
assert snapshots[0].device == snapshots[1].device
assert len(snapshots[0].device.components)
assert snapshot2 in snapshots
# Change update for new device
uuid2 = snapshot2.uuid
uri = f"/inventory/snapshots/{uuid2}/"
user3.get(uri)
data = {
'snapshot_type': "new_device",
'csrf_token': generate_csrf(),
}
assert Device.query.filter_by(hid=snapshot.device.hid).count() == 2
user3.post(uri, data=data)
assert Device.query.filter_by(hid=snapshot.device.hid).count() == 4
assert Snapshot.query.count() == 2
snapshots = Snapshot.query.all()
assert snapshot2 not in snapshots
assert snapshots[0].device != snapshots[1].device
assert len(snapshots[0].device.components) == 4
assert len(snapshots[1].device.components) == 9
assert len(snapshots[0].device.actions) == 11
assert len(snapshots[1].device.actions) == 10
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_reliable_device(user3: UserClientFlask):
# Create device
snapshot = create_device(user3, 'real-eee-1001pxd.snapshot.12.json')
# Update device
uri = '/inventory/upload-snapshot/'
file_name = 'real-eee-1001pxd.snapshot.12'
snapshot_json = conftest.yaml2json(file_name)
snapshot_json['uuid'] = 'c058e8d2-fb92-47cb-a4b7-522b75561136'
b_snapshot = bytes(json.dumps(snapshot_json), 'utf-8')
file_snap = (BytesIO(b_snapshot), file_name)
user3.get(uri)
data = {
'snapshot': file_snap,
'csrf_token': generate_csrf(),
}
user3.post(uri, data=data, content_type="multipart/form-data")
snapshot2 = Snapshot.query.filter_by(uuid=snapshot_json['uuid']).first()
# Change update for new device
uuid2 = snapshot2.uuid
uri = f"/inventory/snapshots/{uuid2}/"
user3.get(uri)
data = {
'snapshot_type': "new_device",
'csrf_token': generate_csrf(),
}
user3.post(uri, data=data)
# Change update for update
snapshot3 = Snapshot.query.all()[-1]
uuid3 = snapshot3.uuid
uri = f"/inventory/snapshots/{uuid3}/"
user3.get(uri)
data = {
'snapshot_type': "update",
'csrf_token': generate_csrf(),
}
assert Device.query.filter_by(hid=snapshot.device.hid).count() == 4
user3.post(uri, data=data)
assert Device.query.filter_by(hid=snapshot.device.hid).count() == 2
assert Snapshot.query.count() == 1
assert Snapshot.query.first() == snapshot
assert len(snapshot.device.components) == 4
assert len(snapshot.device.actions) == 4

View File

@ -368,7 +368,7 @@ def test_snapshot_post_without_hid(user: UserClient):
assert response_snapshot['uuid'] == '9a3e7485-fdd0-47ce-bcc7-65c55226b598' assert response_snapshot['uuid'] == '9a3e7485-fdd0-47ce-bcc7-65c55226b598'
assert response_snapshot['elapsed'] == 4 assert response_snapshot['elapsed'] == 4
assert response_snapshot['author']['id'] == user.user['id'] assert response_snapshot['author']['id'] == user.user['id']
assert response_snapshot['severity'] == 'Warning' assert response_snapshot['severity'] == 'Info'
assert response_status.status_code == 201 assert response_status.status_code == 201
@ -391,7 +391,7 @@ def test_snapshot_tag_inner_tag_mismatch_between_tags_and_hid(
pc2 = yaml2json('1-device-with-components.snapshot') pc2 = yaml2json('1-device-with-components.snapshot')
user.post(json_encode(pc2), res=Snapshot) # PC2 uploads well user.post(json_encode(pc2), res=Snapshot) # PC2 uploads well
pc2['device']['tags'] = [{'type': 'Tag', 'id': tag_id}] # Set tag from pc1 to pc2 pc2['device']['tags'] = [{'type': 'Tag', 'id': tag_id}] # Set tag from pc1 to pc2
user.post(json_encode(pc2), res=Snapshot, status=MismatchBetweenTagsAndHid) user.post(json_encode(pc2), res=Snapshot, status=400)
@pytest.mark.mvp @pytest.mark.mvp
@ -411,7 +411,7 @@ def test_snapshot_different_properties_same_tags(user: UserClient, tag_id: str):
pc2['device']['tags'] = pc1['device']['tags'] pc2['device']['tags'] = pc1['device']['tags']
# pc2 model is unknown but pc1 model is set = different property # pc2 model is unknown but pc1 model is set = different property
del pc2['device']['model'] del pc2['device']['model']
user.post(json_encode(pc2), res=Snapshot, status=MismatchBetweenProperties) user.post(json_encode(pc2), res=Snapshot, status=201)
@pytest.mark.mvp @pytest.mark.mvp
@ -684,7 +684,8 @@ def test_erase_changing_hdd_between_pcs(user: UserClient):
tag2 = Tag(id='dev2', device=dev2) tag2 = Tag(id='dev2', device=dev2)
db.session.commit() db.session.commit()
assert dev2.components[1].actions[2].parent == dev1 assert dev2.components[2].parent == dev2
assert dev2.components[2].actions[-1].device == dev1
doc1, response = user.get( doc1, response = user.get(
res=documents.DocumentDef.t, item='erasures/{}'.format(dev1.id), accept=ANY res=documents.DocumentDef.t, item='erasures/{}'.format(dev1.id), accept=ANY
) )
@ -1004,7 +1005,8 @@ def test_snapshot_wb_lite(user: UserClient):
assert dev.dhid in body['public_url'] assert dev.dhid in body['public_url']
assert ssd.serial_number == 's35anx0j401001' assert ssd.serial_number == 's35anx0j401001'
assert res.status == '201 CREATED' assert res.status == '201 CREATED'
assert '00:28:f8:a6:d5:7e' in dev.hid chid = '7619bf5dfa630c8bd6d431c56777f6334d5c1e2e55d90c0dc4d1e99f80f031c1'
assert dev.chid == chid
assert dev.actions[0].power_on_hours == 6032 assert dev.actions[0].power_on_hours == 6032
errors = SnapshotsLog.query.filter().all() errors = SnapshotsLog.query.filter().all()
@ -1028,7 +1030,7 @@ def test_snapshot_wb_lite_qemu(user: UserClient):
assert dev.manufacturer == 'qemu' assert dev.manufacturer == 'qemu'
assert dev.model == 'standard' assert dev.model == 'standard'
assert dev.serial_number is None assert dev.serial_number is None
assert dev.hid is None assert dev.hid == 'computer-qemu-standard-'
assert dev.actions[0].power_on_hours == 1 assert dev.actions[0].power_on_hours == 1
assert dev.components[-1].size == 40960 assert dev.components[-1].size == 40960
assert dev.components[-1].serial_number == 'qm00001' assert dev.components[-1].serial_number == 'qm00001'
@ -1078,7 +1080,7 @@ def test_snapshot_wb_lite_old_snapshots(user: UserClient):
try: try:
assert body11['device'].get('hid') == dev.hid assert body11['device'].get('hid') == dev.hid
if body11['device'].get('hid'): if body11['device'].get('hid'):
assert body11['device']['id'] == dev.id assert body11['device']['id'] != dev.id
assert body11['device'].get('serialNumber') == dev.serial_number assert body11['device'].get('serialNumber') == dev.serial_number
assert body11['device'].get('model') == dev.model assert body11['device'].get('model') == dev.model
assert body11['device'].get('manufacturer') == dev.manufacturer assert body11['device'].get('manufacturer') == dev.manufacturer
@ -1405,7 +1407,7 @@ def test_bug_4028_components(user: UserClient):
assert '' not in [c.phid() for c in components1] assert '' not in [c.phid() for c in components1]
assert '' not in [c.phid() for c in components2] assert '' not in [c.phid() for c in components2]
assert len(components1) == len(components2) assert len(components1) == len(components2)
assert m.Placeholder.query.count() == 16 assert m.Placeholder.query.count() == 15
assert m.Placeholder.query.count() * 2 == m.Device.query.count() assert m.Placeholder.query.count() * 2 == m.Device.query.count()
for c in m.Placeholder.query.filter(): for c in m.Placeholder.query.filter():
assert c.binding assert c.binding

View File

@ -29,7 +29,7 @@ def test_wb11_form(user3: UserClientFlask):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert device.hid == 'laptop-toshiba-satellite_l655-2b335208q-00:26:6c:ae:ee:78' assert device.hid == 'laptop-toshiba-satellite_l655-2b335208q'
assert str(device.system_uuid) == 'f0dc6a7f-c23f-e011-b5d0-00266caeee78' assert str(device.system_uuid) == 'f0dc6a7f-c23f-e011-b5d0-00266caeee78'
@ -42,7 +42,7 @@ def test_wb11_api(user: UserClient):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert device.hid == 'laptop-toshiba-satellite_l655-2b335208q-00:26:6c:ae:ee:78' assert device.hid == 'laptop-toshiba-satellite_l655-2b335208q'
assert str(device.system_uuid) == 'f0dc6a7f-c23f-e011-b5d0-00266caeee78' assert str(device.system_uuid) == 'f0dc6a7f-c23f-e011-b5d0-00266caeee78'
@ -65,7 +65,7 @@ def test_wbLite_form(user3: UserClientFlask):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -78,7 +78,7 @@ def test_wbLite_api(user: UserClient):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -93,7 +93,7 @@ def test_wb11_to_wb11_with_uuid_api(user: UserClient):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert Computer.query.count() == 2 assert Computer.query.count() == 2
assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
assert device.system_uuid is None assert device.system_uuid is None
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -109,11 +109,8 @@ def test_wb11_to_wb11_with_uuid_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid assert device.system_uuid is None
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@pytest.mark.mvp @pytest.mark.mvp
@ -130,10 +127,7 @@ def test_wb11_with_uuid_to_wb11_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -144,10 +138,7 @@ def test_wb11_with_uuid_to_wb11_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -165,10 +156,7 @@ def test_wb11_with_uuid_to_wb11_without_hid_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -203,7 +191,7 @@ def test_wb11_to_wb11_with_uuid_form(user3: UserClientFlask):
db_snapthot = Snapshot.query.one() db_snapthot = Snapshot.query.one()
device = db_snapthot.device device = db_snapthot.device
assert Computer.query.count() == 2 assert Computer.query.count() == 2
assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
assert device.system_uuid is None assert device.system_uuid is None
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -222,11 +210,8 @@ def test_wb11_to_wb11_with_uuid_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid assert device.system_uuid is None
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@pytest.mark.mvp @pytest.mark.mvp
@ -254,10 +239,7 @@ def test_wb11_with_uuid_to_wb11_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -275,10 +257,7 @@ def test_wb11_with_uuid_to_wb11_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -307,10 +286,7 @@ def test_wb11_with_uuid_to_wb11_without_hid_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
# insert the same computer with wb11 with hid and with uuid, (new version) # insert the same computer with wb11 with hid and with uuid, (new version)
@ -340,10 +316,7 @@ def test_wb11_to_wblite_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
snapshot_lite = conftest.file_json('system_uuid2.json') snapshot_lite = conftest.file_json('system_uuid2.json')
@ -351,11 +324,9 @@ def test_wb11_to_wblite_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid # assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.system_uuid is None
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@pytest.mark.mvp @pytest.mark.mvp
@ -367,10 +338,7 @@ def test_wblite_to_wb11_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
snapshot_11 = conftest.file_json('system_uuid3.json') snapshot_11 = conftest.file_json('system_uuid3.json')
@ -378,10 +346,7 @@ def test_wblite_to_wb11_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -405,10 +370,7 @@ def test_wb11_to_wblite_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
file_name = 'system_uuid2.json' file_name = 'system_uuid2.json'
@ -424,11 +386,9 @@ def test_wb11_to_wblite_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid # assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0' assert device.system_uuid is None
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@pytest.mark.mvp @pytest.mark.mvp
@ -451,10 +411,7 @@ def test_wblite_to_wb11_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid == 'laptop-acer-aohappy-lusea0d010038879a01601'
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
file_name = 'system_uuid3.json' file_name = 'system_uuid3.json'
@ -470,10 +427,7 @@ def test_wblite_to_wb11_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -486,10 +440,7 @@ def test_wblite_to_wblite_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
snapshot_lite = conftest.file_json('system_uuid2.json') snapshot_lite = conftest.file_json('system_uuid2.json')
@ -498,10 +449,7 @@ def test_wblite_to_wblite_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -525,10 +473,7 @@ def test_wblite_to_wblite_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
file_name = 'system_uuid2.json' file_name = 'system_uuid2.json'
@ -545,10 +490,7 @@ def test_wblite_to_wblite_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -562,10 +504,7 @@ def test_wb11_to_wb11_duplicity_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
snapshot_11 = conftest.file_json('system_uuid3.json') snapshot_11 = conftest.file_json('system_uuid3.json')
@ -573,7 +512,7 @@ def test_wb11_to_wb11_duplicity_api(user: UserClient):
components = [x for x in snapshot_11['components'] if x['type'] != 'NetworkAdapter'] components = [x for x in snapshot_11['components'] if x['type'] != 'NetworkAdapter']
snapshot_11['components'] = components snapshot_11['components'] = components
user.post(snapshot_11, res=Snapshot) user.post(snapshot_11, res=Snapshot)
assert Computer.query.count() == 4 assert Computer.query.count() == 2
for c in Computer.query.all(): for c in Computer.query.all():
assert 'laptop-acer-aohappy-lusea0d010038879a01601' in c.hid assert 'laptop-acer-aohappy-lusea0d010038879a01601' in c.hid
assert c.system_uuid is None assert c.system_uuid is None
@ -599,10 +538,7 @@ def test_wb11_to_wb11_duplicity_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
snapshot_11 = conftest.file_json('system_uuid3.json') snapshot_11 = conftest.file_json('system_uuid3.json')
@ -619,7 +555,7 @@ def test_wb11_to_wb11_duplicity_form(user3: UserClientFlask):
} }
user3.post(uri, data=data, content_type="multipart/form-data") user3.post(uri, data=data, content_type="multipart/form-data")
assert Computer.query.count() == 4 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert 'laptop-acer-aohappy-lusea0d010038879a01601' in device.hid assert 'laptop-acer-aohappy-lusea0d010038879a01601' in device.hid
@ -636,10 +572,7 @@ def test_wb11_smbios_2_5_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
@ -663,10 +596,7 @@ def test_wb11_smbios_2_5_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert device.system_uuid is None assert device.system_uuid is None
@ -681,10 +611,7 @@ def test_wblite_smbios_2_5_api(user: UserClient):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'
@ -709,8 +636,5 @@ def test_wblite_smbios_2_5_form(user3: UserClientFlask):
assert Computer.query.count() == 2 assert Computer.query.count() == 2
for device in Computer.query.all(): for device in Computer.query.all():
if device.binding: if device.binding:
assert ( assert device.hid
device.hid
== 'laptop-acer-aohappy-lusea0d010038879a01601-88:ae:1d:a6:f3:d0'
)
assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0' assert str(device.system_uuid) == '9ce64e36-829c-b19c-2111-88ae1da6f3d0'

View File

@ -348,39 +348,6 @@ def test_tag_manual_link_search(app: Devicehub, user: UserClient):
assert i['items'] assert i['items']
@pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__)
def test_tag_secondary_workbench_link_find(user: UserClient):
"""Creates and consumes tags with a secondary id, linking them
through Workbench to a device
and getting them through search."""
t = Tag('foo', secondary='bar', owner_id=user.user['id'])
db.session.add(t)
db.session.flush()
assert Tag.from_an_id('bar').one() == Tag.from_an_id('foo').one()
with pytest.raises(ResourceNotFound):
Tag.from_an_id('nope').one()
s = yaml2json('basic.snapshot')
s['device']['tags'] = [{'id': 'foo', 'secondary': 'bar', 'type': 'Tag'}]
snapshot, _ = user.post(json_encode(s), res=Snapshot)
dev = Device.query.filter_by(id=snapshot['device']['id']).one()
device, _ = user.get(res=Device, item=dev.devicehub_id)
desktop = dev.binding.device
assert [] == [x['id'] for x in device['tags']]
assert 'foo' in [x.id for x in desktop.tags]
assert 'bar' in [x.secondary for x in desktop.tags]
r, _ = user.get(
res=Device, query=[('search', 'foo'), ('filter', {'type': ['Computer']})]
)
assert len(r['items']) == 1
r, _ = user.get(
res=Device, query=[('search', 'bar'), ('filter', {'type': ['Computer']})]
)
assert len(r['items']) == 1
@pytest.mark.mvp @pytest.mark.mvp
def test_tag_create_tags_cli_csv(app: Devicehub, user: UserClient): def test_tag_create_tags_cli_csv(app: Devicehub, user: UserClient):
"""Checks creating tags with the CLI endpoint using a CSV.""" """Checks creating tags with the CLI endpoint using a CSV."""

View File

@ -15,8 +15,8 @@ from ereuse_devicehub.resources.action.models import (
from ereuse_devicehub.resources.device.exceptions import NeedsId from ereuse_devicehub.resources.device.exceptions import NeedsId
from ereuse_devicehub.resources.device.models import Device from ereuse_devicehub.resources.device.models import Device
from ereuse_devicehub.resources.tag.model import Tag from ereuse_devicehub.resources.tag.model import Tag
from tests.conftest import file, file_workbench, json_encode, yaml2json
from tests import conftest from tests import conftest
from tests.conftest import file, file_workbench, json_encode, yaml2json
@pytest.mark.mvp @pytest.mark.mvp
@ -60,7 +60,7 @@ def test_workbench_server_condensed(user: UserClient):
device, _ = user.get(res=Device, item=db_dev.devicehub_id) device, _ = user.get(res=Device, item=db_dev.devicehub_id)
assert device['dataStorageSize'] == 1100 assert device['dataStorageSize'] == 1100
assert device['chassis'] == 'Tower' assert device['chassis'] == 'Tower'
assert device['hid'] == 'desktop-d1mr-d1ml-d1s-na1-s' assert device['hid'] == 'desktop-d1mr-d1ml-d1s'
assert device['graphicCardModel'] == device['components'][0]['model'] == 'gc1-1ml' assert device['graphicCardModel'] == device['components'][0]['model'] == 'gc1-1ml'
assert device['networkSpeeds'] == [1000, 58] assert device['networkSpeeds'] == [1000, 58]
assert device['processorModel'] == device['components'][3]['model'] == 'p1-1ml' assert device['processorModel'] == device['components'][3]['model'] == 'p1-1ml'
@ -147,10 +147,7 @@ def test_real_hp_11(user: UserClient):
s = file('real-hp.snapshot.11') s = file('real-hp.snapshot.11')
snapshot, _ = user.post(res=em.Snapshot, data=s) snapshot, _ = user.post(res=em.Snapshot, data=s)
pc = snapshot['device'] pc = snapshot['device']
assert ( assert pc['hid'] == 'desktop-hewlett-packard-hp_compaq_8100_elite_sff-czc0408yjg'
pc['hid']
== 'desktop-hewlett-packard-hp_compaq_8100_elite_sff-czc0408yjg-6c:62:6d:81:22:9f'
)
assert pc['chassis'] == 'Tower' assert pc['chassis'] == 'Tower'
assert set(e['type'] for e in snapshot['actions']) == { assert set(e['type'] for e in snapshot['actions']) == {
'BenchmarkDataStorage', 'BenchmarkDataStorage',
@ -192,10 +189,7 @@ def test_snapshot_real_eee_1001pxd_with_rate(user: UserClient):
assert pc['model'] == '1001pxd' assert pc['model'] == '1001pxd'
assert pc['serialNumber'] == 'b8oaas048286' assert pc['serialNumber'] == 'b8oaas048286'
assert pc['manufacturer'] == 'asustek computer inc.' assert pc['manufacturer'] == 'asustek computer inc.'
assert ( assert pc['hid'] == 'laptop-asustek_computer_inc.-1001pxd-b8oaas048286'
pc['hid']
== 'laptop-asustek_computer_inc-1001pxd-b8oaas048286-14:da:e9:42:f6:7c'
)
assert len(pc['tags']) == 0 assert len(pc['tags']) == 0
assert pc['networkSpeeds'] == [ assert pc['networkSpeeds'] == [
100, 100,
@ -209,14 +203,14 @@ def test_snapshot_real_eee_1001pxd_with_rate(user: UserClient):
wifi = components[0] wifi = components[0]
assert ( assert (
wifi['hid'] == 'networkadapter-qualcomm_atheros-' wifi['hid'] == 'networkadapter-qualcomm_atheros-'
'ar9285_wireless_network_adapter-74_2f_68_8b_fd_c8' 'ar9285_wireless_network_adapter-74:2f:68:8b:fd:c8'
) )
assert wifi['serialNumber'] == '74:2f:68:8b:fd:c8' assert wifi['serialNumber'] == '74:2f:68:8b:fd:c8'
assert wifi['wireless'] assert wifi['wireless']
eth = components[1] eth = components[1]
assert ( assert (
eth['hid'] == 'networkadapter-qualcomm_atheros-' eth['hid'] == 'networkadapter-qualcomm_atheros-'
'ar8152_v2_0_fast_ethernet-14_da_e9_42_f6_7c' 'ar8152_v2.0_fast_ethernet-14:da:e9:42:f6:7c'
) )
assert eth['speed'] == 100 assert eth['speed'] == 100
assert not eth['wireless'] assert not eth['wireless']
@ -225,7 +219,7 @@ def test_snapshot_real_eee_1001pxd_with_rate(user: UserClient):
assert cpu['cores'] == 1 assert cpu['cores'] == 1
assert cpu['threads'] == 1 assert cpu['threads'] == 1
assert cpu['speed'] == 1.667 assert cpu['speed'] == 1.667
assert 'hid' not in cpu assert 'hid' in cpu
assert pc['processorModel'] == cpu['model'] == 'intel atom cpu n455 @ 1.66ghz' assert pc['processorModel'] == cpu['model'] == 'intel atom cpu n455 @ 1.66ghz'
db_cpu = Device.query.filter_by(id=cpu['id']).one() db_cpu = Device.query.filter_by(id=cpu['id']).one()
cpu, _ = user.get(res=Device, item=db_cpu.devicehub_id) cpu, _ = user.get(res=Device, item=db_cpu.devicehub_id)
@ -287,7 +281,7 @@ def test_snapshot_real_eee_1001pxd_with_rate(user: UserClient):
assert erase['severity'] == 'Info' assert erase['severity'] == 'Info'
assert hdd['privacy']['type'] == 'EraseBasic' assert hdd['privacy']['type'] == 'EraseBasic'
mother = components[8] mother = components[8]
assert mother['hid'] == 'motherboard-asustek_computer_inc-1001pxd-eee0123456789' assert mother['hid'] == 'motherboard-asustek_computer_inc.-1001pxd-eee0123456789'
@pytest.mark.mvp @pytest.mark.mvp