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, TestVisual, Snapshot 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='AggreagteRate only takes data from WorkbenchRate as for now') def test_rate_workbench_then_manual(): """Checks that a new Rate is generated with a new rate value when a TestVisual is performed after performing a RateComputer. The new Rate needs to be computed by the values of the appearance and funcitonality grade of TestVisual. """ pass @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 visual_test = TestVisual() visual_test.appearance_range = AppearanceRange.A visual_test.functionality_range = FunctionalityRange.A pc.events_one.add(visual_test) 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