-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Prevent duplicate push notifications for room reads #11835
Changes from 6 commits
10acfc7
e417f14
e5bfb55
f41ec2d
6297735
f2767e9
c6eae47
88a163d
2203143
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Make a `POST` to `/rooms/<room_id>/receipt/m.read/<event_id>` only trigger a push notification if the count of unread messages is different to the one in the last successfully sent push. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -572,7 +572,7 @@ def test_push_unread_count_group_by_room(self): | |
| # | ||
| # This push should still only contain an unread count of 1 (for 1 unread room) | ||
| self.assertEqual( | ||
| self.push_attempts[5][2]["notification"]["counts"]["unread"], 1 | ||
| self.push_attempts[4][2]["notification"]["counts"]["unread"], 1 | ||
| ) | ||
|
|
||
| @override_config({"push": {"group_unread_count_by_room": False}}) | ||
|
|
@@ -585,10 +585,10 @@ def test_push_unread_count_message_count(self): | |
|
|
||
| # Carry out our option-value specific test | ||
| # | ||
| # We're counting every unread message, so there should now be 4 since the | ||
| # We're counting every unread message, so there should now be 3 since the | ||
| # last read receipt | ||
| self.assertEqual( | ||
| self.push_attempts[5][2]["notification"]["counts"]["unread"], 4 | ||
| self.push_attempts[5][2]["notification"]["counts"]["unread"], 3 | ||
| ) | ||
|
|
||
| def _test_push_unread_count(self): | ||
|
|
@@ -597,8 +597,9 @@ def _test_push_unread_count(self): | |
|
|
||
| Note that: | ||
| * Sending messages will cause push notifications to go out to relevant users | ||
| * Sending a read receipt will cause a "badge update" notification to go out to | ||
| the user that sent the receipt | ||
| * Sending a read receipt will cause the HTTP pusher to check whether the unread | ||
| count has changed since the last push notification. If so, a "badge update" | ||
| notification goes out to the user that sent the receipt | ||
| """ | ||
| # Register the user who gets notified | ||
| user_id = self.register_user("user", "pass") | ||
|
|
@@ -642,81 +643,87 @@ def _test_push_unread_count(self): | |
| # position in the room. We'll set the read position to this event in a moment | ||
| first_message_event_id = response["event_id"] | ||
|
|
||
| # Advance time a bit (so the pusher will register something has happened) and | ||
| # make the push succeed | ||
| self.push_attempts[0][0].callback({}) | ||
| expected_push_attempts = 1 | ||
| self._check_push_attempt(expected_push_attempts, 0) | ||
|
|
||
| self._send_read_request(access_token, first_message_event_id, room_id) | ||
|
|
||
| # Unread count has not changed. Therefore, ensure that read request does not | ||
| # trigger a push notification. | ||
| self.assertEqual(len(self.push_attempts), 1) | ||
|
|
||
| # Send another message | ||
| response2 = self.helper.send( | ||
| room_id, body="How's the weather today?", tok=other_access_token | ||
| ) | ||
| second_message_event_id = response2["event_id"] | ||
|
|
||
| expected_push_attempts += 1 | ||
|
|
||
| self._check_push_attempt(expected_push_attempts, 1) | ||
|
|
||
| self._send_read_request(access_token, second_message_event_id, room_id) | ||
| expected_push_attempts += 1 | ||
|
|
||
| self._check_push_attempt(expected_push_attempts, 0) | ||
|
|
||
| # Since we're grouping by room, sending more messages shouldn't increase the | ||
| # unread count, as they're all being sent in the same room | ||
| self.helper.send(room_id, body="Hello?", tok=other_access_token) | ||
| expected_push_attempts += 1 | ||
|
|
||
| self._advance_time_and_make_push_succeed(expected_push_attempts) | ||
|
|
||
| self.helper.send(room_id, body="Hello??", tok=other_access_token) | ||
| expected_push_attempts += 1 | ||
|
|
||
| self._advance_time_and_make_push_succeed(expected_push_attempts) | ||
|
|
||
| self.helper.send(room_id, body="HELLO???", tok=other_access_token) | ||
| expected_push_attempts += 1 | ||
|
|
||
| self._advance_time_and_make_push_succeed(expected_push_attempts) | ||
|
|
||
| self.assertEqual(len(self.push_attempts), 6) | ||
|
|
||
| def _advance_time_and_make_push_succeed(self, expected_push_attempts): | ||
| self.pump() | ||
| self.push_attempts[expected_push_attempts - 1][0].callback({}) | ||
|
|
||
| def _check_push_attempt( | ||
| self, expected_push_attempts, expected_unread_count_last_push | ||
lukasdenk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ): | ||
| """ | ||
| Makes sure that the last expected push attempt succeeds and checks whether | ||
| it contains the expected unread count. | ||
| """ | ||
| self._advance_time_and_make_push_succeed(expected_push_attempts) | ||
| # Check our push made it | ||
| self.assertEqual(len(self.push_attempts), 1) | ||
| self.assertEqual(len(self.push_attempts), expected_push_attempts) | ||
| self.assertEqual( | ||
| self.push_attempts[0][1], "http://example.com/_matrix/push/v1/notify" | ||
| self.push_attempts[expected_push_attempts - 1][1], | ||
| "http://example.com/_matrix/push/v1/notify", | ||
| ) | ||
|
|
||
| # Check that the unread count for the room is 0 | ||
| # | ||
| # The unread count is zero as the user has no read receipt in the room yet | ||
| self.assertEqual( | ||
| self.push_attempts[0][2]["notification"]["counts"]["unread"], 0 | ||
| self.push_attempts[expected_push_attempts - 1][2]["notification"]["counts"][ | ||
lukasdenk marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "unread" | ||
| ], | ||
| expected_unread_count_last_push, | ||
| ) | ||
|
|
||
| def _send_read_request(self, access_token, message_event_id, room_id): | ||
| # Now set the user's read receipt position to the first event | ||
| # | ||
| # This will actually trigger a new notification to be sent out so that | ||
| # even if the user does not receive another message, their unread | ||
| # count goes down | ||
| channel = self.make_request( | ||
| "POST", | ||
| "/rooms/%s/receipt/m.read/%s" % (room_id, first_message_event_id), | ||
| "/rooms/%s/receipt/m.read/%s" % (room_id, message_event_id), | ||
| {}, | ||
| access_token=access_token, | ||
| ) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there's a comment just above 'This will actually trigger a new notification to be sent out so that even if the user does not receive another message, their unread count goes down'... It doesn't make much sense to me though because it was already at zero right before. I would say 'I think it may be worth removing the comment', but this test is trying to test that pushes go out when you read something. As it stands, we're not testing that anymore. The test currently looks like:
I wonder if it should look like this:
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I think I will start working on that issue by the beginning of next week.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @reivilibre: I still refactored the test a bit. If you do not like it, the commit before preserves |
||
| self.assertEqual(channel.code, 200, channel.json_body) | ||
|
|
||
| # Advance time and make the push succeed | ||
| self.push_attempts[1][0].callback({}) | ||
| self.pump() | ||
|
|
||
| # Unread count is still zero as we've read the only message in the room | ||
| self.assertEqual(len(self.push_attempts), 2) | ||
| self.assertEqual( | ||
| self.push_attempts[1][2]["notification"]["counts"]["unread"], 0 | ||
| ) | ||
|
|
||
| # Send another message | ||
| self.helper.send( | ||
| room_id, body="How's the weather today?", tok=other_access_token | ||
| ) | ||
|
|
||
| # Advance time and make the push succeed | ||
| self.push_attempts[2][0].callback({}) | ||
| self.pump() | ||
|
|
||
| # This push should contain an unread count of 1 as there's now been one | ||
| # message since our last read receipt | ||
| self.assertEqual(len(self.push_attempts), 3) | ||
| self.assertEqual( | ||
| self.push_attempts[2][2]["notification"]["counts"]["unread"], 1 | ||
| ) | ||
|
|
||
| # Since we're grouping by room, sending more messages shouldn't increase the | ||
| # unread count, as they're all being sent in the same room | ||
| self.helper.send(room_id, body="Hello?", tok=other_access_token) | ||
|
|
||
| # Advance time and make the push succeed | ||
| self.pump() | ||
| self.push_attempts[3][0].callback({}) | ||
|
|
||
| self.helper.send(room_id, body="Hello??", tok=other_access_token) | ||
|
|
||
| # Advance time and make the push succeed | ||
| self.pump() | ||
| self.push_attempts[4][0].callback({}) | ||
|
|
||
| self.helper.send(room_id, body="HELLO???", tok=other_access_token) | ||
|
|
||
| # Advance time and make the push succeed | ||
| self.pump() | ||
| self.push_attempts[5][0].callback({}) | ||
|
|
||
| self.assertEqual(len(self.push_attempts), 6) | ||
Uh oh!
There was an error while loading. Please reload this page.