Skip to content

Commit a4c60e6

Browse files
committed
🐛 fix(external-tests): stabilize notifier webhook flow
Make global test patching robust for isolated external runs and add missing mock Horizon ledger-transactions endpoint so notifier webhook delivery completes reliably in CI.
1 parent dab4fce commit a4c60e6

File tree

2 files changed

+56
-17
lines changed

2 files changed

+56
-17
lines changed

bot/tests/conftest.py

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,9 @@ def mock_global_data_autouse():
862862
"other.lang_tools.my_gettext",
863863
side_effect=lambda chat_id, key, param=None, **kwargs: f"text {key}",
864864
)
865-
p2 = patch("infrastructure.utils.common_utils.get_user_id", return_value=123)
865+
from infrastructure.utils import common_utils
866+
867+
p2 = patch.object(common_utils, "get_user_id", return_value=123)
866868

867869
p3.start()
868870
p2.start()
@@ -1187,22 +1189,35 @@ async def get_ledgers(request):
11871189
state.requests.append(
11881190
{"endpoint": "ledgers", "method": "GET", "params": params}
11891191
)
1192+
ledger_record = {
1193+
"id": "123456789",
1194+
"sequence": 12345,
1195+
"hash": "hash123",
1196+
"paging_token": "12345",
1197+
"closed_at": "2024-01-01T00:00:00Z",
1198+
}
1199+
1200+
if "text/event-stream" in request.headers.get("Accept", ""):
1201+
import json
1202+
1203+
response = web.StreamResponse(
1204+
status=200,
1205+
reason="OK",
1206+
headers={
1207+
"Content-Type": "text/event-stream",
1208+
"Cache-Control": "no-cache",
1209+
"Connection": "keep-alive",
1210+
},
1211+
)
1212+
await response.prepare(request)
1213+
await response.write(b'event: open\ndata: "hello"\n\n')
1214+
await response.write(
1215+
f"data: {json.dumps(ledger_record)}\n\n".encode("utf-8")
1216+
)
1217+
return response
1218+
11901219
# Return a simple ledger list to satisfy basic polling
1191-
return web.json_response(
1192-
{
1193-
"_embedded": {
1194-
"records": [
1195-
{
1196-
"id": "123456789",
1197-
"sequence": 12345,
1198-
"hash": "hash123",
1199-
"paging_token": "12345",
1200-
"closed_at": "2024-01-01T00:00:00Z",
1201-
}
1202-
]
1203-
}
1204-
}
1205-
)
1220+
return web.json_response({"_embedded": {"records": [ledger_record]}})
12061221

12071222
@routes.get("/ledgers/{sequence}")
12081223
async def get_ledger_by_seq(request):
@@ -1217,6 +1232,26 @@ async def get_ledger_by_seq(request):
12171232
}
12181233
)
12191234

1235+
@routes.get("/ledgers/{sequence}/transactions")
1236+
async def get_ledger_transactions(request):
1237+
"""Mock transactions-by-ledger endpoint used by notifier polling."""
1238+
seq = request.match_info["sequence"]
1239+
params = dict(request.query)
1240+
state.requests.append(
1241+
{
1242+
"endpoint": "ledger-transactions",
1243+
"method": "GET",
1244+
"sequence": seq,
1245+
"params": params,
1246+
}
1247+
)
1248+
1249+
cursor = params.get("cursor", "0")
1250+
limit = int(params.get("limit", 10))
1251+
filtered = [tx for tx in state.transactions if tx["paging_token"] > cursor]
1252+
records = filtered[:limit]
1253+
return web.json_response({"_embedded": {"records": records}})
1254+
12201255
@routes.get("/operations")
12211256
async def get_operations(request):
12221257
"""Mock operations endpoint."""

bot/tests/external/test_notifier_flow.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from aiohttp import web
55
import time
66
import json
7+
import os
78
from urllib.parse import quote
89
from testcontainers.core.container import DockerContainer
910
from testcontainers.core.network import Network
@@ -236,8 +237,11 @@ async def webhook_handler(request):
236237
)
237238

238239
# Wait for Webhook
240+
wait_timeout = float(os.getenv("NOTIFIER_WEBHOOK_TIMEOUT", "45"))
239241
try:
240-
webhook_data = await asyncio.wait_for(webhook_queue.get(), timeout=15.0)
242+
webhook_data = await asyncio.wait_for(
243+
webhook_queue.get(), timeout=wait_timeout
244+
)
241245
# Notifier service sends 'operation' type for operation events
242246
assert webhook_data["type"] == "operation"
243247
# Depending on Notifier implementation, verify content

0 commit comments

Comments
 (0)