Example #1
0
from libs.car import Car, Cars
from libs.charging import Charging
from web.db import Database

DATA_DIR = os.path.dirname(os.path.realpath(__file__)) + "/data/"
latitude = 47.2183
longitude = -1.55362
date3 = datetime.utcnow().replace(2021, 3, 1, 12, 00, 00, 00, tzinfo=pytz.UTC)
date2 = date3 - timedelta(minutes=20)
date1 = date3 - timedelta(minutes=40)
date0 = date3 - timedelta(minutes=60)
date4 = date3 + timedelta(minutes=1)

vehicule_list = Cars()
vehicule_list.extend(
    [Car("VR3UHZKX", "vid", "Peugeot"), Car("VXXXXX", "XXXX", "Peugeot", label="SUV 3008 Hybrid 225")])
car = vehicule_list[0]
DB_DIR = DATA_DIR + "tmp.db"


def get_new_test_db():
    try:
        os.remove(DATA_DIR + "tmp.db")
    except FileNotFoundError:
        pass
    Database.DEFAULT_DB_FILE = DB_DIR
    Database.db_initialized = False
    conn = Database.get_db()
    return conn

class TestUnit(unittest.TestCase):
    def __init__(self, methodName='runTest'):
        super().__init__(methodName)
        self.test_online = os.environ.get("TEST_ONLINE", "0") == "1"
        self.vehicule_list = Cars()
        self.vehicule_list.extend([
            Car("VR3UHZKX", "vid", "Peugeot"),
            Car("VXXXXX", "XXXX", "Peugeot", label="SUV 3008")
        ])

    @staticmethod
    def get_new_test_db():
        try:
            os.remove(DATA_DIR + "tmp.db")
        except:
            pass
        Database.DEFAULT_DB_FILE = DATA_DIR + "tmp.db"
        Database.db_initialized = False
        conn = Database.get_db()
        return conn

    def test_car(self):
        car1 = Car("VRAAAAAAA", "1sdfdksnfk222", "Peugeot", "208", 46, 0)
        car2 = Car("VR3UHZKX", "1sdfdksnfk222", "Peugeot")
        cars = Cars([car1, car2])
        cars.save_cars(name=DATA_DIR + "test_car.json")
        Cars.load_cars(name=DATA_DIR + "test_car.json")

    def test_otp_config(self):
        otp_config = load_otp(filename=DATA_DIR + "otp_test.bin")
        assert otp_config is not None
        save_otp(otp_config, filename=DATA_DIR + "otp_test2.bin")

    def test_mypsacc(self):
        if self.test_online:
            myp = MyPSACC.load_config("config.json")
            myp.refresh_token()
            myp.get_vehicles()
            car = myp.vehicles_list[0]
            myp.abrp.abrp_enable_vin.add(car.vin)
            res = myp.get_vehicle_info(myp.vehicles_list[0].vin)
            myp.abrp.call(car, 22.1)
            myp.save_config()
            assert isinstance(
                get_temp(str(latitude), str(longitude), myp.weather_api),
                float)

    def test_car_model(self):
        assert CarModel.find_model_by_vin("VR3UHZKXZL").name == "e-208"
        assert CarModel.find_model_by_vin("VR3UKZKXZM").name == "e-2008"
        assert CarModel.find_model_by_vin("VXKUHZKXZL").name == "corsa-e"

    def test_c02_signal_cache(self):
        start = datetime.now() - timedelta(minutes=30)
        end = datetime.now()
        Ecomix._cache = {
            'FR': [[start - timedelta(days=1), 100],
                   [start + timedelta(minutes=1), 10],
                   [start + timedelta(minutes=2), 20],
                   [start + timedelta(minutes=3), 30]]
        }
        assert Ecomix.get_co2_from_signal_cache(start, end, "FR") == 20

    def test_c02_signal(self):
        if self.test_online:
            key = "d186c74bfbcd1da8"
            Ecomix.co2_signal_key = key
            def_country = "FR"
            Ecomix.get_data_from_co2_signal(latitude, longitude, def_country)
            res = Ecomix.get_co2_from_signal_cache(
                datetime.now() - timedelta(minutes=5), datetime.now(),
                def_country)
            assert isinstance(res, float)

    def test_charge_control(self):
        charge_control = ChargeControls()
        charge_control.file_name = "test_charge_control.json"
        charge_control.save_config(force=True)

    def test_battery_curve(self):
        from libs.car import Car
        from libs.charging import Charging
        try:
            os.remove("tmp.db")
        except:
            pass
        Database.DEFAULT_DB_FILE = "tmp.db"
        conn = Database.get_db()
        list(map(dict, conn.execute('PRAGMA database_list').fetchall()))
        vin = "VR3UHZKXZL"
        car = Car(vin, "id", "Peugeot")
        Charging.record_charging(car, "InProgress", date0, 50, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "InProgress", date1, 75, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "InProgress", date2, 85, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "InProgress", date3, 90, latitude,
                                 longitude, "FR", "slow")

        res = Database.get_battery_curve(Database.get_db(), date0, vin)
        assert len(res) == 3

    def test_sdk(self):

        res = {
            'lastPosition': {
                'type': 'Feature',
                'geometry': {
                    'type': 'Point',
                    'coordinates': [9.65457, 49.96119, 21]
                },
                'properties': {
                    'updatedAt': '2021-03-29T05:16:10Z',
                    'heading': 126,
                    'type': 'Estimated'
                }
            },
            'preconditionning': {
                'airConditioning': {
                    'updatedAt':
                    '2021-04-01T16:17:01Z',
                    'status':
                    'Disabled',
                    'programs': [{
                        'enabled': False,
                        'slot': 1,
                        'recurrence': 'Daily',
                        'start': 'PT21H40M',
                        'occurence': {
                            'day': ['Sat']
                        }
                    }]
                }
            },
            'energy': [{
                'updatedAt': '2021-02-23T22:29:03Z',
                'type': 'Fuel',
                'level': 0
            }, {
                'updatedAt': '2021-04-01T16:17:01Z',
                'type': 'Electric',
                'level': 70,
                'autonomy': 192,
                'charging': {
                    'plugged': False,
                    'status': 'Disconnected',
                    'remainingTime': 'PT0S',
                    'chargingRate': 0,
                    'chargingMode': 'No',
                    'nextDelayedTime': 'PT21H30M'
                }
            }],
            'createdAt':
            '2021-04-01T16:17:01Z',
            'battery': {
                'voltage': 99,
                'current': 0,
                'createdAt': '2021-04-01T16:17:01Z'
            },
            'kinetic': {
                'createdAt': '2021-03-29T05:16:10Z',
                'moving': False
            },
            'privacy': {
                'createdAt': '2021-04-01T16:17:01Z',
                'state': 'None'
            },
            'service': {
                'type': 'Electric',
                'updatedAt': '2021-02-23T21:10:29Z'
            },
            '_links': {
                'self': {
                    'href':
                    'https://api.groupe-psa.com/connectedcar/v4/user/vehicles/myid/status'
                },
                'vehicles': {
                    'href':
                    'https://api.groupe-psa.com/connectedcar/v4/user/vehicles/myid'
                }
            },
            'timed.odometer': {
                'createdAt': None,
                'mileage': 1107.1
            },
            'updatedAt':
            '2021-04-01T16:17:01Z'
        }
        api = ApiClient()
        status: psacc.models.status.Status = api._ApiClient__deserialize(
            res, "Status")
        geocode_res = reverse_geocode.search([
            (status.last_position.geometry.coordinates[:2])[::-1]
        ])[0]
        assert geocode_res["country_code"] == "DE"
        TestUnit.get_new_test_db()
        car = Car("XX", "vid", "Peugeot")
        car.status = status
        myp = MyPSACC.load_config(DATA_DIR + "config.json")
        myp.record_info(car)
        assert "features" in json.loads(Database.get_recorded_position())
        # electric should be first
        assert car.status.energy[0].type == 'Electric'

    def test_record_position_charging(self):
        TestUnit.get_new_test_db()
        ElecPrice.CONFIG_FILENAME = DATA_DIR + "config.ini"
        car = self.vehicule_list[0]
        Database.record_position(None, car.vin, 11, latitude, longitude - 0.05,
                                 None, date0, 40, None, False)
        Database.record_position(None, car.vin, 20, latitude, longitude, 32,
                                 date1, 35, None, False)
        Database.record_position(None, car.vin, 30, latitude, longitude, 42,
                                 date2, 30, None, False)
        Database.add_altitude_to_db(Database.get_db())
        data = json.loads(Database.get_recorded_position())
        assert data["features"][1]["geometry"]["coordinates"] == [
            float(longitude), float(latitude)
        ]
        trips = Trips.get_trips(self.vehicule_list)[car.vin]
        trip = trips[0]
        map(trip.add_temperature, [10, 13, 15])
        res = trip.get_info()
        assert compare_dict(
            res, {
                'consumption_km': 24.21052631578947,
                'start_at': date0,
                'consumption_by_temp': None,
                'positions': {
                    'lat': [latitude],
                    'long': [longitude]
                },
                'duration': 40.0,
                'speed_average': 28.5,
                'distance': 19.0,
                'mileage': 30.0,
                'altitude_diff': 2,
                'id': 1,
                'consumption': 4.6
            })

        Charging.elec_price = ElecPrice.read_config()
        start_level = 40
        end_level = 85
        Charging.record_charging(car, "InProgress", date0, start_level,
                                 latitude, longitude, None, "slow")
        Charging.record_charging(car, "InProgress", date1, 70, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "InProgress", date1, 70, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "InProgress", date2, 80, latitude,
                                 longitude, "FR", "slow")
        Charging.record_charging(car, "Stopped", date3, end_level, latitude,
                                 longitude, "FR", "slow")
        chargings = Charging.get_chargings()
        co2 = chargings[0]["co2"]
        assert isinstance(co2, float)
        assert compare_dict(chargings, [{
            'start_at': date0,
            'stop_at': date3,
            'VIN': 'VR3UHZKX',
            'start_level': 40,
            'end_level': 85,
            'co2': co2,
            'kw': 20.7,
            'price': 3.84,
            'charging_mode': 'slow'
        }])
        assert get_figures(car)
        row = {
            "start_at": date0.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
            "stop_at": date3.strftime('%Y-%m-%dT%H:%M:%S.000Z'),
            "start_level": start_level,
            "end_level": end_level
        }
        assert get_battery_curve_fig(row, car) is not None
        assert get_altitude_fig(trip) is not None

    def test_fuel_car(self):
        TestUnit.get_new_test_db()
        ElecPrice.CONFIG_FILENAME = DATA_DIR + "config.ini"
        car = self.vehicule_list[1]
        Database.record_position(None, car.vin, 11, latitude, longitude, 22,
                                 date0, 40, 30, False)
        Database.record_position(None, car.vin, 20, latitude, longitude, 22,
                                 date1, 35, 29, False)
        Database.record_position(None, car.vin, 30, latitude, longitude, 22,
                                 date2, 30, 28, False)
        trips = Trips.get_trips(self.vehicule_list)
        res = trips[car.vin].get_trips_as_dict()
        assert compare_dict(res, [{
            'consumption_km': 5.684210526315789,
            'start_at': date0,
            'consumption_by_temp': None,
            'positions': {
                'lat': [latitude],
                'long': [longitude]
            },
            'duration': 40.0,
            'speed_average': 28.5,
            'distance': 19.0,
            'mileage': 30.0,
            'altitude_diff': 0,
            'id': 1,
            'consumption': 1.08,
            'consumption_fuel_km': 10.53
        }])

    def test_db_callback(self):
        old_dummy_value = dummy_value
        TestUnit.get_new_test_db()
        Database.set_db_callback(callback_test)
        assert old_dummy_value == dummy_value
        Database.record_position(None, "xx", 11, latitude, longitude - 0.05,
                                 None, date0, 40, None, False)
        assert old_dummy_value != dummy_value

    def test_parse_hour(self):
        expected_res = [(2, 0, 0), (3, '14', 0), (0, 0, '2')]
        assert expected_res == [
            parse_hour(h) for h in ["PT2H", "PT3H14", "PT2S"]
        ]