Skip to content

Commit e180aa0

Browse files
committed
feat: include thread id in keylist update recv webhooks
Signed-off-by: Daniel Bluhm <dbluhm@pm.me>
1 parent 12ecda3 commit e180aa0

5 files changed

Lines changed: 49 additions & 20 deletions

File tree

aries_cloudagent/protocols/coordinate_mediation/v1_0/handlers/keylist_update_handler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ async def handle(self, context: RequestContext, responder: BaseResponder):
3232
session, context.connection_record.connection_id
3333
)
3434
response = await mgr.update_keylist(record, updates=context.message.updates)
35+
response.assign_thread_from(context.message)
3536
await responder.send_reply(response)
3637
except (StorageNotFoundError, MediationNotGrantedError):
3738
reply = CMProblemReport(

aries_cloudagent/protocols/coordinate_mediation/v1_0/handlers/keylist_update_response_handler.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ async def handle(self, context: RequestContext, responder: BaseResponder):
2525
await mgr.store_update_results(
2626
context.connection_record.connection_id, context.message.updated
2727
)
28+
await mgr.notify_keylist_updated(
29+
context.connection_record.connection_id, context.message
30+
)

aries_cloudagent/protocols/coordinate_mediation/v1_0/handlers/tests/test_keylist_update_response_handler.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ async def test_handler(self):
4646
handler, responder = KeylistUpdateResponseHandler(), MockResponder()
4747
with async_mock.patch.object(
4848
MediationManager, "store_update_results"
49-
) as mock_method:
49+
) as mock_store, async_mock.patch.object(
50+
MediationManager, "notify_keylist_updated"
51+
) as mock_notify:
5052
await handler.handle(self.context, responder)
51-
mock_method.assert_called_once_with(TEST_CONN_ID, self.updated)
53+
mock_store.assert_called_once_with(TEST_CONN_ID, self.updated)
54+
mock_notify.assert_called_once_with(TEST_CONN_ID, self.context.message)

aries_cloudagent/protocols/coordinate_mediation/v1_0/manager.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -596,11 +596,16 @@ async def store_update_results(
596596
for record_for_removal in to_remove:
597597
await record_for_removal.delete_record(session)
598598

599+
async def notify_keylist_updated(
600+
self, connection_id: str, response: KeylistUpdateResponse
601+
):
602+
"""Notify of keylist update response received."""
599603
await self._profile.notify(
600604
self.KEYLIST_UPDATED_EVENT,
601605
{
602606
"connection_id": connection_id,
603-
"updated": [update.serialize() for update in results],
607+
"thread_id": response._thread_id,
608+
"updated": [update.serialize() for update in response.updated],
604609
},
605610
)
606611

aries_cloudagent/protocols/coordinate_mediation/v1_0/tests/test_mediation_manager.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,15 @@
22
import logging
33
from typing import AsyncIterable, Iterable
44

5-
import pytest
6-
75
from asynctest import mock as async_mock
6+
import pytest
87

9-
from .....core.profile import Profile, ProfileSession
10-
from .....core.in_memory import InMemoryProfile
8+
from .. import manager as test_module
119
from .....core.event_bus import EventBus, MockEventBus
12-
from .....connections.models.conn_record import ConnRecord
13-
from .....messaging.request_context import RequestContext
10+
from .....core.in_memory import InMemoryProfile
11+
from .....core.profile import Profile, ProfileSession
1412
from .....storage.error import StorageNotFoundError
15-
from .....transport.inbound.receipt import MessageReceipt
16-
1713
from ....routing.v1_0.models.route_record import RouteRecord
18-
19-
from .. import manager as test_module
2014
from ..manager import (
2115
MediationAlreadyExists,
2216
MediationManager,
@@ -25,12 +19,14 @@
2519
)
2620
from ..messages.inner.keylist_update_rule import KeylistUpdateRule
2721
from ..messages.inner.keylist_updated import KeylistUpdated
22+
from ..messages.keylist_update_response import KeylistUpdateResponse
2823
from ..messages.mediate_deny import MediationDeny
2924
from ..messages.mediate_grant import MediationGrant
3025
from ..messages.mediate_request import MediationRequest
3126
from ..models.mediation_record import MediationRecord
3227

3328
TEST_CONN_ID = "conn-id"
29+
TEST_THREAD_ID = "thread-id"
3430
TEST_ENDPOINT = "https://example.com"
3531
TEST_VERKEY = "3Dn1SJNPaCXcvvJvSbsFWP2xaCjMom3can8CQNhWrTRx"
3632
TEST_ROUTE_VERKEY = "9WCgWKUaAJj3VWxxtzvvMQN3AoFxoBtBDo9ntwJnVVCC"
@@ -373,7 +369,6 @@ async def test_store_update_results(
373369
self,
374370
session: ProfileSession,
375371
manager: MediationManager,
376-
mock_event_bus: MockEventBus,
377372
):
378373
"""test_store_update_results."""
379374
await RouteRecord(
@@ -394,12 +389,6 @@ async def test_store_update_results(
394389
),
395390
]
396391
await manager.store_update_results(TEST_CONN_ID, results)
397-
assert mock_event_bus.events
398-
assert mock_event_bus.events[0][1].topic == manager.KEYLIST_UPDATED_EVENT
399-
assert mock_event_bus.events[0][1].payload == {
400-
"connection_id": TEST_CONN_ID,
401-
"updated": [result.serialize() for result in results],
402-
}
403392
routes = await RouteRecord.query(session)
404393

405394
assert len(routes) == 1
@@ -484,6 +473,34 @@ async def test_store_update_results_errors(self, caplog, manager):
484473
assert "server_error" in caplog.text
485474
print(caplog.text)
486475

476+
async def test_notify_keylist_updated(
477+
self, manager: MediationManager, mock_event_bus: MockEventBus
478+
):
479+
"""test notify_keylist_updated."""
480+
response = KeylistUpdateResponse(
481+
updated=[
482+
KeylistUpdated(
483+
recipient_key=TEST_ROUTE_VERKEY,
484+
action=KeylistUpdateRule.RULE_ADD,
485+
result=KeylistUpdated.RESULT_SUCCESS,
486+
),
487+
KeylistUpdated(
488+
recipient_key=TEST_VERKEY,
489+
action=KeylistUpdateRule.RULE_REMOVE,
490+
result=KeylistUpdated.RESULT_SUCCESS,
491+
),
492+
],
493+
)
494+
response.assign_thread_id(TEST_THREAD_ID)
495+
await manager.notify_keylist_updated(TEST_CONN_ID, response)
496+
assert mock_event_bus.events
497+
assert mock_event_bus.events[0][1].topic == manager.KEYLIST_UPDATED_EVENT
498+
assert mock_event_bus.events[0][1].payload == {
499+
"connection_id": TEST_CONN_ID,
500+
"thread_id": TEST_THREAD_ID,
501+
"updated": [result.serialize() for result in response.updated],
502+
}
503+
487504
async def test_get_my_keylist(self, session, manager):
488505
"""test_get_my_keylist."""
489506
await RouteRecord(

0 commit comments

Comments
 (0)