mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 11:26:09 -04:00
Add a ModuleApi method to update a user's membership in a room (#11147)
Co-authored-by: reivilibre <oliverw@matrix.org>
This commit is contained in:
parent
1bfd141205
commit
adc0d35b17
3 changed files with 225 additions and 2 deletions
|
@ -20,7 +20,7 @@ from synapse.events import EventBase
|
|||
from synapse.federation.units import Transaction
|
||||
from synapse.handlers.presence import UserPresenceState
|
||||
from synapse.rest import admin
|
||||
from synapse.rest.client import login, presence, room
|
||||
from synapse.rest.client import login, presence, profile, room
|
||||
from synapse.types import create_requester
|
||||
|
||||
from tests.events.test_presence_router import send_presence_update, sync_presence
|
||||
|
@ -37,6 +37,7 @@ class ModuleApiTestCase(HomeserverTestCase):
|
|||
login.register_servlets,
|
||||
room.register_servlets,
|
||||
presence.register_servlets,
|
||||
profile.register_servlets,
|
||||
]
|
||||
|
||||
def prepare(self, reactor, clock, homeserver):
|
||||
|
@ -385,6 +386,129 @@ class ModuleApiTestCase(HomeserverTestCase):
|
|||
|
||||
self.assertTrue(found_update)
|
||||
|
||||
def test_update_membership(self):
|
||||
"""Tests that the module API can update the membership of a user in a room."""
|
||||
peter = self.register_user("peter", "hackme")
|
||||
lesley = self.register_user("lesley", "hackme")
|
||||
tok = self.login("peter", "hackme")
|
||||
lesley_tok = self.login("lesley", "hackme")
|
||||
|
||||
# Make peter create a public room.
|
||||
room_id = self.helper.create_room_as(
|
||||
room_creator=peter, is_public=True, tok=tok
|
||||
)
|
||||
|
||||
# Set a profile for lesley.
|
||||
channel = self.make_request(
|
||||
method="PUT",
|
||||
path="/_matrix/client/r0/profile/%s/displayname" % lesley,
|
||||
content={"displayname": "Lesley May"},
|
||||
access_token=lesley_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(channel.code, 200, channel.result)
|
||||
|
||||
channel = self.make_request(
|
||||
method="PUT",
|
||||
path="/_matrix/client/r0/profile/%s/avatar_url" % lesley,
|
||||
content={"avatar_url": "some_url"},
|
||||
access_token=lesley_tok,
|
||||
)
|
||||
|
||||
self.assertEqual(channel.code, 200, channel.result)
|
||||
|
||||
# Make Peter invite Lesley to the room.
|
||||
self.get_success(
|
||||
defer.ensureDeferred(
|
||||
self.module_api.update_room_membership(peter, lesley, room_id, "invite")
|
||||
)
|
||||
)
|
||||
|
||||
res = self.helper.get_state(
|
||||
room_id=room_id,
|
||||
event_type="m.room.member",
|
||||
state_key=lesley,
|
||||
tok=tok,
|
||||
)
|
||||
|
||||
# Check the membership is correct.
|
||||
self.assertEqual(res["membership"], "invite")
|
||||
|
||||
# Also check that the profile was correctly filled out, and that it's not
|
||||
# Peter's.
|
||||
self.assertEqual(res["displayname"], "Lesley May")
|
||||
self.assertEqual(res["avatar_url"], "some_url")
|
||||
|
||||
# Make lesley join it.
|
||||
self.get_success(
|
||||
defer.ensureDeferred(
|
||||
self.module_api.update_room_membership(lesley, lesley, room_id, "join")
|
||||
)
|
||||
)
|
||||
|
||||
# Check that the membership of lesley in the room is "join".
|
||||
res = self.helper.get_state(
|
||||
room_id=room_id,
|
||||
event_type="m.room.member",
|
||||
state_key=lesley,
|
||||
tok=tok,
|
||||
)
|
||||
|
||||
self.assertEqual(res["membership"], "join")
|
||||
|
||||
# Also check that the profile was correctly filled out.
|
||||
self.assertEqual(res["displayname"], "Lesley May")
|
||||
self.assertEqual(res["avatar_url"], "some_url")
|
||||
|
||||
# Make peter kick lesley from the room.
|
||||
self.get_success(
|
||||
defer.ensureDeferred(
|
||||
self.module_api.update_room_membership(peter, lesley, room_id, "leave")
|
||||
)
|
||||
)
|
||||
|
||||
# Check that the membership of lesley in the room is "leave".
|
||||
res = self.helper.get_state(
|
||||
room_id=room_id,
|
||||
event_type="m.room.member",
|
||||
state_key=lesley,
|
||||
tok=tok,
|
||||
)
|
||||
|
||||
self.assertEqual(res["membership"], "leave")
|
||||
|
||||
# Try to send a membership update from a non-local user and check that it fails.
|
||||
d = defer.ensureDeferred(
|
||||
self.module_api.update_room_membership(
|
||||
"@nicolas:otherserver.com",
|
||||
lesley,
|
||||
room_id,
|
||||
"invite",
|
||||
)
|
||||
)
|
||||
|
||||
self.get_failure(d, RuntimeError)
|
||||
|
||||
# Check that inviting a user that doesn't have a profile falls back to using a
|
||||
# default (localpart + no avatar) profile.
|
||||
simone = "@simone:" + self.hs.config.server.server_name
|
||||
self.get_success(
|
||||
defer.ensureDeferred(
|
||||
self.module_api.update_room_membership(peter, simone, room_id, "invite")
|
||||
)
|
||||
)
|
||||
|
||||
res = self.helper.get_state(
|
||||
room_id=room_id,
|
||||
event_type="m.room.member",
|
||||
state_key=simone,
|
||||
tok=tok,
|
||||
)
|
||||
|
||||
self.assertEqual(res["membership"], "invite")
|
||||
self.assertEqual(res["displayname"], "simone")
|
||||
self.assertIsNone(res["avatar_url"])
|
||||
|
||||
|
||||
class ModuleApiWorkerTestCase(BaseMultiWorkerStreamTestCase):
|
||||
"""For testing ModuleApi functionality in a multi-worker setup"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue