127 lines
4.4 KiB
Python
127 lines
4.4 KiB
Python
from decimal import Decimal
|
|
from distutils.version import StrictVersion
|
|
|
|
import pytest
|
|
|
|
from ereuse_devicehub.client import UserClient
|
|
from ereuse_devicehub.db import db
|
|
from ereuse_devicehub.resources.device.models import Computer, Desktop, HardDrive, Processor, \
|
|
RamModule
|
|
from ereuse_devicehub.resources.enums import AppearanceRange, ComputerChassis, \
|
|
FunctionalityRange
|
|
from ereuse_devicehub.resources.event.models import BenchmarkDataStorage, BenchmarkProcessor, \
|
|
RateComputer, Snapshot, VisualTest
|
|
from ereuse_devicehub.resources.event.rate.workbench.v1_0 import CannotRate
|
|
from tests import conftest
|
|
from tests.conftest import file
|
|
|
|
|
|
@pytest.mark.usefixtures(conftest.auth_app_context.__name__)
|
|
def test_workbench_rate_db():
|
|
rate = RateComputer(processor=0.1,
|
|
ram=1.0,
|
|
data_storage=4.1,
|
|
graphic_card=0.1,
|
|
version=StrictVersion('1.0'),
|
|
device=Computer(serial_number='24', chassis=ComputerChassis.Tower))
|
|
db.session.add(rate)
|
|
db.session.commit()
|
|
|
|
|
|
@pytest.mark.xfail(reason='ComputerRate V1 can only be triggered from Workbench snapshot software')
|
|
def test_rate_workbench_then_manual():
|
|
"""Checks that a new Rate is generated for a snapshot
|
|
that is not from Workbench.
|
|
"""
|
|
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
def test_rate():
|
|
"""Test generating an Rate for a given PC / components /
|
|
RateComputer ensuring results and relationships between
|
|
pc - rate - RateComputer - price.
|
|
"""
|
|
|
|
pc = Desktop(chassis=ComputerChassis.Tower)
|
|
hdd = HardDrive(size=476940)
|
|
hdd.events_one.add(BenchmarkDataStorage(read_speed=126, write_speed=29.8))
|
|
cpu = Processor(cores=2, speed=3.4)
|
|
cpu.events_one.add(BenchmarkProcessor(rate=27136.44))
|
|
pc.components |= {
|
|
hdd,
|
|
RamModule(size=4096, speed=1600),
|
|
RamModule(size=2048, speed=1067),
|
|
cpu
|
|
}
|
|
|
|
# Add test visual with functionality and appearance range
|
|
VisualTest(appearance_range=AppearanceRange.A,
|
|
functionality_range=FunctionalityRange.A,
|
|
device=pc)
|
|
rate, price = RateComputer.compute(pc)
|
|
|
|
# events = pc.events
|
|
# price = next(e for e in events if isinstance(e, EreusePrice))
|
|
assert price.price == Decimal('92.2001')
|
|
assert price.retailer.standard.amount == Decimal('40.9714')
|
|
assert price.platform.standard.amount == Decimal('18.8434')
|
|
assert price.refurbisher.standard.amount == Decimal('32.3853')
|
|
assert price.price >= price.retailer.standard.amount \
|
|
+ price.platform.standard.amount \
|
|
+ price.refurbisher.standard.amount
|
|
assert price.retailer.warranty2.amount == Decimal('55.3085')
|
|
assert price.platform.warranty2.amount == Decimal('25.4357')
|
|
assert price.refurbisher.warranty2.amount == Decimal('43.7259')
|
|
assert price.warranty2 == Decimal('124.47')
|
|
|
|
|
|
def test_no_rate_if_no_workbench(user: UserClient):
|
|
"""
|
|
Checks if compute a rate from snapshot software is not from Workbench
|
|
"""
|
|
# Upload a basic snapshot
|
|
device_no_wb = file('basic.snapshot')
|
|
# Change snapshot software source
|
|
device_no_wb['software'] = 'Web'
|
|
del device_no_wb['uuid']
|
|
del device_no_wb['elapsed']
|
|
del device_no_wb['components']
|
|
# Try to compute rate
|
|
user.post(device_no_wb, res=Snapshot)
|
|
# How to assert CannotRate Exception
|
|
assert CannotRate
|
|
|
|
|
|
def test_no_rate_if_no_visual_test(user: UserClient):
|
|
"""
|
|
Checks if a rate is calculated from a snapshot without visual test
|
|
"""
|
|
# Upload a basic snapshot
|
|
device = file('basic.snapshot')
|
|
# Delete snapshot device events
|
|
del device['device']['events']
|
|
user.post(device, res=Snapshot)
|
|
# How to assert CannotRate Exception
|
|
assert CannotRate
|
|
|
|
|
|
def test_no_rate_if_device_is_not_computer(user: UserClient):
|
|
"""
|
|
Checks if a rate is calculated from a device that is not a computer.
|
|
"""
|
|
# Upload a basic snapshot of a device type
|
|
device = file('keyboard.snapshot')
|
|
user.post(device, res=Snapshot)
|
|
assert CannotRate
|
|
|
|
|
|
@pytest.mark.xfail(reason='Test not developed')
|
|
def test_multiple_rates(user: UserClient):
|
|
"""Tests submitting two rates from Workbench,
|
|
ensuring that the tests / benchmarks...
|
|
from the first rate do not contaminate the second rate.
|
|
|
|
This ensures that rates only takes the last version of events
|
|
and components (in case device has new components, for example).
|
|
"""
|