diff --git a/protocol.py b/protocol.py index 93eff5f9..4e8d6e17 100644 --- a/protocol.py +++ b/protocol.py @@ -696,15 +696,20 @@ class Protocol: inner_objs = outer_obj['object'] = as1.get_objects(outer_obj) def translate(elem, field, fn): - elem[field] = as1.get_object(elem, field) - if id := elem[field].get('id'): - from_cls = Protocol.for_id(id) - # TODO: what if from_cls is None? relax translate_object_id, - # make it a noop if we don't know enough about from/to? - if from_cls and from_cls != to_cls: - elem[field]['id'] = fn(id=id, from_=from_cls, to=to_cls) - if elem[field].keys() == {'id'}: - elem[field] = elem[field]['id'] + elem[field] = as1.get_objects(elem, field) + for obj in elem[field]: + if id := obj.get('id'): + from_cls = Protocol.for_id(id) + # TODO: what if from_cls is None? relax translate_object_id, + # make it a noop if we don't know enough about from/to? + if from_cls and from_cls != to_cls: + obj['id'] = fn(id=id, from_=from_cls, to=to_cls) + + elem[field] = [o['id'] if o.keys() == {'id'} else o + for o in elem[field]] + + if len(elem[field]) == 1: + elem[field] = elem[field][0] type = as1.object_type(outer_obj) translate(outer_obj, 'id', diff --git a/tests/test_protocol.py b/tests/test_protocol.py index 3cb3153b..c5be8c7e 100644 --- a/tests/test_protocol.py +++ b/tests/test_protocol.py @@ -792,6 +792,18 @@ class ProtocolTest(TestCase): OtherFake.bot_dm(user, 'nope') self.assertEqual([], OtherFake.sent) + # TODO: translate_ids tests that actually test translation + def test_translate_ids_empty(self): + self.assertEqual({}, Fake.translate_ids({})) + + def test_translate_ids_single_inReplyTo(self): + obj = {'inReplyTo': 'foo'} + self.assertEqual(obj, Fake.translate_ids(obj)) + + def test_translate_ids_multiple_inReplyTo(self): + obj = {'inReplyTo': ['foo', 'bar']} + self.assertEqual(obj, Fake.translate_ids(obj)) + class ProtocolReceiveTest(TestCase):