mirror of
https://github.com/zulip/zulip.git
synced 2025-11-02 04:53:36 +00:00
analytics tests: Refactor assertCountEquals calls to be more readable.
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
@@ -13,7 +15,8 @@ from zerver.models import Realm, UserProfile, Message, Stream, Recipient, \
|
|||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from typing import Any, Type, Optional, Text, Tuple
|
from six.moves import range
|
||||||
|
from typing import Any, Type, Optional, Text, Tuple, List, Union
|
||||||
|
|
||||||
class AnalyticsTestCase(TestCase):
|
class AnalyticsTestCase(TestCase):
|
||||||
MINUTE = timedelta(seconds = 60)
|
MINUTE = timedelta(seconds = 60)
|
||||||
@@ -103,6 +106,51 @@ class AnalyticsTestCase(TestCase):
|
|||||||
queryset = queryset.filter(subgroup=subgroup)
|
queryset = queryset.filter(subgroup=subgroup)
|
||||||
self.assertEqual(queryset.values_list('value', flat=True)[0], value)
|
self.assertEqual(queryset.values_list('value', flat=True)[0], value)
|
||||||
|
|
||||||
|
def assertTableState(self, table, arg_keys, arg_values):
|
||||||
|
# type: (Type[BaseCount], List[str], List[List[Union[int, str, Realm, UserProfile, Stream]]]) -> None
|
||||||
|
"""Assert that the state of a *Count table is what it should be.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
self.assertTableState(RealmCount, ['property', 'subgroup', 'realm'],
|
||||||
|
[['p1', 4], ['p2', 10, self.alt_realm]])
|
||||||
|
|
||||||
|
table -- A *Count table.
|
||||||
|
arg_keys -- List of columns of <table>.
|
||||||
|
arg_values -- List of "rows" of <table>.
|
||||||
|
Each entry of arg_values (e.g. ['p1', 4]) represents a row of <table>.
|
||||||
|
The i'th value of the entry corresponds to the i'th arg_key, so e.g.
|
||||||
|
the first arg_values entry here corresponds to a row of RealmCount
|
||||||
|
with property='p1' and subgroup=10.
|
||||||
|
Any columns not specified (in this case, every column of RealmCount
|
||||||
|
other than property and subgroup) are either set to default values,
|
||||||
|
or are ignored.
|
||||||
|
|
||||||
|
The function checks that every entry of arg_values matches exactly one
|
||||||
|
row of <table>, and that no additional rows exist. Note that this means
|
||||||
|
checking a table with duplicate rows is not supported.
|
||||||
|
"""
|
||||||
|
defaults = {
|
||||||
|
'property': self.current_property,
|
||||||
|
'subgroup': None,
|
||||||
|
'end_time': self.TIME_ZERO,
|
||||||
|
'interval': self.current_interval}
|
||||||
|
for values in arg_values:
|
||||||
|
kwargs = {} # type: Dict[str, Any]
|
||||||
|
for i in range(len(values)):
|
||||||
|
kwargs[arg_keys[i]] = values[i]
|
||||||
|
for key, value in defaults.items():
|
||||||
|
kwargs[key] = kwargs.get(key, value)
|
||||||
|
if table is not InstallationCount:
|
||||||
|
if 'realm' not in kwargs:
|
||||||
|
if 'user' in kwargs:
|
||||||
|
kwargs['realm'] = kwargs['user'].realm
|
||||||
|
elif 'stream' in kwargs:
|
||||||
|
kwargs['realm'] = kwargs['stream'].realm
|
||||||
|
else:
|
||||||
|
kwargs['realm'] = self.default_realm
|
||||||
|
self.assertEqual(table.objects.filter(**kwargs).count(), 1)
|
||||||
|
self.assertEqual(table.objects.count(), len(arg_values))
|
||||||
|
|
||||||
class TestProcessCountStat(AnalyticsTestCase):
|
class TestProcessCountStat(AnalyticsTestCase):
|
||||||
def make_dummy_count_stat(self, current_time):
|
def make_dummy_count_stat(self, current_time):
|
||||||
# type: (datetime) -> CountStat
|
# type: (datetime) -> CountStat
|
||||||
@@ -199,16 +247,13 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
||||||
|
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup='true')
|
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
|
||||||
self.assertCountEquals(RealmCount, 1, subgroup='false')
|
[[2, 'true'], [1, 'false'],
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup='false', realm=self.second_realm)
|
[3, 'false', self.second_realm],
|
||||||
self.assertCountEquals(RealmCount, 1, subgroup='false', realm=self.no_message_realm)
|
[1, 'false', self.no_message_realm]])
|
||||||
self.assertEqual(RealmCount.objects.count(), 4)
|
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[2, 'true'], [5, 'false']])
|
||||||
self.assertCountEquals(InstallationCount, 2, subgroup='true')
|
self.assertTableState(UserCount, [], [])
|
||||||
self.assertCountEquals(InstallationCount, 5, subgroup='false')
|
self.assertTableState(StreamCount, [], [])
|
||||||
self.assertEqual(InstallationCount.objects.count(), 2)
|
|
||||||
self.assertFalse(UserCount.objects.exists())
|
|
||||||
self.assertFalse(StreamCount.objects.exists())
|
|
||||||
|
|
||||||
def test_messages_sent(self):
|
def test_messages_sent(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@@ -231,17 +276,11 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
||||||
|
|
||||||
self.assertCountEquals(UserCount, 1, user=user1)
|
self.assertTableState(UserCount, ['value', 'user'],
|
||||||
self.assertCountEquals(UserCount, 3, user=user2)
|
[[1, user1], [3, user2], [1, self.hourly_user]])
|
||||||
self.assertCountEquals(UserCount, 1, realm=self.second_realm,
|
self.assertTableState(RealmCount, ['value', 'realm'], [[4], [1, self.second_realm]])
|
||||||
user=self.hourly_user)
|
self.assertTableState(InstallationCount, ['value'], [[5]])
|
||||||
self.assertEqual(UserCount.objects.count(), 3)
|
self.assertTableState(StreamCount, [], [])
|
||||||
self.assertCountEquals(RealmCount, 4)
|
|
||||||
self.assertCountEquals(RealmCount, 1, realm=self.second_realm)
|
|
||||||
self.assertEqual(RealmCount.objects.count(), 2)
|
|
||||||
self.assertCountEquals(InstallationCount, 5)
|
|
||||||
self.assertEqual(InstallationCount.objects.count(), 1)
|
|
||||||
self.assertFalse(StreamCount.objects.exists())
|
|
||||||
|
|
||||||
def test_messages_sent_by_is_bot(self):
|
def test_messages_sent_by_is_bot(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@@ -265,22 +304,13 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
||||||
|
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='false', user=human1)
|
self.assertTableState(UserCount, ['value', 'subgroup', 'user'],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='false', user=human2)
|
[[1, 'false', human1], [1, 'false', human2], [3, 'true', bot],
|
||||||
self.assertCountEquals(UserCount, 3, subgroup='true', user=bot)
|
[1, 'false', self.hourly_user], [1, 'false', self.daily_user]])
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='false', realm=self.second_realm,
|
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
|
||||||
user=self.hourly_user)
|
[[2, 'false'], [3, 'true'], [2, 'false', self.second_realm]])
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='false', realm=self.second_realm,
|
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[4, 'false'], [3, 'true']])
|
||||||
user=self.daily_user)
|
self.assertTableState(StreamCount, [], [])
|
||||||
self.assertEqual(UserCount.objects.count(), 5)
|
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup='false')
|
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup='true')
|
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup='false', realm=self.second_realm)
|
|
||||||
self.assertEqual(RealmCount.objects.count(), 3)
|
|
||||||
self.assertCountEquals(InstallationCount, 4, subgroup='false')
|
|
||||||
self.assertCountEquals(InstallationCount, 3, subgroup='true')
|
|
||||||
self.assertEqual(InstallationCount.objects.count(), 2)
|
|
||||||
self.assertFalse(StreamCount.objects.exists())
|
|
||||||
|
|
||||||
def test_messages_sent_by_message_type(self):
|
def test_messages_sent_by_message_type(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@@ -326,31 +356,22 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
||||||
|
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='private_stream', user=user1)
|
self.assertTableState(UserCount, ['value', 'subgroup', 'user'],
|
||||||
self.assertCountEquals(UserCount, 2, subgroup='private_stream', user=user2)
|
[[1, 'private_stream', user1],
|
||||||
self.assertCountEquals(UserCount, 2, subgroup='public_stream', user=user1)
|
[2, 'private_stream', user2],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='public_stream', user=user2)
|
[2, 'public_stream', user1],
|
||||||
self.assertCountEquals(UserCount, 2, subgroup='private_message', user=user1)
|
[1, 'public_stream', user2],
|
||||||
self.assertCountEquals(UserCount, 2, subgroup='private_message', user=user2)
|
[2, 'private_message', user1],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='private_message', user=user3)
|
[2, 'private_message', user2],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='public_stream', realm=self.second_realm,
|
[1, 'private_message', user3],
|
||||||
user=self.hourly_user)
|
[1, 'public_stream', self.hourly_user],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup='public_stream', realm=self.second_realm,
|
[1, 'public_stream', self.daily_user]])
|
||||||
user=self.daily_user)
|
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
|
||||||
self.assertEqual(UserCount.objects.count(), 9)
|
[[3, 'private_stream'], [3, 'public_stream'], [5, 'private_message'],
|
||||||
|
[2, 'public_stream', self.second_realm]])
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup='private_stream')
|
self.assertTableState(InstallationCount, ['value', 'subgroup'],
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup='public_stream')
|
[[3, 'private_stream'], [5, 'public_stream'], [5, 'private_message']])
|
||||||
self.assertCountEquals(RealmCount, 5, subgroup='private_message')
|
self.assertTableState(StreamCount, [], [])
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup='public_stream', realm=self.second_realm)
|
|
||||||
self.assertEqual(RealmCount.objects.count(), 4)
|
|
||||||
|
|
||||||
self.assertCountEquals(InstallationCount, 3, subgroup='private_stream')
|
|
||||||
self.assertCountEquals(InstallationCount, 5, subgroup='public_stream')
|
|
||||||
self.assertCountEquals(InstallationCount, 5, subgroup='private_message')
|
|
||||||
self.assertEqual(InstallationCount.objects.count(), 3)
|
|
||||||
|
|
||||||
self.assertFalse(StreamCount.objects.exists())
|
|
||||||
|
|
||||||
def test_messages_sent_to_recipients_with_same_id(self):
|
def test_messages_sent_to_recipients_with_same_id(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@@ -397,20 +418,16 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
client2_id = str(client2.id)
|
client2_id = str(client2.id)
|
||||||
website_client_id = str(get_client('website').id) # default for self.create_message
|
website_client_id = str(get_client('website').id) # default for self.create_message
|
||||||
self.assertCountEquals(UserCount, 2, subgroup=website_client_id, user=user1)
|
self.assertTableState(UserCount, ['value', 'subgroup', 'user'],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup=client2_id, user=user1)
|
[[2, website_client_id, user1],
|
||||||
self.assertCountEquals(UserCount, 2, subgroup=client2_id, user=user2)
|
[1, client2_id, user1], [2, client2_id, user2],
|
||||||
self.assertCountEquals(UserCount, 1, subgroup=website_client_id, realm=self.second_realm,
|
[1, website_client_id, self.hourly_user]])
|
||||||
user=self.hourly_user)
|
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
|
||||||
self.assertEqual(UserCount.objects.count(), 4)
|
[[2, website_client_id], [3, client2_id],
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup=website_client_id)
|
[1, website_client_id, self.second_realm]])
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup=client2_id)
|
self.assertTableState(InstallationCount, ['value', 'subgroup'],
|
||||||
self.assertCountEquals(RealmCount, 1, subgroup=website_client_id, realm=self.second_realm)
|
[[3, website_client_id], [3, client2_id]])
|
||||||
self.assertEqual(RealmCount.objects.count(), 3)
|
self.assertTableState(StreamCount, [], [])
|
||||||
self.assertCountEquals(InstallationCount, 3, subgroup=website_client_id)
|
|
||||||
self.assertCountEquals(InstallationCount, 3, subgroup=client2_id)
|
|
||||||
self.assertEqual(InstallationCount.objects.count(), 2)
|
|
||||||
self.assertFalse(StreamCount.objects.exists())
|
|
||||||
|
|
||||||
def test_messages_sent_to_stream_by_is_bot(self):
|
def test_messages_sent_to_stream_by_is_bot(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@@ -441,19 +458,11 @@ class TestCountStats(AnalyticsTestCase):
|
|||||||
|
|
||||||
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
do_fill_count_stat_at_hour(stat, self.TIME_ZERO)
|
||||||
|
|
||||||
self.assertCountEquals(StreamCount, 2, subgroup='false', stream=stream1)
|
self.assertTableState(StreamCount, ['value', 'subgroup', 'stream'],
|
||||||
self.assertCountEquals(StreamCount, 1, subgroup='false', stream=stream2)
|
[[2, 'false', stream1], [1, 'false', stream2], [2, 'true', stream2],
|
||||||
self.assertCountEquals(StreamCount, 2, subgroup='true', stream=stream2)
|
# "hourly" stream, from TestCountStats.setUp
|
||||||
self.assertCountEquals(StreamCount, 1, subgroup='false', realm=self.second_realm)
|
[1, 'false', Stream.objects.get(name='stream 1')]])
|
||||||
self.assertEqual(StreamCount.objects.count(), 4)
|
self.assertTableState(RealmCount, ['value', 'subgroup', 'realm'],
|
||||||
|
[[3, 'false'], [2, 'true'], [1, 'false', self.second_realm]])
|
||||||
self.assertCountEquals(RealmCount, 3, subgroup='false')
|
self.assertTableState(InstallationCount, ['value', 'subgroup'], [[4, 'false'], [2, 'true']])
|
||||||
self.assertCountEquals(RealmCount, 2, subgroup='true')
|
self.assertTableState(UserCount, [], [])
|
||||||
self.assertCountEquals(RealmCount, 1, subgroup='false', realm=self.second_realm)
|
|
||||||
self.assertEqual(RealmCount.objects.count(), 3)
|
|
||||||
|
|
||||||
self.assertCountEquals(InstallationCount, 4, subgroup='false')
|
|
||||||
self.assertCountEquals(InstallationCount, 2, subgroup='true')
|
|
||||||
self.assertEqual(InstallationCount.objects.count(), 2)
|
|
||||||
|
|
||||||
self.assertFalse(UserCount.objects.exists())
|
|
||||||
|
|||||||
Reference in New Issue
Block a user