Fix test_snapshot_different_properties_same_tags
This commit is contained in:
parent
91beed87ee
commit
b59721707d
|
@ -76,7 +76,11 @@ class Device(Thing):
|
||||||
'parent_id',
|
'parent_id',
|
||||||
'hid',
|
'hid',
|
||||||
'production_date',
|
'production_date',
|
||||||
'color'
|
'color', # these are only user-input thus volatile
|
||||||
|
'width',
|
||||||
|
'height',
|
||||||
|
'depth',
|
||||||
|
'weight'
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, **kw) -> None:
|
def __init__(self, **kw) -> None:
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
|
import difflib
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
from typing import Iterable, Set
|
from typing import Iterable, Set
|
||||||
|
|
||||||
|
import yaml
|
||||||
from sqlalchemy import inspect
|
from sqlalchemy import inspect
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from sqlalchemy.util import OrderedSet
|
from sqlalchemy.util import OrderedSet
|
||||||
|
@ -166,11 +168,16 @@ class Sync:
|
||||||
sample_tag = next(iter(linked_tags))
|
sample_tag = next(iter(linked_tags))
|
||||||
for tag in linked_tags:
|
for tag in linked_tags:
|
||||||
if tag.device_id != sample_tag.device_id:
|
if tag.device_id != sample_tag.device_id:
|
||||||
raise MismatchBetweenTags(tag, sample_tag) # Linked to different devices
|
raise MismatchBetweenTags(tag, sample_tag) # Tags linked to different devices
|
||||||
if db_device: # Device from hid
|
if db_device: # Device from hid
|
||||||
if sample_tag.device_id != db_device.id: # Device from hid != device from tags
|
if sample_tag.device_id != db_device.id: # Device from hid != device from tags
|
||||||
raise MismatchBetweenTagsAndHid(db_device.id, db_device.hid)
|
raise MismatchBetweenTagsAndHid(db_device.id, db_device.hid)
|
||||||
else: # There was no device from 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
|
db_device = sample_tag.device
|
||||||
if db_device: # Device from hid or tags
|
if db_device: # Device from hid or tags
|
||||||
self.merge(device, db_device)
|
self.merge(device, db_device)
|
||||||
|
@ -254,3 +261,12 @@ class MismatchBetweenTagsAndHid(ValidationError):
|
||||||
message = 'Tags are linked to device {} but hid refers to device {}.'.format(device_id,
|
message = 'Tags are linked to device {} but hid refers to device {}.'.format(device_id,
|
||||||
hid)
|
hid)
|
||||||
super().__init__(message, field_names)
|
super().__init__(message, field_names)
|
||||||
|
|
||||||
|
|
||||||
|
class MismatchBetweenProperties(ValidationError):
|
||||||
|
def __init__(self, props1, props2, field_names={'device'}):
|
||||||
|
message = 'The device from the tag and the passed-in differ the following way:'
|
||||||
|
message += '\n'.join(
|
||||||
|
difflib.ndiff(yaml.dump(props1).splitlines(), yaml.dump(props2).splitlines())
|
||||||
|
)
|
||||||
|
super().__init__(message, field_names)
|
||||||
|
|
|
@ -116,19 +116,11 @@ def test_physical_properties():
|
||||||
'serial': None,
|
'serial': None,
|
||||||
'firewire': None,
|
'firewire': None,
|
||||||
'manufacturer': 'mr',
|
'manufacturer': 'mr',
|
||||||
'weight': None,
|
|
||||||
'height': None,
|
|
||||||
'width': 2.0,
|
|
||||||
'depth': None
|
|
||||||
}
|
}
|
||||||
assert pc.physical_properties == {
|
assert pc.physical_properties == {
|
||||||
'model': 'foo',
|
'model': 'foo',
|
||||||
'manufacturer': 'bar',
|
'manufacturer': 'bar',
|
||||||
'serial_number': 'foo-bar',
|
'serial_number': 'foo-bar',
|
||||||
'weight': 2.8,
|
|
||||||
'width': 1.4,
|
|
||||||
'height': 2.1,
|
|
||||||
'depth': None,
|
|
||||||
'chassis': ComputerChassis.Tower
|
'chassis': ComputerChassis.Tower
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,8 @@ from ereuse_devicehub.db import db
|
||||||
from ereuse_devicehub.devicehub import Devicehub
|
from ereuse_devicehub.devicehub import Devicehub
|
||||||
from ereuse_devicehub.resources.device import models as m
|
from ereuse_devicehub.resources.device import models as m
|
||||||
from ereuse_devicehub.resources.device.exceptions import NeedsId
|
from ereuse_devicehub.resources.device.exceptions import NeedsId
|
||||||
from ereuse_devicehub.resources.device.sync import MismatchBetweenTagsAndHid
|
from ereuse_devicehub.resources.device.sync import MismatchBetweenProperties, \
|
||||||
|
MismatchBetweenTagsAndHid
|
||||||
from ereuse_devicehub.resources.enums import ComputerChassis, SnapshotSoftware
|
from ereuse_devicehub.resources.enums import ComputerChassis, SnapshotSoftware
|
||||||
from ereuse_devicehub.resources.event.models import AggregateRate, BenchmarkProcessor, \
|
from ereuse_devicehub.resources.event.models import AggregateRate, BenchmarkProcessor, \
|
||||||
EraseSectors, Event, Snapshot, SnapshotRequest, WorkbenchRate
|
EraseSectors, Event, Snapshot, SnapshotRequest, WorkbenchRate
|
||||||
|
@ -246,10 +247,8 @@ def test_snapshot_tag_inner_tag_mismatch_between_tags_and_hid(user: UserClient,
|
||||||
user.post(pc2, res=Snapshot, status=MismatchBetweenTagsAndHid)
|
user.post(pc2, res=Snapshot, status=MismatchBetweenTagsAndHid)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail(reason='There is no attribute checking for tag-matching devices')
|
|
||||||
def test_snapshot_different_properties_same_tags(user: UserClient, tag_id: str):
|
def test_snapshot_different_properties_same_tags(user: UserClient, tag_id: str):
|
||||||
"""
|
"""Tests a snapshot performed to device 1 with tag A and then to
|
||||||
Tests a snapshot performed to device 1 with tag A and then to
|
|
||||||
device 2 with tag B. Both don't have HID but are different type.
|
device 2 with tag B. Both don't have HID but are different type.
|
||||||
Devicehub must fail the Snapshot.
|
Devicehub must fail the Snapshot.
|
||||||
"""
|
"""
|
||||||
|
@ -262,9 +261,9 @@ def test_snapshot_different_properties_same_tags(user: UserClient, tag_id: str):
|
||||||
pc2 = file('basic.snapshot')
|
pc2 = file('basic.snapshot')
|
||||||
pc2['uuid'] = uuid4()
|
pc2['uuid'] = uuid4()
|
||||||
pc2['device']['tags'] = pc1['device']['tags']
|
pc2['device']['tags'] = pc1['device']['tags']
|
||||||
del pc2['device'][
|
# pc2 model is unknown but pc1 model is set = different property
|
||||||
'model'] # pc2 model is unknown but pc1 model is set = different characteristic
|
del pc2['device']['model']
|
||||||
user.post(pc2, res=Snapshot, status=422)
|
user.post(pc2, res=Snapshot, status=MismatchBetweenProperties)
|
||||||
|
|
||||||
|
|
||||||
def test_snapshot_upload_twice_uuid_error(user: UserClient):
|
def test_snapshot_upload_twice_uuid_error(user: UserClient):
|
||||||
|
|
Reference in a new issue