diff --git a/recommendations/WallRecommendations.py b/recommendations/WallRecommendations.py index 2fd93166..935ff96c 100644 --- a/recommendations/WallRecommendations.py +++ b/recommendations/WallRecommendations.py @@ -65,7 +65,7 @@ class WallRecommendations(Definitions): # Current logic: If the property is in a conservation area/heritage building/listed building or a flat, # it is not suitable for EWI - if (not self.property.restricted_measures) or (self.property.data["property-type"].lower() == "flat"): + if self.property.restricted_measures or (self.property.data["property-type"].lower() == "flat"): return False return True diff --git a/recommendations/tests/test_floor_recommendations.py b/recommendations/tests/test_floor_recommendations.py index 1632f468..f3df168f 100644 --- a/recommendations/tests/test_floor_recommendations.py +++ b/recommendations/tests/test_floor_recommendations.py @@ -70,7 +70,7 @@ solid_floor_insulation_parts = [ parts = suspended_floor_insulation_parts + solid_floor_insulation_parts -class TestWallRecommendations: +class TestFloorRecommendations: @pytest.fixture def input_properties(self): @@ -86,23 +86,20 @@ class TestWallRecommendations: property_mock.full_sap_epc = {"lodgement-date": "2000-01-01"} # or any date you want property_mock.data = {"construction-age-band": "1950"} # or any other data that fits your tests - mock_wall_rec_instance = FloorRecommendations(property_mock, "Decile 1", parts) + mock_wall_rec_instance = FloorRecommendations(property_mock, parts) return mock_wall_rec_instance def test_init(self, input_properties): obj = FloorRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=parts ) assert obj assert obj.property - assert obj.total_floor_area_group_decile == "Decile 1" def test_other_premises_below(self, input_properties): recommender = FloorRecommendations( property_instance=input_properties[0], - total_floor_area_group_decile="Decile 1", materials=parts ) recommender.recommend() @@ -119,16 +116,17 @@ class TestWallRecommendations: input_properties[2].floor_area = 50 input_properties[2].walls["is_park_home"] = False input_properties[2].age_band = "A" + input_properties[2].perimeter = 20 + input_properties[2].wall_type = "solid brick" recommender = FloorRecommendations( property_instance=input_properties[2], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None recommender.recommend() assert recommender.property.floor["is_suspended"] - assert recommender.estimated_u_value == 0.52 + assert recommender.estimated_u_value == 0.39 assert recommender.recommendations types = {part["type"] for x in recommender.recommendations for part in x["parts"]} @@ -143,7 +141,6 @@ class TestWallRecommendations: """ recommender = FloorRecommendations( property_instance=input_properties[3], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None @@ -161,17 +158,18 @@ class TestWallRecommendations: input_properties[4].floor_area = 100 input_properties[4].walls["is_park_home"] = False input_properties[4].age_band = "B" + input_properties[4].perimeter = 50 + input_properties[4].wall_type = "solid brick" recommender = FloorRecommendations( property_instance=input_properties[4], - total_floor_area_group_decile="Decile 1", materials=parts ) 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.63 + assert recommender.estimated_u_value == 0.71 assert recommender.recommendations types = {part["type"] for x in recommender.recommendations for part in x["parts"]} @@ -185,7 +183,6 @@ class TestWallRecommendations: recommender = FloorRecommendations( property_instance=input_properties[6], - total_floor_area_group_decile="Decile 1", materials=parts ) assert recommender.estimated_u_value is None diff --git a/recommendations/tests/test_recommendation_utils.py b/recommendations/tests/test_recommendation_utils.py index b3ea0141..eb1a5024 100644 --- a/recommendations/tests/test_recommendation_utils.py +++ b/recommendations/tests/test_recommendation_utils.py @@ -304,3 +304,32 @@ def test_estimate_perimeter_invalid_inputs(): recommendation_utils.estimate_perimeter(-100, 5) with pytest.raises(ValueError): recommendation_utils.estimate_perimeter(100, -5) + + +def test_solid_floor(): + assert math.isclose( + recommendation_utils.get_floor_u_value( + 'solid', 100, 40, 'A', 'stone', insulation_thickness="20mm" + ), + 0.4, rel_tol=1e-2) + + +def test_suspended_floor(): + assert math.isclose( + recommendation_utils.get_floor_u_value( + 'suspended', 100, 40, 'A', 'timber frame', insulation_thickness="20mm" + ), + 0.49, rel_tol=1e-2) + + +def test_invalid_floor_type(): + with pytest.raises(ValueError): + recommendation_utils.get_floor_u_value( + 'invalid_type', 100, 40, 'A', 'stone', insulation_thickness="20mm" + ) + + +def test_park_home(): + assert recommendation_utils.get_floor_u_value( + 'suspended', 100, 40, 'A', 'park home', insulation_thickness="20mm" + ) == 0 diff --git a/recommendations/tests/test_wall_recommendations.py b/recommendations/tests/test_wall_recommendations.py index 3f44de32..eeed8daf 100644 --- a/recommendations/tests/test_wall_recommendations.py +++ b/recommendations/tests/test_wall_recommendations.py @@ -11,12 +11,6 @@ from recommendations.recommendation_utils import is_diminishing_returns # os.path.abspath(os.path.dirname(__file__)) + "/recommendations/tests/test_data/input_properties.pkl", "rb" # ) as f: # input_properties = pickle.load(f) -# -# with open( -# os.path.abspath(os.path.dirname(__file__)) + "/recommendations/tests/test_data/uvalue_estimates.pkl", "rb" -# ) as f: -# uvalue_estimates = pickle.load(f) - external_wall_insulation_parts = [ { @@ -248,6 +242,9 @@ class TestWallRecommendations: already has really good insulation, we do NOT recommend any measures for this property """ input_properties[0].year_built = 2014 + input_properties[0].in_conservation_area = None + input_properties[0].restricted_measures = False + recommender = WallRecommendations( property_instance=input_properties[0], materials=wall_parts @@ -271,6 +268,7 @@ class TestWallRecommendations: input_properties[1].walls["clean_description"] = "Solid brick, as built, no insulation" input_properties[1].walls["is_sandstone_or_limestone"] = False input_properties[1].age_band = "A" + input_properties[1].restricted_measures = False recommender = WallRecommendations( property_instance=input_properties[1], @@ -307,6 +305,7 @@ class TestWallRecommendations: """ input_properties[6].year_built = 1991 + input_properties[6].restricted_measures = False recommender = WallRecommendations( property_instance=input_properties[6], materials=wall_parts @@ -383,6 +382,7 @@ class TestWallRecommendationsBase: property_mock = MagicMock(spec=Property) property_mock.full_sap_epc = {"lodgement-date": "1999-12-31"} property_mock.in_conservation_area = "not_in_conservation_area" + property_mock.restricted_measures = False return property_mock @pytest.fixture @@ -394,6 +394,7 @@ class TestWallRecommendationsBase: def test_ewi_valid_in_conservation_area(self, wall_recommendations_instance): wall_recommendations_instance.property.in_conservation_area = "in_conversation_area" + wall_recommendations_instance.property.restricted_measures = True assert wall_recommendations_instance.ewi_valid is False def test_ewi_valid_is_flat(self, wall_recommendations_instance): @@ -402,6 +403,7 @@ class TestWallRecommendationsBase: def test_ewi_valid_not_in_conservation_area_and_not_flat(self, wall_recommendations_instance): wall_recommendations_instance.property.in_conservation_area = "not_in_conversation_area" + wall_recommendations_instance.property.restricted_measures = False wall_recommendations_instance.property.data = {"property-type": "house"} assert wall_recommendations_instance.ewi_valid is True