mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
105 lines
4.9 KiB
Python
105 lines
4.9 KiB
Python
import pandas as pd
|
|
import numpy as np
|
|
import pytest
|
|
from backend.Property import Property
|
|
from etl.epc.Record import EPCRecord
|
|
from recommendations.tests.test_data.materials import materials
|
|
from recommendations.SolarPvRecommendations import SolarPvRecommendations
|
|
|
|
|
|
class TestSolarPvRecommendations:
|
|
@pytest.fixture
|
|
def property_instance_invalid_type(self):
|
|
# Setup the property_instance with an invalid property type
|
|
epc_record = EPCRecord()
|
|
epc_record.property_type = "InvalidType"
|
|
epc_record.county = "Broxbourne"
|
|
epc_record.photo_supply = None
|
|
property_instance_invalid_type = Property(id=1, address="", postcode="", epc_record=epc_record)
|
|
property_instance_invalid_type.roof = {"is_flat": False, "is_pitched": False, "is_roof_room": False}
|
|
property_instance_invalid_type.already_installed = []
|
|
return property_instance_invalid_type
|
|
|
|
@pytest.fixture
|
|
def property_instance_invalid_roof(self):
|
|
# Setup the property_instance with invalid roof type
|
|
epc_record = EPCRecord()
|
|
epc_record.county = "Huntingdonshire"
|
|
epc_record.property_type = "House"
|
|
epc_record.photo_supply = None
|
|
property_instance_invalid_roof = Property(id=1, address="", postcode="", epc_record=epc_record)
|
|
property_instance_invalid_roof.roof = {
|
|
"is_flat": False, "is_pitched": False, "is_roof_room": False, "thermal_transmittance": None
|
|
}
|
|
property_instance_invalid_roof.already_installed = []
|
|
return property_instance_invalid_roof
|
|
|
|
@pytest.fixture
|
|
def property_instance_has_solar_pv(self):
|
|
# Setup the property_instance with existing solar pv
|
|
epc_record = EPCRecord()
|
|
epc_record.photo_supply = 40.0 # Use float, not string
|
|
epc_record.county = "Huntingdonshire"
|
|
epc_record.property_type = "House"
|
|
property_instance_has_solar_pv = Property(id=1, address="", postcode="", epc_record=epc_record)
|
|
property_instance_has_solar_pv.roof = {"is_flat": True, "thermal_transmittance": None}
|
|
property_instance_has_solar_pv.already_installed = []
|
|
return property_instance_has_solar_pv
|
|
|
|
@pytest.fixture
|
|
def property_instance_valid_all(self):
|
|
# Setup a valid property_instance that passes all conditions
|
|
epc_record = EPCRecord()
|
|
epc_record.property_type = "House"
|
|
epc_record.photo_supply = None
|
|
epc_record.county = "Huntingdonshire"
|
|
property_instance_valid_all = Property(id=1, address="", postcode="", epc_record=epc_record)
|
|
property_instance_valid_all.roof_area = 40
|
|
property_instance_valid_all.number_of_floors = 2
|
|
property_instance_valid_all.roof = {"is_flat": True, "thermal_transmittance": None}
|
|
property_instance_valid_all.already_installed = []
|
|
property_instance_valid_all.solar_panel_configuration = {
|
|
"panel_performance": pd.DataFrame(
|
|
[
|
|
{
|
|
"panneled_roof_area": 20,
|
|
"n_panels": 10,
|
|
"array_wattage": 4000,
|
|
"initial_ac_kwh_per_year": 3800
|
|
}
|
|
]
|
|
)
|
|
}
|
|
|
|
return property_instance_valid_all
|
|
|
|
def test_invalid_property_type(self, property_instance_invalid_type):
|
|
solar_pv = SolarPvRecommendations(property_instance_invalid_type, materials=materials)
|
|
solar_pv.recommend(phase=0)
|
|
assert not solar_pv.recommendation
|
|
|
|
def test_invalid_roof_type(self, property_instance_invalid_roof):
|
|
solar_pv = SolarPvRecommendations(property_instance_invalid_roof, materials=materials)
|
|
solar_pv.recommend(phase=0)
|
|
assert not solar_pv.recommendation
|
|
|
|
def test_existing_solar_pv(self, property_instance_has_solar_pv):
|
|
solar_pv = SolarPvRecommendations(property_instance_has_solar_pv, materials=materials)
|
|
solar_pv.recommend(phase=0)
|
|
assert not solar_pv.recommendation
|
|
|
|
def test_valid_all_conditions(self, property_instance_valid_all):
|
|
solar_pv = SolarPvRecommendations(property_instance_valid_all, materials=materials)
|
|
solar_pv.recommend(phase=0)
|
|
assert len(solar_pv.recommendation) == 11
|
|
assert solar_pv.recommendation[0]["description"] == '10 panel system, 400W solar panels - 4.0 kWp system'
|
|
assert not solar_pv.recommendation[0]["has_battery"]
|
|
assert solar_pv.recommendation[0]["initial_ac_kwh_per_year"] == np.int64(3800)
|
|
assert solar_pv.recommendation[0]["description_simulation"] == {'photo-supply': np.float64(50.0)}
|
|
assert solar_pv.recommendation[0]["simulation_config"] == {'photo_supply_ending': np.float64(50.0)}
|
|
|
|
assert (
|
|
solar_pv.recommendation[1]["description"] ==
|
|
'10 panel system, 400W solar panels, 5.8kw Growatt battery - 4.0 kWp system'
|
|
)
|
|
assert solar_pv.recommendation[1]["has_battery"]
|