diff --git a/domain/modelling/contingencies.py b/domain/modelling/contingencies.py index a184534d..37af47e6 100644 --- a/domain/modelling/contingencies.py +++ b/domain/modelling/contingencies.py @@ -8,6 +8,8 @@ extended as each measure type lands. _CONTINGENCY_RATES: dict[str, float] = { "cavity_wall_insulation": 0.10, "loft_insulation": 0.10, + "sloping_ceiling_insulation": 0.10, + "flat_roof_insulation": 0.10, "suspended_floor_insulation": 0.20, "solid_floor_insulation": 0.26, "mechanical_ventilation": 0.26, diff --git a/harness/sample_catalogue.json b/harness/sample_catalogue.json index 4d2851a2..e3ae97ec 100644 --- a/harness/sample_catalogue.json +++ b/harness/sample_catalogue.json @@ -1,6 +1,8 @@ { "cavity_wall_insulation": { "unit_cost_per_m2": 18.5 }, "loft_insulation": { "unit_cost_per_m2": 12.0 }, + "sloping_ceiling_insulation": { "unit_cost_per_m2": 40.0 }, + "flat_roof_insulation": { "unit_cost_per_m2": 60.0 }, "suspended_floor_insulation": { "unit_cost_per_m2": 25.0 }, "solid_floor_insulation": { "unit_cost_per_m2": 45.0 }, "mechanical_ventilation": { "unit_cost_per_m2": 450.0 }, diff --git a/tests/harness/test_console.py b/tests/harness/test_console.py index cd3ad9af..4ef5059c 100644 --- a/tests/harness/test_console.py +++ b/tests/harness/test_console.py @@ -9,6 +9,7 @@ import pytest from datatypes.epc.domain.epc import Epc from datatypes.epc.domain.epc_property_data import EpcPropertyData from domain.geospatial.planning_restrictions import PlanningRestrictions +from domain.modelling.contingencies import contingency_rate from harness.console import DEFAULT_CATALOGUE, run_modelling, run_one from repositories.product.product_json_repository import ProductJsonRepository from tests.domain.modelling._elmhurst_recommendation import ( @@ -25,6 +26,8 @@ _GENERATOR_MEASURE_TYPES = ( "external_wall_insulation", "internal_wall_insulation", "loft_insulation", + "sloping_ceiling_insulation", + "flat_roof_insulation", "suspended_floor_insulation", "solid_floor_insulation", "mechanical_ventilation", @@ -113,10 +116,12 @@ def test_sample_catalogue_prices_every_generator_measure_type() -> None: # Arrange — the default offline catalogue. products: ProductJsonRepository = ProductJsonRepository(DEFAULT_CATALOGUE) - # Act / Assert — get() raises if a Measure Type is unpriced, so an offline - # run over arbitrary EPCs never dies on a missing catalogue entry. + # Act / Assert — get() and contingency_rate() each raise on a missing + # Measure Type, so an offline run over arbitrary EPCs never dies on a + # missing catalogue or contingency entry. for measure_type in _GENERATOR_MEASURE_TYPES: products.get(measure_type) + contingency_rate(measure_type) def test_run_one_threads_a_current_market_value_onto_the_plan() -> None: