From 4e880dcf968794322be07015295a5ddb29a2d360 Mon Sep 17 00:00:00 2001 From: William Bergamin Date: Thu, 13 Mar 2025 13:07:19 -0400 Subject: [PATCH 1/3] feat: honor passing the Bolt logger in default WebClient instantiation --- slack_bolt/app/app.py | 1 + slack_bolt/app/async_app.py | 1 + .../test_web_client_customization.py | 70 +++++++++++++++++-- .../test_web_client_customization.py | 67 ++++++++++++++++++ 4 files changed, 135 insertions(+), 4 deletions(-) diff --git a/slack_bolt/app/app.py b/slack_bolt/app/app.py index 3d5532b7b..69da0a0d8 100644 --- a/slack_bolt/app/app.py +++ b/slack_bolt/app/app.py @@ -1381,6 +1381,7 @@ def _init_context(self, req: BoltRequest): proxy=self._client.proxy, headers=self._client.headers, team_id=req.context.team_id, + logger=self._client.logger, retry_handlers=self._client.retry_handlers.copy() if self._client.retry_handlers is not None else None, ) req.context["client"] = client_per_request diff --git a/slack_bolt/app/async_app.py b/slack_bolt/app/async_app.py index 50a36e5dd..3fcc3d955 100644 --- a/slack_bolt/app/async_app.py +++ b/slack_bolt/app/async_app.py @@ -1413,6 +1413,7 @@ def _init_context(self, req: AsyncBoltRequest): trust_env_in_session=self._async_client.trust_env_in_session, headers=self._async_client.headers, team_id=req.context.team_id, + logger=self._async_client.logger, retry_handlers=( self._async_client.retry_handlers.copy() if self._async_client.retry_handlers is not None else None ), diff --git a/tests/scenario_tests/test_web_client_customization.py b/tests/scenario_tests/test_web_client_customization.py index 3967ccb7a..cf3cdd014 100644 --- a/tests/scenario_tests/test_web_client_customization.py +++ b/tests/scenario_tests/test_web_client_customization.py @@ -1,4 +1,5 @@ import json +import logging from time import time from urllib.parse import quote @@ -21,10 +22,8 @@ class TestWebClientCustomization: signing_secret = "secret" mock_api_server_base_url = "http://localhost:8888" signature_verifier = SignatureVerifier(signing_secret) - web_client = WebClient( - token=valid_token, - base_url=mock_api_server_base_url, - ) + test_logger = logging.getLogger("test.logger") + web_client = WebClient(token=valid_token, base_url=mock_api_server_base_url) def setup_method(self): self.old_os_env = remove_os_env_temporarily() @@ -69,6 +68,69 @@ def listener(ack, client): assert response.body == "" assert_auth_test_count(self, 1) + def test_default_app_web_client_logger_is_app_logger(self): + app = App(token=self.valid_token, signing_secret=self.signing_secret, token_verification_enabled=False) + app.client.base_url = self.mock_api_server_base_url + + assert app.client.logger == app.logger + + def test_default_web_client_uses_bolt_framework_logger(self): + app = App(token=self.valid_token, signing_secret=self.signing_secret, token_verification_enabled=False) + app.client.base_url = self.mock_api_server_base_url + + @app.action("a") + def listener(ack, client: WebClient): + assert client.logger == app.logger + ack() + + request = self.build_valid_request() + response = app.dispatch(request) + assert response.status == 200 + assert response.body == "" + assert_auth_test_count(self, 1) + + def test_default_web_client_uses_bolt_app_custom_logger(self): + app = App( + token=self.valid_token, + signing_secret=self.signing_secret, + token_verification_enabled=False, + logger=self.test_logger, + ) + app.client.base_url = self.mock_api_server_base_url + + assert app.client.logger == app.logger + + @app.action("a") + def listener(ack, client: WebClient): + assert client.logger == app.logger + assert client.logger == self.test_logger + ack() + + request = self.build_valid_request() + response = app.dispatch(request) + assert response.status == 200 + assert response.body == "" + assert_auth_test_count(self, 1) + + def test_custom_web_client_logger_is_used_instead_of_bolt_app_logger(self): + web_client = WebClient(token=self.valid_token, base_url=self.mock_api_server_base_url, logger=self.test_logger) + app = App( + client=web_client, + signing_secret=self.signing_secret, + ) + + @app.action("a") + def listener(ack, client: WebClient): + assert client.logger == self.test_logger + assert app.logger != self.test_logger + ack() + + request = self.build_valid_request() + response = app.dispatch(request) + assert response.status == 200 + assert response.body == "" + assert_auth_test_count(self, 1) + block_actions_body = { "type": "block_actions", diff --git a/tests/scenario_tests_async/test_web_client_customization.py b/tests/scenario_tests_async/test_web_client_customization.py index 3cfc5af64..fc217fbaf 100644 --- a/tests/scenario_tests_async/test_web_client_customization.py +++ b/tests/scenario_tests_async/test_web_client_customization.py @@ -1,4 +1,5 @@ import json +import logging import os from time import time from urllib.parse import quote @@ -23,6 +24,7 @@ class TestWebClientCustomization: signing_secret = "secret" mock_api_server_base_url = "http://localhost:8888" signature_verifier = SignatureVerifier(signing_secret) + test_logger = logging.getLogger("test.logger") web_client = AsyncWebClient( token=valid_token, base_url=mock_api_server_base_url, @@ -87,6 +89,71 @@ async def listener(ack, client): assert response.body == "" await assert_auth_test_count_async(self, 1) + def test_default_app_web_client_logger_is_app_logger(self): + app = AsyncApp(token=self.valid_token, signing_secret=self.signing_secret) + app.client.base_url = self.mock_api_server_base_url + + assert app.client.logger == app.logger + + @pytest.mark.asyncio + async def test_default_web_client_uses_bolt_framework_logger(self): + app = AsyncApp(token=self.valid_token, signing_secret=self.signing_secret) + app.client.base_url = self.mock_api_server_base_url + + @app.action("a") + async def listener(ack, client: AsyncWebClient): + assert client.logger == app.logger + await ack() + + request = self.build_valid_request() + response = await app.async_dispatch(request) + assert response.status == 200 + assert response.body == "" + await assert_auth_test_count_async(self, 1) + + @pytest.mark.asyncio + async def test_default_web_client_uses_bolt_app_custom_logger(self): + app = AsyncApp( + token=self.valid_token, + signing_secret=self.signing_secret, + logger=self.test_logger, + ) + app.client.base_url = self.mock_api_server_base_url + + assert app.client.logger == app.logger + + @app.action("a") + async def listener(ack, client: AsyncWebClient): + assert client.logger == app.logger + assert client.logger == self.test_logger + await ack() + + request = self.build_valid_request() + response = await app.async_dispatch(request) + assert response.status == 200 + assert response.body == "" + await assert_auth_test_count_async(self, 1) + + @pytest.mark.asyncio + async def test_custom_web_client_logger_is_used_instead_of_bolt_app_logger(self): + web_client = AsyncWebClient(token=self.valid_token, base_url=self.mock_api_server_base_url, logger=self.test_logger) + app = AsyncApp( + client=web_client, + signing_secret=self.signing_secret, + ) + + @app.action("a") + async def listener(ack, client: AsyncWebClient): + assert client.logger == self.test_logger + assert app.logger != self.test_logger + await ack() + + request = self.build_valid_request() + response = await app.async_dispatch(request) + assert response.status == 200 + assert response.body == "" + await assert_auth_test_count_async(self, 1) + block_actions_body = { "type": "block_actions", From d6aea715415a2192c7359c4a173001b8ed481066 Mon Sep 17 00:00:00 2001 From: William Bergamin Date: Fri, 14 Mar 2025 15:23:46 -0400 Subject: [PATCH 2/3] Make it almost work --- tests/scenario_tests/test_web_client_customization.py | 6 +++--- tests/scenario_tests_async/test_web_client_customization.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/scenario_tests/test_web_client_customization.py b/tests/scenario_tests/test_web_client_customization.py index ad09646fa..f78c7747a 100644 --- a/tests/scenario_tests/test_web_client_customization.py +++ b/tests/scenario_tests/test_web_client_customization.py @@ -73,7 +73,7 @@ def listener(ack, client): def test_web_client_logger_is_default_app_logger(self): app = App(token=self.valid_token, signing_secret=self.signing_secret, token_verification_enabled=False) - assert app.client._logger == app.logger # TODO: use client.logger when available + assert app.client.logger == app.logger def test_web_client_logger_is_app_logger(self): app = App( @@ -82,8 +82,8 @@ def test_web_client_logger_is_app_logger(self): logger=self.test_logger, token_verification_enabled=False, ) - assert app.client._logger == app.logger # TODO: use client.logger when available - assert app.client._logger == self.test_logger # TODO: use client.logger when available + assert app.client.logger == app.logger + assert app.client.logger == self.test_logger def test_default_web_client_uses_bolt_framework_logger(self): app = App(token=self.valid_token, signing_secret=self.signing_secret, token_verification_enabled=False) diff --git a/tests/scenario_tests_async/test_web_client_customization.py b/tests/scenario_tests_async/test_web_client_customization.py index 1add86089..c9b42a617 100644 --- a/tests/scenario_tests_async/test_web_client_customization.py +++ b/tests/scenario_tests_async/test_web_client_customization.py @@ -91,12 +91,12 @@ async def listener(ack, client): def test_web_client_logger_is_default_app_logger(self): app = AsyncApp(token=self.valid_token, signing_secret=self.signing_secret) - assert app.client._logger == app.logger # TODO: use client.logger when available + assert app.client.logger == app.logger def test_web_client_logger_is_app_logger(self): app = AsyncApp(token=self.valid_token, signing_secret=self.signing_secret, logger=self.test_logger) - assert app.client._logger == app.logger # TODO: use client.logger when available - assert app.client._logger == self.test_logger # TODO: use client.logger when available + assert app.client.logger == app.logger + assert app.client.logger == self.test_logger @pytest.mark.asyncio async def test_default_web_client_uses_bolt_framework_logger(self): From 41738455f3cf57d9a888b8883806f4749d2b6da3 Mon Sep 17 00:00:00 2001 From: William Bergamin Date: Mon, 17 Mar 2025 15:00:51 -0400 Subject: [PATCH 3/3] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f0b0cf987..c8d66106a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -slack_sdk>=3.33.5,<4 +slack_sdk>=3.35.0,<4