tests: Refactor test_realm to fix code duplication.

This replaces individual tests for realm properties with a generic
do_test_realm_update_api function to test each property in the
Realm.property_types attribute.

Addresses part of #3854.
This commit is contained in:
Sarah 2017-04-08 15:35:41 -07:00 committed by Tim Abbott
parent c9140dfa4c
commit bf4d33793f
4 changed files with 89 additions and 121 deletions

View File

@ -433,10 +433,14 @@ def active_humans_in_realm(realm):
def do_set_realm_property(realm, name, value):
# type: (Realm, str, Union[Text, bool, int]) -> None
"""Takes in a realm object, the name of an attribute to update, and the value to update.
"""Takes in a realm object, the name of an attribute to update, and the
value to update.
"""
property_type = Realm.property_types[name]
assert isinstance(value, property_type)
assert isinstance(value, property_type), (
'Cannot update %s: %s is not an instance of %s' % (
name, value, property_type,))
setattr(realm, name, value)
realm.save(update_fields=[name])
event = dict(

View File

@ -151,7 +151,7 @@ class Realm(ModelReprMixin, models.Model):
invite_by_admins_only=bool,
inline_image_preview=bool,
inline_url_embed_preview=bool,
message_retention_days=int,
message_retention_days=(int, type(None)),
name=Text,
name_changes_disabled=bool,
restricted_to_domain=bool,

View File

@ -740,6 +740,8 @@ class EventsRegisterTest(ZulipTestCase):
validator = check_string
elif property_type is int:
validator = check_int
elif property_type == (int, type(None)):
validator = check_int
else:
raise AssertionError("Unexpected property type %s" % (property_type,))

View File

@ -5,7 +5,7 @@ import ujson
from django.http import HttpResponse
from mock import patch
from typing import Any, Dict, List, Text
from typing import Any, Dict, List, Text, Union
from zerver.lib.actions import (
do_change_is_admin,
@ -102,123 +102,6 @@ class RealmTest(ZulipTestCase):
realm = get_realm('zulip')
self.assertNotEqual(realm.description, new_description)
def test_update_realm_api(self):
# type: () -> None
new_name = u'Zulip: Worldwide Exporter of APIs'
email = 'cordelia@zulip.com'
self.login(email)
user_profile = get_user_profile_by_email(email)
do_change_is_admin(user_profile, True)
def set_up_db(attr, value):
# type: (str, Any) -> None
realm = get_realm('zulip')
setattr(realm, attr, value)
realm.save()
def update_with_api(**kwarg):
# type: (**Any) -> Realm
params = {k: ujson.dumps(v) for k, v in kwarg.items()}
result = self.client_patch('/json/realm', params)
self.assert_json_success(result)
return get_realm('zulip') # refresh data
# name
realm = update_with_api(name=new_name)
self.assertEqual(realm.name, new_name)
# restricted
set_up_db('restricted_to_domain', False)
realm = update_with_api(restricted_to_domain=True)
self.assertEqual(realm.restricted_to_domain, True)
realm = update_with_api(restricted_to_domain=False)
self.assertEqual(realm.restricted_to_domain, False)
# invite_required
set_up_db('invite_required', False)
realm = update_with_api(invite_required=True)
self.assertEqual(realm.invite_required, True)
realm = update_with_api(invite_required=False)
self.assertEqual(realm.invite_required, False)
# invite_by_admins_only
set_up_db('invite_by_admins_only', False)
realm = update_with_api(invite_by_admins_only=True)
self.assertEqual(realm.invite_by_admins_only, True)
realm = update_with_api(invite_by_admins_only=False)
self.assertEqual(realm.invite_by_admins_only, False)
# inline_image_preview
set_up_db('inline_image_preview', True)
realm = update_with_api(inline_image_preview=False)
self.assertEqual(realm.inline_image_preview, False)
realm = update_with_api(inline_image_preview=True)
self.assertEqual(realm.inline_image_preview, True)
# inline_url_embed_preview
set_up_db('inline_url_embed_preview', False)
realm = update_with_api(inline_url_embed_preview=True)
self.assertEqual(realm.inline_url_embed_preview, True)
realm = update_with_api(inline_url_embed_preview=False)
self.assertEqual(realm.inline_url_embed_preview, False)
# create_stream_by_admins_only
set_up_db('create_stream_by_admins_only', False)
realm = update_with_api(create_stream_by_admins_only=True)
self.assertEqual(realm.create_stream_by_admins_only, True)
realm = update_with_api(create_stream_by_admins_only=False)
self.assertEqual(realm.create_stream_by_admins_only, False)
# email address change disabled
set_up_db('name_changes_disabled', False)
realm = update_with_api(name_changes_disabled=True)
self.assertEqual(realm.name_changes_disabled, True)
realm = update_with_api(name_changes_disabled=False)
self.assertEqual(realm.name_changes_disabled, False)
# email address change disabled
set_up_db('email_changes_disabled', False)
realm = update_with_api(email_changes_disabled=True)
self.assertEqual(realm.email_changes_disabled, True)
realm = update_with_api(email_changes_disabled=False)
self.assertEqual(realm.email_changes_disabled, False)
# add_emoji_by_admins_only
set_up_db('add_emoji_by_admins_only', False)
realm = update_with_api(add_emoji_by_admins_only=True)
self.assertEqual(realm.add_emoji_by_admins_only, True)
realm = update_with_api(add_emoji_by_admins_only=False)
self.assertEqual(realm.add_emoji_by_admins_only, False)
# allow_message_editing
set_up_db('allow_message_editing', False)
set_up_db('message_content_edit_limit_seconds', 0)
realm = update_with_api(allow_message_editing=True,
message_content_edit_limit_seconds=100)
self.assertEqual(realm.allow_message_editing, True)
self.assertEqual(realm.message_content_edit_limit_seconds, 100)
realm = update_with_api(allow_message_editing=False)
self.assertEqual(realm.allow_message_editing, False)
self.assertEqual(realm.message_content_edit_limit_seconds, 100)
realm = update_with_api(message_content_edit_limit_seconds=200)
self.assertEqual(realm.allow_message_editing, False)
self.assertEqual(realm.message_content_edit_limit_seconds, 200)
# waiting_period_threshold
set_up_db('waiting_period_threshold', 10)
realm = update_with_api(waiting_period_threshold=20)
self.assertEqual(realm.waiting_period_threshold, 20)
realm = update_with_api(waiting_period_threshold=10)
self.assertEqual(realm.waiting_period_threshold, 10)
# retention_period
set_up_db('message_retention_days', 10)
realm = update_with_api(message_retention_days=20)
self.assertEqual(realm.message_retention_days, 20)
realm = update_with_api(message_retention_days=10)
self.assertEqual(realm.message_retention_days, 10)
def test_admin_restrictions_for_changing_realm_name(self):
# type: () -> None
new_name = 'Mice will play while the cat is away'
@ -282,3 +165,82 @@ class RealmTest(ZulipTestCase):
self.assert_json_error(result, "Invalid language '%s'" % (invalid_lang,))
realm = get_realm('zulip')
self.assertNotEqual(realm.default_language, invalid_lang)
class RealmAPITest(ZulipTestCase):
def setUp(self):
# type: () -> None
email = 'cordelia@zulip.com'
self.login(email)
user_profile = get_user_profile_by_email(email)
do_change_is_admin(user_profile, True)
def set_up_db(self, attr, value):
# type: (str, Any) -> None
realm = get_realm('zulip')
setattr(realm, attr, value)
realm.save()
def update_with_api(self, name, value):
# type: (str, Union[Text, int, bool]) -> Realm
result = self.client_patch('/json/realm', {name: ujson.dumps(value)})
self.assert_json_success(result)
return get_realm('zulip') # refresh data
def do_test_realm_update_api(self, name):
# type: (str) -> None
"""Test updating realm properties.
If new realm properties have been added to the Realm model but the
test_values dict below has not been updated, this will raise an
assertion error.
"""
bool_tests = [False, True] # type: List[bool]
test_values = dict(
add_emoji_by_admins_only=bool_tests,
create_stream_by_admins_only=bool_tests,
default_language=[u'de', u'en'],
description=[u'Realm description', u'New description'],
email_changes_disabled=bool_tests,
invite_required=bool_tests,
invite_by_admins_only=bool_tests,
inline_image_preview=bool_tests,
inline_url_embed_preview=bool_tests,
message_retention_days=[10, 20],
name=[u'Zulip', u'New Name'],
name_changes_disabled=bool_tests,
restricted_to_domain=bool_tests,
waiting_period_threshold=[10, 20],
) # type: Dict[str, Any]
vals = test_values.get(name)
if vals is None:
raise AssertionError('No test created for %s' % (name))
self.set_up_db(name, vals[0])
realm = self.update_with_api(name, vals[1])
self.assertEqual(getattr(realm, name), vals[1])
realm = self.update_with_api(name, vals[0])
self.assertEqual(getattr(realm, name), vals[0])
def test_update_realm_properties(self):
# type: () -> None
for prop in Realm.property_types:
self.do_test_realm_update_api(prop)
def test_update_realm_allow_message_editing(self):
# type: () -> None
"""Tests updating the realm property 'allow_message_editing'."""
self.set_up_db('allow_message_editing', False)
self.set_up_db('message_content_edit_limit_seconds', 0)
realm = self.update_with_api('allow_message_editing', True)
realm = self.update_with_api('message_content_edit_limit_seconds', 100)
self.assertEqual(realm.allow_message_editing, True)
self.assertEqual(realm.message_content_edit_limit_seconds, 100)
realm = self.update_with_api('allow_message_editing', False)
self.assertEqual(realm.allow_message_editing, False)
self.assertEqual(realm.message_content_edit_limit_seconds, 100)
realm = self.update_with_api('message_content_edit_limit_seconds', 200)
self.assertEqual(realm.allow_message_editing, False)
self.assertEqual(realm.message_content_edit_limit_seconds, 200)