From 590decce612fa0458b73f5bcec198c4c034be2c7 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Tue, 27 Jun 2023 12:23:55 +0100 Subject: [PATCH] Added first floor recommendation tests --- model_data/BaseUtility.py | 1 + .../recommendations/FloorRecommendations.py | 9 ++- .../tests/test_floor_recommendations.py | 61 +++++++++++++++---- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/model_data/BaseUtility.py b/model_data/BaseUtility.py index c6934da1..6337f26a 100644 --- a/model_data/BaseUtility.py +++ b/model_data/BaseUtility.py @@ -12,6 +12,7 @@ class BaseUtility: # When the energy certificate was first lodged on the register there was no requirement to lodge this data # item, i.e. a non-mandatory item. "NO DATA!", + "NODATA!", # When the energy certificate was first lodged on the register there was no requirement to lodge this data item, # i.e.a non - mandatory item. "N/A", diff --git a/model_data/recommendations/FloorRecommendations.py b/model_data/recommendations/FloorRecommendations.py index 983c2274..1d15ad00 100644 --- a/model_data/recommendations/FloorRecommendations.py +++ b/model_data/recommendations/FloorRecommendations.py @@ -83,11 +83,13 @@ class FloorRecommendations(BaseUtility): PART_L_YEAR_CUTOFF = 2002 + # TODO: This is a placeholder methodology which isn't particularly scalable as more + # unusual floor descriptions are introduced FLOOR_LEVELS = { "Ground": 0, # We don't know what floor level, we just make sure it's not 0 "mid floor": 1, - "NODATA!": None + "4th": 4 } def __init__(self, property_instance: Property, uvalue_estimates: UvalueEstimations): @@ -178,7 +180,10 @@ class FloorRecommendations(BaseUtility): is_suspended = self.property.floor["is_suspended"] insulation_thickness = self.property.floor["insulation_thickness"] is_solid = self.property.floor["is_solid"] - floor_level = self.FLOOR_LEVELS[self.property.data["floor-level"]] + floor_level = ( + self.FLOOR_LEVELS[self.property.data["floor-level"]] if + self.property.data["floor-level"] not in self.DATA_ANOMALY_MATCHES else None + ) property_type = self.property.data["property-type"] year_built = self.property.year_built diff --git a/model_data/tests/test_floor_recommendations.py b/model_data/tests/test_floor_recommendations.py index e6d9b907..772c8649 100644 --- a/model_data/tests/test_floor_recommendations.py +++ b/model_data/tests/test_floor_recommendations.py @@ -5,17 +5,6 @@ from unittest.mock import Mock from model_data.recommendations.FloorRecommendations import FloorRecommendations -# with open( -# os.path.abspath(os.path.dirname(__file__)) + "/model_data/tests/test_data/input_properties.pkl", "rb" -# ) as f: -# input_properties = pickle.load(f) -# -# with open( -# os.path.abspath(os.path.dirname(__file__)) + "/model_data/tests/test_data/uvalue_estimates.pkl", "rb" -# ) as f: -# uvalue_estimates = pickle.load(f) - - class TestWallRecommendations: @pytest.fixture @@ -63,7 +52,55 @@ class TestWallRecommendations: :return: """ recommender = FloorRecommendations(property_instance=input_properties[2], uvalue_estimates=uvalue_estimates) + assert recommender.estimated_u_value is None recommender.recommend() assert recommender.property.floor["is_suspended"] - assert recommended.es + assert recommender.estimated_u_value == 0.8766389420265843 assert recommender.recommendations + + types = {part["type"] for x in recommender.recommendations for part in x["parts"]} + + assert types == {"suspended_floor_insulation"} + + def test_uvalue_0_12(self, input_properties, uvalue_estimates): + """ + This is a home that doesn't have a property below but it's highly performant already and therefore + does not need floor insulation + :return: + """ + recommender = FloorRecommendations(property_instance=input_properties[3], uvalue_estimates=uvalue_estimates) + assert recommender.estimated_u_value is None + recommender.recommend() + assert not recommender.property.floor["is_suspended"] + assert not recommender.property.floor["is_solid"] + assert recommender.estimated_u_value is None + assert not recommender.recommendations + + def test_solid_no_insulation(self, input_properties, uvalue_estimates): + """ + :return: + """ + recommender = FloorRecommendations(property_instance=input_properties[4], uvalue_estimates=uvalue_estimates) + assert recommender.estimated_u_value is None + recommender.recommend() + assert not recommender.property.floor["is_suspended"] + assert recommender.property.floor["is_solid"] + assert recommender.estimated_u_value == 0.7361642182695053 + assert recommender.recommendations + + types = {part["type"] for x in recommender.recommendations for part in x["parts"]} + + assert types == {"solid_floor_insulation"} + + def test_another_dwelling_below(self, input_properties, uvalue_estimates): + """ + This is another description we see when there is a property below + """ + input_properties[6].floor + recommender = FloorRecommendations(property_instance=input_properties[6], uvalue_estimates=uvalue_estimates) + assert recommender.estimated_u_value is None + recommender.recommend() + assert not recommender.property.floor["is_suspended"] + assert not recommender.property.floor["is_solid"] + assert recommender.estimated_u_value is None + assert not recommender.recommendations