Skip to content

Commit 838bbae

Browse files
chore: improve testing around socket-mode header synthesization
1 parent c0dd462 commit 838bbae

7 files changed

Lines changed: 43 additions & 30 deletions

File tree

slack_bolt/adapter/socket_mode/async_internals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
from slack_sdk.socket_mode.request import SocketModeRequest
99
from slack_sdk.socket_mode.response import SocketModeResponse
1010

11-
from slack_bolt.adapter.socket_mode.internals import build_retry_headers
11+
from slack_bolt.adapter.socket_mode.internals import build_headers
1212
from slack_bolt.app.async_app import AsyncApp
1313
from slack_bolt.request.async_request import AsyncBoltRequest
1414
from slack_bolt.response import BoltResponse
1515

1616

1717
async def run_async_bolt_app(app: AsyncApp, req: SocketModeRequest):
18-
bolt_req: AsyncBoltRequest = AsyncBoltRequest(mode="socket_mode", body=req.payload, headers=build_retry_headers(req))
18+
bolt_req: AsyncBoltRequest = AsyncBoltRequest(mode="socket_mode", body=req.payload, headers=build_headers(req))
1919
bolt_resp: BoltResponse = await app.async_dispatch(bolt_req)
2020
return bolt_resp
2121

slack_bolt/adapter/socket_mode/internals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from slack_bolt.response import BoltResponse
1515

1616

17-
def build_retry_headers(req: SocketModeRequest) -> Optional[Dict[str, Union[str, Sequence[str]]]]:
17+
def build_headers(req: SocketModeRequest) -> Optional[Dict[str, Union[str, Sequence[str]]]]:
1818
# Mirror the HTTP mode retry headers so middleware/listeners can detect Events API retries
1919
headers: Dict[str, Union[str, Sequence[str]]] = {}
2020
if req.retry_attempt is not None:
@@ -25,7 +25,7 @@ def build_retry_headers(req: SocketModeRequest) -> Optional[Dict[str, Union[str,
2525

2626

2727
def run_bolt_app(app: App, req: SocketModeRequest):
28-
bolt_req: BoltRequest = BoltRequest(mode="socket_mode", body=req.payload, headers=build_retry_headers(req))
28+
bolt_req: BoltRequest = BoltRequest(mode="socket_mode", body=req.payload, headers=build_headers(req))
2929
bolt_resp: BoltResponse = app.dispatch(bolt_req)
3030
return bolt_resp
3131

tests/adapter_tests/socket_mode/test_interactions_builtin.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def teardown_method(self):
3636
def test_interactions(self):
3737
app = App(client=self.web_client)
3838

39-
result = {"shortcut": False, "command": False}
39+
result = {"shortcut": False, "command": False, "message": False}
4040

4141
@app.shortcut("do-something")
4242
def shortcut_handler(ack):
@@ -48,6 +48,13 @@ def command_handler(ack):
4848
result["command"] = True
4949
ack()
5050

51+
@app.message("<@W111>")
52+
def message_handler(ack, req):
53+
result["message"] = req.headers.get("x-slack-retry-num") == ["1"] and req.headers.get(
54+
"x-slack-retry-reason"
55+
) == ["timeout"]
56+
ack()
57+
5158
handler = SocketModeHandler(
5259
app_token="xapp-A111-222-xyz",
5360
app=app,
@@ -66,5 +73,6 @@ def command_handler(ack):
6673
time.sleep(2)
6774
assert result["shortcut"] is True
6875
assert result["command"] is True
76+
assert result["message"] is True
6977
finally:
7078
handler.client.close()

tests/adapter_tests/socket_mode/test_interactions_websocket_client.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def test_interactions(self):
3737

3838
app = App(client=self.web_client)
3939

40-
result = {"shortcut": False, "command": False}
40+
result = {"shortcut": False, "command": False, "message": False}
4141

4242
@app.shortcut("do-something")
4343
def shortcut_handler(ack):
@@ -49,6 +49,13 @@ def command_handler(ack):
4949
result["command"] = True
5050
ack()
5151

52+
@app.message("<@W111>")
53+
def message_handler(ack, req):
54+
result["message"] = req.headers.get("x-slack-retry-num") == ["1"] and req.headers.get(
55+
"x-slack-retry-reason"
56+
) == ["timeout"]
57+
ack()
58+
5259
handler = SocketModeHandler(
5360
app_token="xapp-A111-222-xyz",
5461
app=app,
@@ -67,5 +74,6 @@ def command_handler(ack):
6774
time.sleep(2)
6875
assert result["shortcut"] is True
6976
assert result["command"] is True
77+
assert result["message"] is True
7078
finally:
7179
handler.client.close()
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from slack_sdk.socket_mode.request import SocketModeRequest
22

3-
from slack_bolt.adapter.socket_mode.internals import build_retry_headers, run_bolt_app
3+
from slack_bolt.adapter.socket_mode.internals import build_headers, run_bolt_app
44

55

66
class TestSocketModeInternals:
77
def test_build_retry_headers_without_retry(self):
88
req = SocketModeRequest(type="events_api", envelope_id="e1", payload={"type": "event_callback"})
9-
assert build_retry_headers(req) is None
9+
assert build_headers(req) is None
1010

1111
def test_build_retry_headers_with_retry(self):
1212
req = SocketModeRequest(
@@ -16,24 +16,5 @@ def test_build_retry_headers_with_retry(self):
1616
retry_attempt=2,
1717
retry_reason="http_timeout",
1818
)
19-
headers = build_retry_headers(req)
19+
headers = build_headers(req)
2020
assert headers == {"x-slack-retry-num": "2", "x-slack-retry-reason": "http_timeout"}
21-
22-
def test_run_bolt_app_propagates_retry_headers(self):
23-
captured = {}
24-
25-
class FakeApp:
26-
def dispatch(self, bolt_req):
27-
captured["headers"] = bolt_req.headers
28-
return None
29-
30-
req = SocketModeRequest(
31-
type="events_api",
32-
envelope_id="e1",
33-
payload={"type": "event_callback", "event": {"type": "app_mention"}},
34-
retry_attempt=1,
35-
retry_reason="http_timeout",
36-
)
37-
run_bolt_app(FakeApp(), req)
38-
assert captured["headers"]["x-slack-retry-num"] == ["1"]
39-
assert captured["headers"]["x-slack-retry-reason"] == ["http_timeout"]

tests/adapter_tests_async/socket_mode/test_async_aiohttp.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async def test_events(self):
4040

4141
app = AsyncApp(client=self.web_client)
4242

43-
result = {"shortcut": False, "command": False}
43+
result = {"shortcut": False, "command": False, "message": False}
4444

4545
@app.shortcut("do-something")
4646
async def shortcut_handler(ack):
@@ -52,6 +52,13 @@ async def command_handler(ack):
5252
result["command"] = True
5353
await ack()
5454

55+
@app.message("<@W111>")
56+
async def message_handler(ack, req):
57+
result["message"] = req.headers.get("x-slack-retry-num") == ["1"] and req.headers.get(
58+
"x-slack-retry-reason"
59+
) == ["timeout"]
60+
await ack()
61+
5562
handler = AsyncSocketModeHandler(
5663
app_token="xapp-A111-222-xyz",
5764
app=app,
@@ -67,6 +74,7 @@ async def command_handler(ack):
6774
await asyncio.sleep(2)
6875
assert result["shortcut"] is True
6976
assert result["command"] is True
77+
assert result["message"] is True
7078
finally:
7179
await handler.client.close()
7280
stop_socket_mode_server(self)

tests/adapter_tests_async/socket_mode/test_async_websockets.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async def test_events(self):
4040

4141
app = AsyncApp(client=self.web_client)
4242

43-
result = {"shortcut": False, "command": False}
43+
result = {"shortcut": False, "command": False, "message": False}
4444

4545
@app.shortcut("do-something")
4646
async def shortcut_handler(ack):
@@ -52,6 +52,13 @@ async def command_handler(ack):
5252
result["command"] = True
5353
await ack()
5454

55+
@app.message("<@W111>")
56+
async def message_handler(ack, req):
57+
result["message"] = req.headers.get("x-slack-retry-num") == ["1"] and req.headers.get(
58+
"x-slack-retry-reason"
59+
) == ["timeout"]
60+
await ack()
61+
5562
handler = AsyncSocketModeHandler(
5663
app_token="xapp-A111-222-xyz",
5764
app=app,
@@ -67,6 +74,7 @@ async def command_handler(ack):
6774
await asyncio.sleep(2)
6875
assert result["shortcut"] is True
6976
assert result["command"] is True
77+
assert result["message"] is True
7078
finally:
7179
await handler.client.close()
7280
stop_socket_mode_server(self)

0 commit comments

Comments
 (0)