From e5b9bcf8ff538cf7a0d62eab76036121811f41f0 Mon Sep 17 00:00:00 2001 From: Nikos Date: Fri, 10 Jan 2025 11:16:39 +0100 Subject: [PATCH] fix: handle event being emitted multiple times --- src/charm.py | 4 ++++ tests/unit/test_charm.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/charm.py b/src/charm.py index bb077976..972c57cd 100755 --- a/src/charm.py +++ b/src/charm.py @@ -397,6 +397,10 @@ def _on_oauth_client_created(self, event: ClientCreatedEvent) -> None: event.defer() return + if self.peer_data[f"oauth_{event.relation_id}"]: + logger.info("Got client_created event, but client already exists. Ignoring event") + return + target_oauth_client = OAuthClient( **event.snapshot(), **{"metadata": {"integration-id": str(event.relation_id)}}, diff --git a/tests/unit/test_charm.py b/tests/unit/test_charm.py index c85fb4c6..8097262a 100644 --- a/tests/unit/test_charm.py +++ b/tests/unit/test_charm.py @@ -405,6 +405,36 @@ def test_when_succeeds( assert harness.charm.peer_data[f"oauth_{oauth_integration}"] == {"client_id": "client_id"} mocked_provider.assert_called_once_with(oauth_integration, "client_id", "client_secret") + def test_client_created_emitted_twice( + self, + harness: Harness, + mocked_workload_service: MagicMock, + mocked_oauth_client_config: dict, + peer_integration: int, + oauth_integration: int, + ) -> None: + harness.set_leader(True) + mocked_workload_service.is_running = True + + with ( + patch( + "charm.CommandLine.create_oauth_client", + return_value=OAuthClient(client_id="client_id", client_secret="client_secret"), + ), + patch( + "charm.OAuthProvider.set_client_credentials_in_relation_data" + ) as mocked_provider, + ): + harness.charm.oauth_provider.on.client_created.emit( + relation_id=oauth_integration, **mocked_oauth_client_config + ) + harness.charm.oauth_provider.on.client_created.emit( + relation_id=oauth_integration, **mocked_oauth_client_config + ) + + assert harness.charm.peer_data[f"oauth_{oauth_integration}"] == {"client_id": "client_id"} + mocked_provider.assert_called_once() + class TestOAuthClientChangedEvent: def test_when_hydra_service_not_ready(