cara/cern_caimira/tests/conftest.py
lrdossan cd3df90c4c Added dynamic groups in backend and propagated required changes to requests
- Correction of typos

- Changes do model to accommodate group of exposure models

- Handled virus validator to accommodate group of exposure models

- Modifications to accomodate generation of results for exposure model group

- Added data registry attribute to exposuremodelgroups class

- Fixed test for dynamic models

- Defined ExposureModelGroup with required methods

- Adapted virus report data to generate results for groups of exposed population

- Build same distributions for different models

- Fixed bug with defaults

- Handled definition of a single ExposureModel root obj when only one group is defined

- Added short-range expirations per group

- Added full validation on short_range interactions with dynamic exposure model

- Added full set of tests

- Updated docstrings

- Added support for number of people in exposed population, which should be identical within each group

- Added type checks

- Added UI adjustments for expected new cases

- Adapted exposed population data format to accommodate constant total_people
2025-03-19 15:45:05 +01:00

95 lines
3.3 KiB
Python

import pytest
from caimira.calculator.models import models
import caimira.calculator.models.data
import caimira.calculator.models.dataclass_utils
from caimira.calculator.validators.virus import virus_validator
from caimira.calculator.store.data_registry import DataRegistry
@pytest.fixture
def baseline_form_data():
return virus_validator.baseline_raw_form_data()
@pytest.fixture
def baseline_form(baseline_form_data, data_registry):
return virus_validator.VirusFormData.from_dict(baseline_form_data, data_registry)
@pytest.fixture
def data_registry():
return DataRegistry()
@pytest.fixture
def baseline_concentration_model(data_registry):
model = models.ConcentrationModel(
data_registry=data_registry,
room=models.Room(
volume=75, inside_temp=models.PiecewiseConstant((0., 24.), (293,))),
ventilation=models.AirChange(
active=models.SpecificInterval(((0., 24.), )),
air_exch=30.,
),
infected=models.EmittingPopulation(
data_registry=data_registry,
number=1,
virus=models.Virus.types['SARS_CoV_2'],
presence=models.SpecificInterval(((0., 4.), (5., 8.))),
mask=models.Mask.types['No mask'],
activity=models.Activity.types['Light activity'],
known_individual_emission_rate=970 * 50,
host_immunity=0.,
# Superspreading event, where ejection factor is fixed based
# on Miller et al. (2020) - 50 represents the infectious dose.
),
evaporation_factor=0.3,
)
return model
@pytest.fixture
def baseline_sr_model():
return ()
@pytest.fixture
def baseline_exposure_model(data_registry, baseline_concentration_model, baseline_sr_model):
return models.ExposureModel(
data_registry=data_registry,
concentration_model=baseline_concentration_model,
short_range=baseline_sr_model,
exposed=models.Population(
number=1000,
presence=baseline_concentration_model.infected.presence,
activity=baseline_concentration_model.infected.activity,
mask=baseline_concentration_model.infected.mask,
host_immunity=0.,
),
geographical_data=models.Cases(),
)
@pytest.fixture
def exposure_model_w_outside_temp_changes(data_registry, baseline_exposure_model: models.ExposureModel):
exp_model = caimira.calculator.models.dataclass_utils.nested_replace(
baseline_exposure_model, {
'concentration_model.ventilation': models.SlidingWindow(
data_registry=data_registry,
active=models.PeriodicInterval(2.2 * 60, 1.8 * 60),
outside_temp=caimira.calculator.models.data.GenevaTemperatures['Jan'],
window_height=1.6,
opening_length=0.6,
)
})
return exp_model
@pytest.fixture
def baseline_form_with_sr(baseline_form_data, data_registry):
form_data_sr = baseline_form_data
form_data_sr['short_range_option'] = 'short_range_yes'
form_data_sr['short_range_interactions'] = '{"group_1": [{"expiration": "Shouting", "start_time": "10:30", "duration": 30}]}'
form_data_sr['short_range_occupants'] = 5
return virus_validator.VirusFormData.from_dict(form_data_sr, data_registry)