Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Land basic reaction and edit support. #5209

Merged
merged 24 commits into from
May 20, 2019
Merged
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ae69a6a
Merge branch 'erikj/async_serialize_event' into erikj/reactions_rebase
erikjohnston May 14, 2019
495e859
Merge branch 'erikj/fix_config_ratelimiting' into erikj/test
erikjohnston May 14, 2019
a9fc71c
Merge branch 'erikj/refactor_pagination_bounds' into erikj/reactions_…
erikjohnston May 15, 2019
efe3c79
Add simple send_relation API and track in DB
erikjohnston May 14, 2019
b50641e
Add simple pagination API
erikjohnston May 14, 2019
5fb72e6
Newsfile
erikjohnston May 14, 2019
e6459c2
Actually implement idempotency
erikjohnston May 15, 2019
5be34fc
Actually check for None rather falsey
erikjohnston May 15, 2019
f201a30
Merge pull request #5186 from matrix-org/erikj/simple_pagination
erikjohnston May 16, 2019
a060352
Add aggregations API
erikjohnston May 14, 2019
3345341
Add cache to relations
erikjohnston May 16, 2019
b5c62c6
Fix relations in worker mode
erikjohnston May 16, 2019
95f3fcd
Check that event is visible in new APIs
erikjohnston May 16, 2019
2c662dd
Indirect tuple conversion
erikjohnston May 16, 2019
7a7eba8
Move parsing of tokens out of storage layer
erikjohnston May 16, 2019
5c39d26
Merge pull request #5192 from matrix-org/erikj/relations_aggregations
erikjohnston May 16, 2019
d46aab3
Add basic editing support
erikjohnston May 14, 2019
5dbff34
Fixup bsaed on review comments
erikjohnston May 17, 2019
d4ca533
Make tests use different user for each reaction it sends
erikjohnston May 17, 2019
210cb6d
Merge pull request #5195 from matrix-org/erikj/edits
erikjohnston May 20, 2019
935af0d
Correctly update aggregation counts after redaction
erikjohnston May 20, 2019
2ac9c96
Fixup comments
erikjohnston May 20, 2019
9ad246e
Merge pull request #5207 from matrix-org/erikj/reactions_redactions
erikjohnston May 20, 2019
0667105
Newsfile
erikjohnston May 20, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Make tests use different user for each reaction it sends
As users aren't allowed to react with the same emoji more than once.
  • Loading branch information
erikjohnston committed May 17, 2019
commit d4ca533d702e9518244b8ca6e1861a7c8f64adf1
80 changes: 68 additions & 12 deletions tests/rest/client/v2_alpha/test_relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,22 @@
import six

from synapse.api.constants import EventTypes, RelationTypes
from synapse.rest import admin
from synapse.rest.client.v1 import login, room
from synapse.rest.client.v2_alpha import relations
from synapse.rest.client.v2_alpha import register, relations

from tests import unittest


class RelationsTestCase(unittest.HomeserverTestCase):
user_id = "@alice:test"
servlets = [
relations.register_servlets,
room.register_servlets,
login.register_servlets,
register.register_servlets,
admin.register_servlets_for_client_rest_resource,
]
hijack_auth = False

def make_homeserver(self, reactor, clock):
# We need to enable msc1849 support for aggregations
Expand All @@ -40,8 +43,12 @@ def make_homeserver(self, reactor, clock):
return self.setup_test_homeserver(config=config)

def prepare(self, reactor, clock, hs):
self.room = self.helper.create_room_as(self.user_id)
res = self.helper.send(self.room, body="Hi!")
self.user_id, self.user_token = self._create_user("alice")
self.user2_id, self.user2_token = self._create_user("bob")

self.room = self.helper.create_room_as(self.user_id, tok=self.user_token)
self.helper.join(self.room, user=self.user2_id, tok=self.user2_token)
res = self.helper.send(self.room, body="Hi!", tok=self.user_token)
self.parent_id = res["event_id"]

def test_send_relation(self):
Expand All @@ -55,7 +62,9 @@ def test_send_relation(self):
event_id = channel.json_body["event_id"]

request, channel = self.make_request(
"GET", "/rooms/%s/event/%s" % (self.room, event_id)
"GET",
"/rooms/%s/event/%s" % (self.room, event_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -95,6 +104,7 @@ def test_basic_paginate_relations(self):
"GET",
"/_matrix/client/unstable/rooms/%s/relations/%s?limit=1"
% (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -135,6 +145,7 @@ def test_repeated_paginate_relations(self):
"GET",
"/_matrix/client/unstable/rooms/%s/relations/%s?limit=1%s"
% (self.room, self.parent_id, from_token),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand All @@ -156,15 +167,32 @@ def test_aggregation_pagination_groups(self):
"""Test that we can paginate annotation groups correctly.
"""

# We need to create ten separate users to send each reaction.
access_tokens = [self.user_token, self.user2_token]
idx = 0
while len(access_tokens) < 10:
user_id, token = self._create_user("test" + str(idx))
idx += 1

self.helper.join(self.room, user=user_id, tok=token)
access_tokens.append(token)

idx = 0
sent_groups = {u"👍": 10, u"a": 7, u"b": 5, u"c": 3, u"d": 2, u"e": 1}
for key in itertools.chain.from_iterable(
itertools.repeat(key, num) for key, num in sent_groups.items()
):
channel = self._send_relation(
RelationTypes.ANNOTATION, "m.reaction", key=key
RelationTypes.ANNOTATION,
"m.reaction",
key=key,
access_token=access_tokens[idx],
)
self.assertEquals(200, channel.code, channel.json_body)

idx += 1
idx %= len(access_tokens)

prev_token = None
found_groups = {}
for _ in range(20):
Expand All @@ -176,6 +204,7 @@ def test_aggregation_pagination_groups(self):
"GET",
"/_matrix/client/unstable/rooms/%s/aggregations/%s?limit=1%s"
% (self.room, self.parent_id, from_token),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -236,6 +265,7 @@ def test_aggregation_pagination_within_group(self):
encoded_key,
from_token,
),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -263,7 +293,9 @@ def test_aggregation(self):
channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "a")
self.assertEquals(200, channel.code, channel.json_body)

channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "a")
channel = self._send_relation(
RelationTypes.ANNOTATION, "m.reaction", "a", access_token=self.user2_token
)
self.assertEquals(200, channel.code, channel.json_body)

channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "b")
Expand All @@ -273,6 +305,7 @@ def test_aggregation(self):
"GET",
"/_matrix/client/unstable/rooms/%s/aggregations/%s"
% (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand All @@ -295,6 +328,7 @@ def test_aggregation_must_be_annotation(self):
"GET",
"/_matrix/client/unstable/rooms/%s/aggregations/%s/m.replace?limit=1"
% (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(400, channel.code, channel.json_body)
Expand All @@ -307,7 +341,9 @@ def test_aggregation_get_event(self):
channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "a")
self.assertEquals(200, channel.code, channel.json_body)

channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "a")
channel = self._send_relation(
RelationTypes.ANNOTATION, "m.reaction", "a", access_token=self.user2_token
)
self.assertEquals(200, channel.code, channel.json_body)

channel = self._send_relation(RelationTypes.ANNOTATION, "m.reaction", "b")
Expand All @@ -322,7 +358,9 @@ def test_aggregation_get_event(self):
reply_2 = channel.json_body["event_id"]

request, channel = self.make_request(
"GET", "/rooms/%s/event/%s" % (self.room, self.parent_id)
"GET",
"/rooms/%s/event/%s" % (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -357,7 +395,9 @@ def test_edit(self):
edit_event_id = channel.json_body["event_id"]

request, channel = self.make_request(
"GET", "/rooms/%s/event/%s" % (self.room, self.parent_id)
"GET",
"/rooms/%s/event/%s" % (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand Down Expand Up @@ -407,7 +447,9 @@ def test_multi_edit(self):
self.assertEquals(200, channel.code, channel.json_body)

request, channel = self.make_request(
"GET", "/rooms/%s/event/%s" % (self.room, self.parent_id)
"GET",
"/rooms/%s/event/%s" % (self.room, self.parent_id),
access_token=self.user_token,
)
self.render(request)
self.assertEquals(200, channel.code, channel.json_body)
Expand All @@ -419,7 +461,9 @@ def test_multi_edit(self):
{RelationTypes.REPLACES: {"event_id": edit_event_id}},
)

def _send_relation(self, relation_type, event_type, key=None, content={}):
def _send_relation(
self, relation_type, event_type, key=None, content={}, access_token=None
):
"""Helper function to send a relation pointing at `self.parent_id`

Args:
Expand All @@ -428,10 +472,15 @@ def _send_relation(self, relation_type, event_type, key=None, content={}):
key (str|None): The aggregation key used for m.annotation relation
type.
content(dict|None): The content of the created event.
access_token (str|None): The access token used to send the relation,
defaults to `self.user_token`

Returns:
FakeChannel
"""
if not access_token:
access_token = self.user_token

query = ""
if key:
query = "?key=" + six.moves.urllib.parse.quote_plus(key.encode("utf-8"))
Expand All @@ -441,6 +490,13 @@ def _send_relation(self, relation_type, event_type, key=None, content={}):
"/_matrix/client/unstable/rooms/%s/send_relation/%s/%s/%s%s"
% (self.room, self.parent_id, relation_type, event_type, query),
json.dumps(content).encode("utf-8"),
access_token=access_token,
)
self.render(request)
return channel

def _create_user(self, localpart):
user_id = self.register_user(localpart, "abc123")
access_token = self.login(localpart, "abc123")

return user_id, access_token