diff --git a/README.md b/README.md index bf0dceb..faa7a02 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ In general, my focus on this project is to implement and deliver old and new fea - Update ethe interval fo the alert rule group - Delete alert rule - Get all contact points +- Get contact point by name - Add contact point - Update contact point - Delete contact point diff --git a/grafana_api/alerting_provisioning.py b/grafana_api/alerting_provisioning.py index a8257ec..0a292e1 100644 --- a/grafana_api/alerting_provisioning.py +++ b/grafana_api/alerting_provisioning.py @@ -226,6 +226,30 @@ def get_all_contact_points(self) -> list: else: return api_call + def get_contact_point(self, name: str) -> list: + """Return contact points that exactly match the given name. + + This method does not support partial matching — the `name` value must + match exactly. + + Raises: + Exception: If an unspecified error occurs during the API call. + + Returns: + list: A list of contact points whose `name` property exactly matches + the provided `name`. + """ + + api_call: list = Api(self.grafana_api_model).call_the_api( + f"{APIEndpoints.ALERTING_PROVISIONING.value}/contact-points?name={name}" + ) + + if not isinstance(api_call, list): + logging.error(f"Check the error: {api_call}.") + raise Exception + + return api_call + def add_contact_point( self, embedded_contact_point: EmbeddedContactPoint, diff --git a/tests/integrationtest/test_alerting_provisioning.py b/tests/integrationtest/test_alerting_provisioning.py index 1094ff6..fcc40d3 100644 --- a/tests/integrationtest/test_alerting_provisioning.py +++ b/tests/integrationtest/test_alerting_provisioning.py @@ -119,6 +119,12 @@ def test_i_update_contact_point(self): "test1", self.alerting_provisioning.get_all_contact_points()[1].get("name") ) + def test_j_get_specific_contact_points(self): + self.assertEqual( + "email receiver", + self.alerting_provisioning.get_contact_point("email receiver")[0], + ) + def test_j_get_notification_policies(self): self.assertEqual( "grafana-default-email", diff --git a/tests/unittests/test_alerting_provisioning.py b/tests/unittests/test_alerting_provisioning.py index 65acf7f..3677832 100644 --- a/tests/unittests/test_alerting_provisioning.py +++ b/tests/unittests/test_alerting_provisioning.py @@ -223,13 +223,41 @@ def test_get_all_contact_points(self, call_the_api_mock): grafana_api_model=model ) - call_the_api_mock.return_value = list([{"test": "test"}]) + call_the_api_mock.return_value = list([{"test": "test"}, {"specific-contact-point": "specific contact point"}]) self.assertEqual( - list([{"test": "test"}]), + list([{"test": "test"}, {"specific-contact-point": "specific contact point"}]), alerting_provisioning.get_all_contact_points(), ) + @patch("grafana_api.api.Api.call_the_api") + def test_get_specific_contact_points(self, call_the_api_mock): + model: APIModel = APIModel(host=MagicMock(), token=MagicMock()) + alerting_provisioning: AlertingProvisioning = AlertingProvisioning( + grafana_api_model=model + ) + + call_the_api_mock.return_value = list([{"specific-contact-point": "specific contact point"}]) + + self.assertEqual( + list([{"specific-contact-point": "specific contact point"}]), + alerting_provisioning.get_contact_point("specific-contact-point"), + ) + + @patch("grafana_api.api.Api.call_the_api") + def test_get_specific_contact_points_empty_on_partial_name_should_return_empty_list(self, call_the_api_mock): + model: APIModel = APIModel(host=MagicMock(), token=MagicMock()) + alerting_provisioning: AlertingProvisioning = AlertingProvisioning( + grafana_api_model=model + ) + + call_the_api_mock.return_value = list([]) + + self.assertEqual( + list([]), + alerting_provisioning.get_contact_point("contact-point-invalid-name"), + ) + @patch("grafana_api.api.Api.call_the_api") def test_get_all_contact_points_not_possible(self, call_the_api_mock): model: APIModel = APIModel(host=MagicMock(), token=MagicMock())