mirror of
https://github.com/flobz/psa_car_controller.git
synced 2026-08-24 02:16:14 +00:00
refacto structure
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import os
|
||||
import unittest
|
||||
from configparser import ConfigParser
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from configupdater import ConfigUpdater
|
||||
|
||||
from common.mylogger import my_logger
|
||||
from psacc.repository.config_repository import ConfigRepository
|
||||
|
||||
|
||||
class TestUnit(unittest.TestCase):
|
||||
def test_read_config(self):
|
||||
config = ConfigRepository.read_config()
|
||||
|
||||
def test_read_old_config(self):
|
||||
old_config = ConfigUpdater()
|
||||
old_config_str = """[General]
|
||||
currency = €
|
||||
|
||||
[Electricity config]
|
||||
day price = 42
|
||||
night price = 0.1
|
||||
night hour start = 1h00
|
||||
night hour end = 4h42
|
||||
|
||||
"""
|
||||
ConfigRepository._read_file = MagicMock(return_value=old_config_str)
|
||||
ConfigRepository._write = MagicMock()
|
||||
conf = ConfigRepository.read_config()
|
||||
conf.write_config(conf)
|
||||
config_written: ConfigParser = ConfigRepository._write.call_args_list[0][0][1]
|
||||
self.assertEqual(config_written["General"]["currency"].value, "€")
|
||||
self.assertEqual(config_written["Electricity config"]["day price"].value, 42)
|
||||
print(config_written)
|
||||
|
||||
def test_read_non_existent_config(self):
|
||||
self.assertRaises(FileNotFoundError, lambda :ConfigRepository._read_file("nonexistent.ini"))
|
||||
|
||||
def test_read_config_non_existent_config(self):
|
||||
result = ConfigRepository.read_config("nonexistent.ini")
|
||||
expected_result = ConfigRepository.config_file_to_dto(ConfigRepository.get_default_config())
|
||||
self.assertEqual(result,expected_result)
|
||||
|
||||
if __name__ == '__main__':
|
||||
my_logger(handler_level=os.environ.get("DEBUG_LEVEL", 20))
|
||||
unittest.main()
|
||||
+55
-38
@@ -4,28 +4,30 @@ import os
|
||||
import unittest
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import reverse_geocode
|
||||
from pytz import UTC
|
||||
|
||||
import libs.config
|
||||
from libs.psa.setup.app_decoder import GITHUB_USER, GITHUB_REPO
|
||||
from libs.psa.setup.github import github_file_need_to_be_downloaded
|
||||
from psa_connectedcar import ApiClient
|
||||
import psa_connectedcar as psacc
|
||||
import reverse_geocode
|
||||
from libs.car import Car, Cars
|
||||
from libs.charging import Charging
|
||||
from libs.elec_price import ElecPrice
|
||||
from my_psacc import MyPSACC
|
||||
from ecomix import Ecomix
|
||||
from libs.car_model import CarModel
|
||||
from mylogger import my_logger
|
||||
from otp.otp import load_otp, save_otp
|
||||
from charge_control import ChargeControls
|
||||
from test.utils import DATA_DIR, record_position, latitude, longitude, date0, date1, date2, date3, record_charging, \
|
||||
import psa.connected_car_api
|
||||
|
||||
from common.mylogger import my_logger
|
||||
from common.utils import parse_hour, RateLimitException, rate_limit
|
||||
from psa.otp.otp import load_otp, save_otp
|
||||
from psa.setup.app_decoder import get_content_from_apk, GITHUB_USER, GITHUB_REPO
|
||||
from psa.setup.github import github_file_need_to_be_downloaded
|
||||
from psa.connected_car_api import ApiClient
|
||||
from psacc.application.charge_control import ChargeControls
|
||||
from psacc.application.charging import Charging
|
||||
from psacc.application.ecomix import Ecomix
|
||||
from psacc.application.psa_client import PSAClient
|
||||
from psacc.model.car import Car, Cars
|
||||
from psacc.repository import config_repository
|
||||
from psacc.repository.car_model import CarModelRepository
|
||||
from psacc.repository.config_repository import ConfigRepository
|
||||
from psacc.repository.db import Database
|
||||
from psacc.repository.trips import Trips
|
||||
from psacc.utils.utils import get_temp
|
||||
from utils import DATA_DIR, record_position, latitude, longitude, date0, date1, date2, date3, record_charging, \
|
||||
vehicule_list, get_new_test_db, get_date, date4
|
||||
from trip import Trips
|
||||
from libs.utils import get_temp, parse_hour, rate_limit, RateLimitException
|
||||
from web.db import Database
|
||||
from web.figures import get_figures, get_battery_curve_fig, get_altitude_fig
|
||||
from deepdiff import DeepDiff
|
||||
|
||||
@@ -65,21 +67,19 @@ class TestUnit(unittest.TestCase):
|
||||
|
||||
def test_mypsacc(self):
|
||||
if self.test_online:
|
||||
myp = MyPSACC.load_config("config.json")
|
||||
myp = PSAClient.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.get_vehicle_info(myp.vehicles_list[0].vin)
|
||||
myp.abrp.call(car, 22.1)
|
||||
libs.config.Config().myp = myp
|
||||
libs.config.Config().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"
|
||||
assert CarModelRepository().find_model_by_vin("VR3UHZKXZL").name == "e-208"
|
||||
assert CarModelRepository().find_model_by_vin("VR3UKZKXZM").name == "e-2008"
|
||||
assert CarModelRepository().find_model_by_vin("VXKUHZKXZL").name == "corsa-e"
|
||||
|
||||
def test_c02_signal_cache(self):
|
||||
start = datetime.utcnow().replace(tzinfo=UTC) - timedelta(minutes=30)
|
||||
@@ -89,6 +89,8 @@ class TestUnit(unittest.TestCase):
|
||||
[start + timedelta(minutes=2), 20],
|
||||
[start + timedelta(minutes=3), 30]]}
|
||||
assert Ecomix.get_co2_from_signal_cache(start, end, "FR") == 20
|
||||
Ecomix.clean_cache()
|
||||
self.assertEqual(3, len(Ecomix._cache["FR"]))
|
||||
|
||||
def test_c02_signal(self):
|
||||
if self.test_online:
|
||||
@@ -106,10 +108,25 @@ class TestUnit(unittest.TestCase):
|
||||
charge_control.save_config(force=True)
|
||||
|
||||
def test_battery_curve(self):
|
||||
vin = self.vehicule_list[0].vin
|
||||
get_new_test_db()
|
||||
record_charging()
|
||||
res = Database.get_battery_curve(Database.get_db(), date0, date4, self.vehicule_list[0].vin)
|
||||
assert len(res) == 3
|
||||
charge = Database.get_last_charge(vin)
|
||||
self.assertEqual(charge.stop_at, date4)
|
||||
res = Database.get_battery_curve(Database.get_db(), date0, date4, vin)
|
||||
self.assertEqual(4, len(res))
|
||||
|
||||
def test_set_charge_price(self):
|
||||
vin = self.vehicule_list[0].vin
|
||||
get_new_test_db()
|
||||
record_charging()
|
||||
charge = Database.get_last_charge(vin)
|
||||
charge.price = 42
|
||||
conn = Database.get_db()
|
||||
Database.set_chargings_price(conn, charge)
|
||||
conn.close()
|
||||
res = Database.get_charge(vin, charge.start_at)
|
||||
self.assertEqual(charge.price, res.price)
|
||||
|
||||
def test_sdk(self):
|
||||
res = {
|
||||
@@ -133,13 +150,13 @@ class TestUnit(unittest.TestCase):
|
||||
'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")
|
||||
status: psa.connected_car_api.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"
|
||||
get_new_test_db()
|
||||
car = Car("XX", "vid", "Peugeot")
|
||||
car.status = status
|
||||
myp = MyPSACC.load_config(DATA_DIR + "config.json")
|
||||
myp = PSAClient.load_config(DATA_DIR + "config.json")
|
||||
myp.record_info(car)
|
||||
assert "features" in json.loads(Database.get_recorded_position())
|
||||
# electric should be first
|
||||
@@ -147,7 +164,7 @@ class TestUnit(unittest.TestCase):
|
||||
|
||||
def test_record_position_charging(self):
|
||||
get_new_test_db()
|
||||
ElecPrice.CONFIG_FILENAME = DATA_DIR + "config.ini"
|
||||
config_repository.CONFIG_FILENAME = DATA_DIR + "config.ini"
|
||||
car = self.vehicule_list[0]
|
||||
record_position()
|
||||
Database.add_altitude_to_db(Database.get_db())
|
||||
@@ -164,7 +181,7 @@ class TestUnit(unittest.TestCase):
|
||||
'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()
|
||||
Charging.elec_price = ConfigRepository.read_config(DATA_DIR + "config.ini").Electricity_config
|
||||
start_level = 40
|
||||
end_level = 85
|
||||
Charging.record_charging(car, "InProgress", date0, start_level, latitude, longitude, None, "slow", 20, 60)
|
||||
@@ -188,12 +205,13 @@ class TestUnit(unittest.TestCase):
|
||||
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
|
||||
battery_curve_fix = get_battery_curve_fig(row, car)
|
||||
assert battery_curve_fix is not None
|
||||
assert get_altitude_fig(trip) is not None
|
||||
|
||||
def test_fuel_car(self):
|
||||
get_new_test_db()
|
||||
ElecPrice.CONFIG_FILENAME = DATA_DIR + "config.ini"
|
||||
config_repository.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)
|
||||
@@ -212,11 +230,11 @@ class TestUnit(unittest.TestCase):
|
||||
'altitude_diff': 0,
|
||||
'id': 1,
|
||||
'consumption': 1.32,
|
||||
'consumption_fuel_km': 10.53}])
|
||||
'consumption_fuel_km': 4.53}])
|
||||
|
||||
def test_none_mileage(self):
|
||||
get_new_test_db()
|
||||
ElecPrice.CONFIG_FILENAME = DATA_DIR + "config.ini"
|
||||
config_repository.CONFIG_FILENAME = DATA_DIR + "config.ini"
|
||||
car = self.vehicule_list[1]
|
||||
Database.record_position(None, car.vin, None, latitude, longitude, 22, get_date(1), 40, 30, False)
|
||||
Database.record_position(None, car.vin, None, latitude, longitude, 22, get_date(2), 35, 29, False)
|
||||
@@ -241,7 +259,7 @@ class TestUnit(unittest.TestCase):
|
||||
'altitude_diff': 0,
|
||||
'id': 1,
|
||||
'consumption': 1.32,
|
||||
'consumption_fuel_km': 10.53}])
|
||||
'consumption_fuel_km': 4.53}])
|
||||
|
||||
def test_db_callback(self):
|
||||
old_dummy_value = dummy_value
|
||||
@@ -269,7 +287,6 @@ class TestUnit(unittest.TestCase):
|
||||
pass
|
||||
|
||||
def test_parse_apk(self):
|
||||
from libs.psa.setup.app_decoder import get_content_from_apk
|
||||
filename = "mypeugeot.apk"
|
||||
try:
|
||||
os.remove(filename)
|
||||
|
||||
+4
-3
@@ -5,9 +5,9 @@ from datetime import timedelta, datetime
|
||||
|
||||
import pytz
|
||||
|
||||
from libs.car import Car, Cars
|
||||
from libs.charging import Charging
|
||||
from web.db import Database
|
||||
from psacc.application.charging import Charging
|
||||
from psacc.model.car import Cars, Car
|
||||
from psacc.repository.db import Database
|
||||
|
||||
DATA_DIR = os.path.dirname(os.path.realpath(__file__)) + "/data/"
|
||||
latitude = 47.2183
|
||||
@@ -40,6 +40,7 @@ def record_position():
|
||||
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.record_position(None, car.vin, None, latitude, longitude, 42, date2, 30, None, False)
|
||||
|
||||
|
||||
def record_charging():
|
||||
|
||||
Reference in New Issue
Block a user