test_update() passes

issue-47
Marnanel Thurman 2020-10-28 20:35:55 +00:00
rodzic 972377aafa
commit e26e2781d6
2 zmienionych plików z 62 dodań i 11 usunięć

Wyświetl plik

@ -47,9 +47,13 @@ def create(fields,
) )
return return
try:
result = deserialise(fields) result = deserialise(fields)
return result return result
except Exception as e:
logger.info("%s: can't deserialise: %s",
address, repr(e))
return None
def deserialise(fields, def deserialise(fields,
address = None, address = None,
@ -301,11 +305,26 @@ def on_announce(fields, address):
return reblog return reblog
def on_person(fields, address): def on_person(fields, address,
update_existing = False):
if update_existing:
try:
user = trilby_models.RemotePerson.objects.get(
remote_url = fields['id'],
)
logger.debug("%s: updating existing user %s",
address, user)
except trilby_models.RemotePerson.DoesNotExist:
logger.debug("%s: can't update %s because they don't exist",
address, fields['id'])
return None
else:
user = trilby_models.RemotePerson( user = trilby_models.RemotePerson(
remote_url = fields['id'], remote_url = fields['id'],
) )
logger.debug("%s: creating new user",
address)
for fieldsname, fieldname in [ for fieldsname, fieldname in [
('preferredUsername', 'username'), ('preferredUsername', 'username'),
@ -322,6 +341,9 @@ def on_person(fields, address):
('movedTo', 'moved_to'), ('movedTo', 'moved_to'),
]: ]:
if fieldsname in fields: if fieldsname in fields:
logger.debug('%s: %s = %s',
address, fieldname, fields[fieldsname])
setattr(user, setattr(user,
fieldname, fieldname,
fields[fieldsname]) fields[fieldsname])
@ -406,6 +428,29 @@ def on_like(fields, address):
return like return like
def on_update(fields, address):
# TODO: According to the spec, "Update" is partial
# if we're getting the message from a local user,
# but total if we're getting it from a remote user.
# Since we don't currently support ActivityPub from
# local users, we treat all updates as total for now.
# See https://gitlab.com/marnanel/kepi/-/issues/8 .
handler = on_person # FIXME there are other possibilities!
# See https://gitlab.com/marnanel/kepi/-/issues/63 .
logger.debug('%s: on_update %s', address, fields)
changes = fields['object']
logger.debug('%s: -- changes: %s', address, changes)
result = handler(changes, address,
update_existing = True)
return result
def on_collection(fields, address): def on_collection(fields, address):
result = sombrero_collections.Collection( result = sombrero_collections.Collection(

Wyświetl plik

@ -3,6 +3,7 @@ from kepi.bowler_pub.tests import create_remote_person
from unittest import skip from unittest import skip
from kepi.bowler_pub.create import create from kepi.bowler_pub.create import create
from kepi.bowler_pub.models import * from kepi.bowler_pub.models import *
import kepi.trilby_api.models as trilby_models
import httpretty import httpretty
import logging import logging
@ -12,14 +13,14 @@ SENDER_ID = 'https://example.com/actor'
TOTALLY = "Totally modified now" TOTALLY = "Totally modified now"
# XXX Why does this only test updating of profiles? # XXX Why does this only test updating of profiles?
# XXX I thought we should update items as well. # See https://gitlab.com/marnanel/kepi/-/issues/63 .
class TestUpdate(TestCase): class Tests(TestCase):
@httpretty.activate @httpretty.activate
def test_update_profile(self): def test_update_profile(self):
sender = create_remote_person( create_remote_person(
name = 'jeremy', name = 'jeremy',
remote_url = SENDER_ID, remote_url = SENDER_ID,
auto_fetch = True, auto_fetch = True,
@ -31,13 +32,18 @@ class TestUpdate(TestCase):
'type': 'Update', 'type': 'Update',
'actor': SENDER_ID, 'actor': SENDER_ID,
'object': { 'object': {
'display_name': TOTALLY, 'id': SENDER_ID,
'name': TOTALLY,
}, },
} }
logger.info('Submitting Update activity: %s', create_form) logger.info('Submitting Update activity: %s', create_form)
create(create_form) create(create_form)
sender = trilby_models.RemotePerson.objects.get(
remote_url = SENDER_ID,
)
self.assertEqual( self.assertEqual(
sender.display_name, sender.display_name,
TOTALLY, TOTALLY,