Files
zulip/zerver/tests/test_muting_users.py
Abhijeet Prasad Bodas 3bfcaa3968 mute user: Add backend infrastructure code.
Adds backend code for the mute users feature.
This is just infrastructure work (database
interactions, helpers, tests, events, API docs
etc) and does not involve any behavioral/semantic
aspects of muted users.

Adds POST and DELETE endpoints, to keep the
URL scheme mostly consistent in terms of `users/me`.

TODOs:
1. Add tests for exporting `zulip_muteduser` database table.
2. Add dedicated methods to python-zulip-api to be used
   in place of the current `client.call_endpoint` implementation.
2021-04-06 18:44:08 -07:00

124 lines
4.3 KiB
Python

from datetime import datetime, timezone
from unittest import mock
from zerver.lib.test_classes import ZulipTestCase
from zerver.lib.timestamp import datetime_to_timestamp
from zerver.lib.user_mutes import add_user_mute, get_user_mutes, user_is_muted
class MutedUsersTests(ZulipTestCase):
def test_get_user_mutes(self) -> None:
othello = self.example_user("othello")
cordelia = self.example_user("cordelia")
muted_users = get_user_mutes(othello)
self.assertEqual(muted_users, [])
mute_time = datetime(2021, 1, 1, tzinfo=timezone.utc)
with mock.patch(
"zerver.lib.user_mutes.timezone_now",
return_value=mute_time,
):
add_user_mute(user_profile=othello, muted_user=cordelia)
muted_users = get_user_mutes(othello)
self.assertEqual(len(muted_users), 1)
self.assertDictEqual(
muted_users[0],
{
"id": cordelia.id,
"timestamp": datetime_to_timestamp(mute_time),
},
)
def test_add_muted_user_mute_self(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
url = "/api/v1/users/me/muted_users/{}".format(user.id)
result = self.api_post(user, url)
self.assert_json_error(result, "Cannot mute self")
def test_add_muted_user_mute_bot(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
bot_info = {
"full_name": "The Bot of Hamlet",
"short_name": "hambot",
"bot_type": "1",
}
result = self.client_post("/json/bots", bot_info)
self.assert_json_success(result)
muted_id = result.json()["user_id"]
url = "/api/v1/users/me/muted_users/{}".format(muted_id)
result = self.api_post(user, url)
# Currently we do not allow muting bots. This is the error message
# from `access_user_by_id`.
self.assert_json_error(result, "No such user")
def test_add_muted_user_mute_twice(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
muted_user = self.example_user("cordelia")
muted_id = muted_user.id
add_user_mute(
user_profile=user,
muted_user=muted_user,
)
url = "/api/v1/users/me/muted_users/{}".format(muted_id)
result = self.api_post(user, url)
self.assert_json_error(result, "User already muted")
def test_add_muted_user_valid_data(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
muted_user = self.example_user("cordelia")
muted_id = muted_user.id
mock_date_muted = datetime(2021, 1, 1, tzinfo=timezone.utc).timestamp()
with mock.patch(
"zerver.views.muting.timezone_now",
return_value=datetime(2021, 1, 1, tzinfo=timezone.utc),
):
url = "/api/v1/users/me/muted_users/{}".format(muted_id)
result = self.api_post(user, url)
self.assert_json_success(result)
self.assertIn({"id": muted_id, "timestamp": mock_date_muted}, get_user_mutes(user))
self.assertTrue(user_is_muted(user, muted_user))
def test_remove_muted_user_unmute_before_muting(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
muted_user = self.example_user("cordelia")
muted_id = muted_user.id
url = "/api/v1/users/me/muted_users/{}".format(muted_id)
result = self.api_delete(user, url)
self.assert_json_error(result, "User is not muted")
def test_remove_muted_user_valid_data(self) -> None:
user = self.example_user("hamlet")
self.login_user(user)
muted_user = self.example_user("cordelia")
muted_id = muted_user.id
add_user_mute(
user_profile=user,
muted_user=muted_user,
date_muted=datetime(2021, 1, 1, tzinfo=timezone.utc),
)
url = "/api/v1/users/me/muted_users/{}".format(muted_id)
result = self.api_delete(user, url)
mock_date_muted = datetime(2021, 1, 1, tzinfo=timezone.utc).timestamp()
self.assert_json_success(result)
self.assertNotIn({"id": muted_id, "timestamp": mock_date_muted}, get_user_mutes(user))
self.assertFalse(user_is_muted(user, muted_user))