|
| 1 | +from collections.abc import AsyncGenerator |
| 2 | +from dataclasses import dataclass |
| 3 | +from uuid import UUID |
| 4 | + |
| 5 | +import pytest |
| 6 | +from httpx import Response |
| 7 | +from litestar.testing import AsyncTestClient |
| 8 | + |
| 9 | +from src.model.observed_variable import ObservedVariable, ObservedVariableDataclass |
| 10 | +from src.model.vocabulary import Vocabulary |
| 11 | +from tests.helpers import delete_fixture, post_fixture, put_fixture |
| 12 | +from tests.router.study.fixture import AllStudyFixtureResponse |
| 13 | + |
| 14 | + |
| 15 | +@dataclass |
| 16 | +class ObservedVariableResponse: |
| 17 | + observed_variable_response: Response |
| 18 | + study_response: list[Response] |
| 19 | + |
| 20 | + |
| 21 | +@dataclass |
| 22 | +class AllObservedVariableFixtureResponse: |
| 23 | + projected_shoot_area: ObservedVariableResponse |
| 24 | + zn_concentration: ObservedVariableResponse |
| 25 | + |
| 26 | + |
| 27 | +@dataclass |
| 28 | +class VariableReferenceResponse: |
| 29 | + anthesis: Response |
| 30 | + |
| 31 | + |
| 32 | +@dataclass |
| 33 | +class VariableTraitResponse: |
| 34 | + anthesis: Response |
| 35 | + reproductive_growth_time: Response |
| 36 | + projected_shoot_area: Response |
| 37 | + zn_concentration: Response |
| 38 | + |
| 39 | + |
| 40 | +PATH = "observed_variable" |
| 41 | +ANTHESIS_TRAIT = Vocabulary(title="Anthesis time", accession_number="CO_322:0000030") |
| 42 | +REPRODUCTIVE_GROWTH_TIME_TRAIT = Vocabulary(title="Reproductive growth time", accession_number="TO:0000366") |
| 43 | +PROJECTED_SHOOT_AREA_TRAIT = Vocabulary(title="Projected shoot area") |
| 44 | +ZN_CONCENTRATION_TRAIT = Vocabulary(title="Zn concentration", accession_number="CDNO_0200170") |
| 45 | + |
| 46 | +ANTHESIS_VARIABLE = ObservedVariable(title="Ant_Cmp_Cday", description="Anthesis computed in growing degree days") |
| 47 | +PROJECTED_SHOOT_AREA_VARIABLE = ObservedVariable(title="PSA_img_kpixels") |
| 48 | +ZN_CONCENTRATION_VARIABLE = ObservedVariable(title="Zn_conc") |
| 49 | + |
| 50 | + |
| 51 | +async def get_observed_variable_fixture( |
| 52 | + data: ObservedVariable, studies: list[Response], test_client: AsyncTestClient, id: UUID | None = None |
| 53 | +) -> ObservedVariableResponse: |
| 54 | + study_id = [item.json()["id"] for item in studies] |
| 55 | + send_data = ObservedVariableDataclass(study_id=study_id, **data.to_dict()) |
| 56 | + if id is None: |
| 57 | + send_data.updated_at = None |
| 58 | + response = await post_fixture(PATH, send_data, test_client) |
| 59 | + else: |
| 60 | + response = await put_fixture(PATH, send_data, test_client, id) |
| 61 | + return ObservedVariableResponse(study_response=studies, observed_variable_response=response) |
| 62 | + |
| 63 | + |
| 64 | +@pytest.fixture(scope="function") |
| 65 | +async def setup_observed_variable( |
| 66 | + setup_study: AllStudyFixtureResponse, test_client: AsyncTestClient |
| 67 | +) -> AsyncGenerator[AllObservedVariableFixtureResponse, None]: |
| 68 | + maize_study = setup_study.maize.study_response |
| 69 | + barley_study = setup_study.barley.study_response |
| 70 | + maize_sowing_density = await get_observed_variable_fixture( |
| 71 | + MAIZE_SOWING_DENSITY, [maize_study, barley_study], test_client |
| 72 | + ) |
| 73 | + maize_rooting_medium = await get_observed_variable_fixture(MAIZE_ROOTING_MEDIUM, [maize_study], test_client) |
| 74 | + maize_ph = await get_observed_variable_fixture(MAIZE_PH, [maize_study], test_client) |
| 75 | + barley_sowing_density = await get_observed_variable_fixture(BARLEY_SOWING_DENSITY, [barley_study], test_client) |
| 76 | + barley_rooting_medium = await get_observed_variable_fixture(BARLEY_ROOTING_MEDIUM, [barley_study], test_client) |
| 77 | + barley_ferterlizer = await get_observed_variable_fixture(BARLEY_FERTILIZER, [barley_study], test_client) |
| 78 | + barley_watering_exposure = await get_observed_variable_fixture( |
| 79 | + BARLEY_WATERING_EXPOSURE, [barley_study], test_client |
| 80 | + ) |
| 81 | + barley_light_intensity = await get_observed_variable_fixture(BARLEY_LIGHT_INTENSITY, [barley_study], test_client) |
| 82 | + barley_relative_humidity = await get_observed_variable_fixture( |
| 83 | + BARLEY_RELATIVE_HUMIDITY, [barley_study], test_client |
| 84 | + ) |
| 85 | + barley_temperature = await get_observed_variable_fixture(BARLEY_TEMPERATURE, [barley_study], test_client) |
| 86 | + |
| 87 | + yield AllObservedVariableFixtureResponse( |
| 88 | + maize_sowing_density=maize_sowing_density, |
| 89 | + maize_rooting_medium=maize_rooting_medium, |
| 90 | + maize_ph=maize_ph, |
| 91 | + barley_sowing_density=barley_sowing_density, |
| 92 | + barley_rooting_medium=barley_rooting_medium, |
| 93 | + barley_fertilizer=barley_ferterlizer, |
| 94 | + barley_watering_exposure=barley_watering_exposure, |
| 95 | + barley_light_intensity=barley_light_intensity, |
| 96 | + barley_relative_humidity=barley_relative_humidity, |
| 97 | + barley_temperature=barley_temperature, |
| 98 | + study_response=setup_study, |
| 99 | + ) |
| 100 | + await delete_fixture(PATH, maize_sowing_density.observed_variable_response.json()["id"], test_client) |
| 101 | + await delete_fixture(PATH, maize_rooting_medium.observed_variable_response.json()["id"], test_client) |
| 102 | + await delete_fixture(PATH, maize_ph.observed_variable_response.json()["id"], test_client) |
| 103 | + await delete_fixture(PATH, barley_sowing_density.observed_variable_response.json()["id"], test_client) |
| 104 | + await delete_fixture(PATH, barley_rooting_medium.observed_variable_response.json()["id"], test_client) |
| 105 | + await delete_fixture(PATH, barley_ferterlizer.observed_variable_response.json()["id"], test_client) |
| 106 | + await delete_fixture(PATH, barley_watering_exposure.observed_variable_response.json()["id"], test_client) |
| 107 | + await delete_fixture(PATH, barley_light_intensity.observed_variable_response.json()["id"], test_client) |
| 108 | + await delete_fixture(PATH, barley_relative_humidity.observed_variable_response.json()["id"], test_client) |
| 109 | + await delete_fixture(PATH, barley_temperature.observed_variable_response.json()["id"], test_client) |
| 110 | + |
| 111 | + |
| 112 | +@pytest.fixture(scope="function") |
| 113 | +async def update_observed_variable( |
| 114 | + setup_observed_variable: AllObservedVariableFixtureResponse, test_client: AsyncTestClient |
| 115 | +) -> AsyncGenerator[AllObservedVariableFixtureResponse, None]: |
| 116 | + all_responses = setup_observed_variable |
| 117 | + maize_study = all_responses.study_response.maize.study_response |
| 118 | + maize_sowing_density = all_responses.maize_sowing_density |
| 119 | + maize_sowing_density_response = await get_observed_variable_fixture( |
| 120 | + MAIZE_SOWING_DENSITY, [maize_study], test_client, maize_sowing_density.observed_variable_response.json()["id"] |
| 121 | + ) |
| 122 | + all_responses.maize_sowing_density = maize_sowing_density_response |
| 123 | + yield all_responses |
0 commit comments