Skip to content

Commit

Permalink
feat(api): added unit testing to update_multiple_links (api)
Browse files Browse the repository at this point in the history
  • Loading branch information
mehdiwahada committed Feb 25, 2025
1 parent a4c5de8 commit aacda26
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 23 deletions.
6 changes: 6 additions & 0 deletions src/antares/craft/exceptions/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@ def __init__(self, study_id: str, message: str) -> None:
super().__init__(self.message)


class LinksUpdateError(Exception):
def __init__(self, study_id: str, message: str) -> None:
self.message = f"Could not update links from study {study_id} : {message}"
super().__init__(self.message)


class ThermalCreationError(Exception):
def __init__(self, thermal_name: str, area_id: str, message: str) -> None:
self.message = f"Could not create the thermal cluster {thermal_name} inside area {area_id}: " + message
Expand Down
13 changes: 0 additions & 13 deletions src/antares/craft/model/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,6 @@ class LinkProperties:
filter_synthesis: comma_separated_enum_set = field(default_factory=lambda: FILTER_VALUES)
filter_year_by_year: comma_separated_enum_set = field(default_factory=lambda: FILTER_VALUES)

def update_link_properties(self, link_props: LinkPropertiesUpdate) -> "LinkProperties":
self.hurdles_cost = link_props.hurdles_cost
self.loop_flow = link_props.loop_flow
self.use_phase_shifter = link_props.use_phase_shifter
self.transmission_capacities = link_props.transmission_capacities
self.asset_type = link_props.asset_type
self.display_comments = link_props.display_comments
self.comments = link_props.comments
self.filter_synthesis = link_props.filter_synthesis
self.filter_year_by_year = link_props.filter_year_by_year

return self


@dataclass
class LinkUi:
Expand Down
10 changes: 6 additions & 4 deletions src/antares/craft/model/study.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,12 @@ def generate_thermal_timeseries(self, nb_years: int) -> None:
self._study_service.generate_thermal_timeseries(nb_years)
self._settings.general_parameters.nb_timeseries_thermal = nb_years

def update_multiple_links(self, dict_links: Dict[str, LinkPropertiesUpdate]) -> None:
new_links_props = self._link_service.update_multiple_links(dict_links)
# parcourir les nouvelles properties et changer les links de la study
for link_props in new_links_props:
self._links[link_props]._properties = new_links_props[link_props]


# Design note:
# all following methods are entry points for study creation.
Expand Down Expand Up @@ -311,7 +317,3 @@ def create_variant_api(api_config: APIconf, study_id: str, variant_name: str) ->
from antares.craft.service.api_services.factory import create_variant_api

return create_variant_api(api_config, study_id, variant_name)


def update_multiple_links(dict_links: Dict[str, LinkPropertiesUpdate]) -> None:
pass
25 changes: 21 additions & 4 deletions src/antares/craft/service/api_services/services/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
LinkDownloadError,
LinkPropertiesUpdateError,
LinksRetrievalError,
LinksUpdateError,
LinkUiUpdateError,
LinkUploadError,
)
Expand Down Expand Up @@ -206,8 +207,24 @@ def read_links(self) -> list[Link]:
return links

@override
def update_multiple_links(self) -> Dict[str, LinkPropertiesUpdate]:
url = f"{self._base_url}/studies/{self.study_id}/table-mode/links"
self._wrapper.put(url)
def update_multiple_links(self, dict_links: Dict[str, LinkPropertiesUpdate]) -> Dict[str, LinkProperties]:
try:
url = f"{self._base_url}/studies/{self.study_id}/table-mode/links"
links = self._wrapper.put(url, dict_links).json()
updated_links: Dict[str, LinkProperties] = {}

for link in links:
links[link].pop("area1")
links[link].pop("area2")
links[link].pop("colorr")
links[link].pop("colorb")
links[link].pop("colorg")
links[link].pop("linkWidth")
links[link].pop("linkStyle")

updated_links.update({link: links[link]})

except APIError as e:
raise LinksUpdateError(self.study_id, e.message) from e

raise NotImplementedError
return updated_links
2 changes: 1 addition & 1 deletion src/antares/craft/service/base_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ def create_capacity_indirect(self, series: pd.DataFrame, area_from: str, area_to
pass

@abstractmethod
def update_multiple_links(self) -> Dict[str, LinkPropertiesUpdate]:
def update_multiple_links(self, dict_links: Dict[str, LinkPropertiesUpdate]) -> Dict[str, LinkProperties]:
pass


Expand Down
2 changes: 1 addition & 1 deletion src/antares/craft/service/local_services/services/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,5 +203,5 @@ def read_links(self) -> list[Link]:
return link_clusters

@override
def update_multiple_links(self) -> Dict[str, LinkPropertiesUpdate]:
def update_multiple_links(self, dict_links: Dict[str, LinkPropertiesUpdate]) -> Dict[str, LinkProperties]:
raise NotImplementedError
92 changes: 92 additions & 0 deletions tests/antares/services/api_services/test_study_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
# SPDX-License-Identifier: MPL-2.0
#
# This file is part of the Antares project.

import pytest
import requests_mock

Expand All @@ -28,6 +29,7 @@
BindingConstraintCreationError,
ConstraintRetrievalError,
LinkCreationError,
LinksUpdateError,
OutputDeletionError,
OutputsRetrievalError,
SimulationFailedError,
Expand Down Expand Up @@ -75,6 +77,25 @@ class TestCreateAPI:
services.renewable_service,
services.hydro_service,
)
area_1 = Area(
"area_test_1",
services.area_service,
services.short_term_storage_service,
services.thermal_service,
services.renewable_service,
services.hydro_service,
)
area_2 = Area(
"area_test_2",
services.area_service,
services.short_term_storage_service,
services.thermal_service,
services.renewable_service,
services.hydro_service,
)

first_link = Link(area.id, area_1.id, services.link_service)
second_link = Link(area.id, area_2.id, services.link_service)

def test_create_study_test_ok(self) -> None:
with requests_mock.Mocker() as mocker:
Expand Down Expand Up @@ -802,3 +823,74 @@ def test_import_study_fail_api_error(self, tmp_path):
StudyImportError, match=f"Could not import the study test.zip : {self.antares_web_description_msg}"
):
import_study_api(self.api, study_path)

def test_update_multiple_links_success(self):
url = f"https://antares.com/api/v1/studies/{self.study_id}/table-mode/links"
json_update_links = {
"area_test / area_test_1": {
"hurdlesCost": "false",
"loopFlow": "false",
"usePhaseShifter": "false",
"transmissionCapacities": "enabled",
"assetType": "virt",
"displayComments": "true",
"comments": "",
"colorr": 255,
"colorb": 128,
"colorg": 0,
"linkWidth": 2,
"linkStyle": "dotdash",
"filterSynthesis": "hourly, daily, weekly, monthly, annual",
"filterYearByYear": "hourly, daily, weekly, monthly, annual",
"area1": "area_test",
"area2": "area_test_1",
},
"area_test / area_test_2": {
"hurdlesCost": "false",
"loopFlow": "false",
"usePhaseShifter": "false",
"transmissionCapacities": "enabled",
"assetType": "virt",
"displayComments": "true",
"comments": "",
"colorr": 255,
"colorb": 128,
"colorg": 0,
"linkWidth": 2,
"linkStyle": "dotdash",
"filterSynthesis": "hourly, daily, weekly, monthly, annual",
"filterYearByYear": "hourly, daily, weekly, monthly, annual",
"area1": "area_test",
"area2": "area_test_2",
},
}

updated_links = {}
self.study._areas["area_test"] = self.area
self.study._areas["area_test_1"] = self.area_1
self.study._areas["area_test_2"] = self.area_2

self.study._links["area_test / area_test_1"] = self.first_link
self.study._links["area_test / area_test_2"] = self.second_link

with requests_mock.Mocker() as mocker:
for link in json_update_links:
updated_links.update({link: json_update_links[link]})

mocker.put(url=url, status_code=200, json=json_update_links)
self.study.update_multiple_links(updated_links)

self.first_link._properties = updated_links["area_test / area_test_1"]
self.second_link._properties = updated_links["area_test / area_test_2"]

def test_update_multiple_links_fail(self):
url = f"https://antares.com/api/v1/studies/{self.study_id}/table-mode/links"

with requests_mock.Mocker() as mocker:
mocker.put(url, status_code=404, json={"description": self.antares_web_description_msg})

with pytest.raises(
LinksUpdateError,
match=f"Could not update links from study {self.study_id} : {self.antares_web_description_msg}",
):
self.study.update_multiple_links({})

0 comments on commit aacda26

Please sign in to comment.