|
|
|
@@ -34,7 +34,7 @@ from zerver.lib.test_classes import (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
from zerver.views.messages import (
|
|
|
|
from zerver.views.messages import (
|
|
|
|
exclude_muting_conditions,
|
|
|
|
exclude_muting_conditions,
|
|
|
|
get_old_messages_backend, ok_to_include_history,
|
|
|
|
get_messages_backend, ok_to_include_history,
|
|
|
|
NarrowBuilder, BadNarrowOperator, Query,
|
|
|
|
NarrowBuilder, BadNarrowOperator, Query,
|
|
|
|
LARGER_THAN_MAX_MESSAGE_ID,
|
|
|
|
LARGER_THAN_MAX_MESSAGE_ID,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
@@ -431,7 +431,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
|
|
|
|
|
|
|
|
return query_ids
|
|
|
|
return query_ids
|
|
|
|
|
|
|
|
|
|
|
|
def test_successful_get_old_messages_reaction(self):
|
|
|
|
def test_successful_get_messages_reaction(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Test old `/json/messages` returns reactions.
|
|
|
|
Test old `/json/messages` returns reactions.
|
|
|
|
@@ -459,7 +459,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(message_to_assert['reactions'][0]['emoji_name'],
|
|
|
|
self.assertEqual(message_to_assert['reactions'][0]['emoji_name'],
|
|
|
|
reaction_name)
|
|
|
|
reaction_name)
|
|
|
|
|
|
|
|
|
|
|
|
def test_successful_get_old_messages(self):
|
|
|
|
def test_successful_get_messages(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A call to GET /json/messages with valid parameters returns a list of
|
|
|
|
A call to GET /json/messages with valid parameters returns a list of
|
|
|
|
@@ -474,7 +474,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
|
|
|
|
|
|
|
|
self.get_and_check_messages(dict(narrow=ujson.dumps([dict(operator='pm-with', operand='othello@zulip.com')])))
|
|
|
|
self.get_and_check_messages(dict(narrow=ujson.dumps([dict(operator='pm-with', operand='othello@zulip.com')])))
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_pm_with(self):
|
|
|
|
def test_get_messages_with_narrow_pm_with(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A request for old messages with a narrow by pm-with only returns
|
|
|
|
A request for old messages with a narrow by pm-with only returns
|
|
|
|
@@ -504,7 +504,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
for message in result["messages"]:
|
|
|
|
for message in result["messages"]:
|
|
|
|
self.assertEqual(dr_emails(message['display_recipient']), emails)
|
|
|
|
self.assertEqual(dr_emails(message['display_recipient']), emails)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_stream(self):
|
|
|
|
def test_get_messages_with_narrow_stream(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A request for old messages with a narrow by stream only returns
|
|
|
|
A request for old messages with a narrow by stream only returns
|
|
|
|
@@ -528,7 +528,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(message["type"], "stream")
|
|
|
|
self.assertEqual(message["type"], "stream")
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_stream_mit_unicode_regex(self):
|
|
|
|
def test_get_messages_with_narrow_stream_mit_unicode_regex(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A request for old messages for a user in the mit.edu relam with unicode
|
|
|
|
A request for old messages for a user in the mit.edu relam with unicode
|
|
|
|
@@ -560,7 +560,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_stream_mit_unicode_null_regex(self):
|
|
|
|
def test_get_messages_with_narrow_stream_mit_unicode_null_regex(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
self.login("starnine@mit.edu")
|
|
|
|
self.login("starnine@mit.edu")
|
|
|
|
null_stream_name = u"foo\000-stream"
|
|
|
|
null_stream_name = u"foo\000-stream"
|
|
|
|
@@ -576,7 +576,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(result["messages"][0]["type"], "stream")
|
|
|
|
self.assertEqual(result["messages"][0]["type"], "stream")
|
|
|
|
self.assertEqual(result["messages"][0]["recipient_id"], stream_messages[0].recipient.id)
|
|
|
|
self.assertEqual(result["messages"][0]["recipient_id"], stream_messages[0].recipient.id)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_topic_mit_unicode_regex(self):
|
|
|
|
def test_get_messages_with_narrow_topic_mit_unicode_regex(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A request for old messages for a user in the mit.edu realm with unicode
|
|
|
|
A request for old messages for a user in the mit.edu realm with unicode
|
|
|
|
@@ -612,7 +612,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_topic_mit_personal(self):
|
|
|
|
def test_get_messages_with_narrow_topic_mit_personal(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
We handle .d grouping for MIT realm personal messages correctly.
|
|
|
|
We handle .d grouping for MIT realm personal messages correctly.
|
|
|
|
@@ -652,7 +652,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
stream_id = stream_messages[i].recipient.id
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
self.assertEqual(message["recipient_id"], stream_id)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_sender(self):
|
|
|
|
def test_get_messages_with_narrow_sender(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
A request for old messages with a narrow by sender only returns
|
|
|
|
A request for old messages with a narrow by sender only returns
|
|
|
|
@@ -723,7 +723,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
u'<p><span class="highlight">KEYWORDMATCH</span> and should work</p>')
|
|
|
|
u'<p><span class="highlight">KEYWORDMATCH</span> and should work</p>')
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
def test_get_old_messages_with_search(self):
|
|
|
|
def test_get_messages_with_search(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
self.login("cordelia@zulip.com")
|
|
|
|
self.login("cordelia@zulip.com")
|
|
|
|
|
|
|
|
|
|
|
|
@@ -789,7 +789,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">discuss</span> lunch <span class="highlight">after</span> lunch</p>')
|
|
|
|
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">discuss</span> lunch <span class="highlight">after</span> lunch</p>')
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
def test_get_old_messages_with_search_not_subscribed(self):
|
|
|
|
def test_get_messages_with_search_not_subscribed(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""Verify support for searching a stream you're not subscribed to"""
|
|
|
|
"""Verify support for searching a stream you're not subscribed to"""
|
|
|
|
self.subscribe_to_stream("hamlet@zulip.com", "newstream")
|
|
|
|
self.subscribe_to_stream("hamlet@zulip.com", "newstream")
|
|
|
|
@@ -819,7 +819,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
'<p>Public <span class="highlight">special</span> content!</p>')
|
|
|
|
'<p>Public <span class="highlight">special</span> content!</p>')
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(USING_PGROONGA=True)
|
|
|
|
@override_settings(USING_PGROONGA=True)
|
|
|
|
def test_get_old_messages_with_search_pgroonga(self):
|
|
|
|
def test_get_messages_with_search_pgroonga(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
self.login("cordelia@zulip.com")
|
|
|
|
self.login("cordelia@zulip.com")
|
|
|
|
|
|
|
|
|
|
|
|
@@ -891,7 +891,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(len(multi_search_result['messages']), 1)
|
|
|
|
self.assertEqual(len(multi_search_result['messages']), 1)
|
|
|
|
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">Can</span> you <span class="highlight">speak</span> Japanese?</p>')
|
|
|
|
self.assertEqual(multi_search_result['messages'][0]['match_content'], '<p><span class="highlight">Can</span> you <span class="highlight">speak</span> Japanese?</p>')
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_only_searching_anchor(self):
|
|
|
|
def test_get_messages_with_only_searching_anchor(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Test that specifying an anchor but 0 for num_before and num_after
|
|
|
|
Test that specifying an anchor but 0 for num_before and num_after
|
|
|
|
@@ -916,7 +916,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
anchor, num_before, and num_after are all required
|
|
|
|
anchor, num_before, and num_after are all required
|
|
|
|
POST parameters for get_old_messages.
|
|
|
|
POST parameters for get_messages.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1006,7 +1006,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
def test_bad_narrow_stream_content(self):
|
|
|
|
def test_bad_narrow_stream_content(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
If an invalid stream name is requested in get_old_messages, an error is
|
|
|
|
If an invalid stream name is requested in get_messages, an error is
|
|
|
|
returned.
|
|
|
|
returned.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
@@ -1017,7 +1017,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
def test_bad_narrow_one_on_one_email_content(self):
|
|
|
|
def test_bad_narrow_one_on_one_email_content(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
If an invalid 'pm-with' is requested in get_old_messages, an
|
|
|
|
If an invalid 'pm-with' is requested in get_messages, an
|
|
|
|
error is returned.
|
|
|
|
error is returned.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
self.login("hamlet@zulip.com")
|
|
|
|
@@ -1047,19 +1047,19 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
d = MessageDict.to_dict_uncached_helper(m, True)
|
|
|
|
d = MessageDict.to_dict_uncached_helper(m, True)
|
|
|
|
self.assertEqual(d['content'], '<p>test content</p>')
|
|
|
|
self.assertEqual(d['content'], '<p>test content</p>')
|
|
|
|
|
|
|
|
|
|
|
|
def common_check_get_old_messages_query(self, query_params, expected):
|
|
|
|
def common_check_get_messages_query(self, query_params, expected):
|
|
|
|
# type: (Dict[str, object], Text) -> None
|
|
|
|
# type: (Dict[str, object], Text) -> None
|
|
|
|
user_profile = get_user_profile_by_email("hamlet@zulip.com")
|
|
|
|
user_profile = get_user_profile_by_email("hamlet@zulip.com")
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
with queries_captured() as queries:
|
|
|
|
with queries_captured() as queries:
|
|
|
|
get_old_messages_backend(request, user_profile)
|
|
|
|
get_messages_backend(request, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
for query in queries:
|
|
|
|
for query in queries:
|
|
|
|
if "/* get_old_messages */" in query['sql']:
|
|
|
|
if "/* get_messages */" in query['sql']:
|
|
|
|
sql = str(query['sql']).replace(" /* get_old_messages */", '')
|
|
|
|
sql = str(query['sql']).replace(" /* get_messages */", '')
|
|
|
|
self.assertEqual(sql, expected)
|
|
|
|
self.assertEqual(sql, expected)
|
|
|
|
return
|
|
|
|
return
|
|
|
|
raise AssertionError("get_old_messages query not found")
|
|
|
|
raise AssertionError("get_messages query not found")
|
|
|
|
|
|
|
|
|
|
|
|
def test_use_first_unread_anchor_with_some_unread_messages(self):
|
|
|
|
def test_use_first_unread_anchor_with_some_unread_messages(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
@@ -1084,10 +1084,10 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
get_old_messages_backend(request, user_profile)
|
|
|
|
get_messages_backend(request, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
# Verify the query for old messages looks correct.
|
|
|
|
# Verify the query for old messages looks correct.
|
|
|
|
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']]
|
|
|
|
queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
sql = queries[0]['sql']
|
|
|
|
sql = queries[0]['sql']
|
|
|
|
self.assertNotIn('AND message_id = %s' % (LARGER_THAN_MAX_MESSAGE_ID,), sql)
|
|
|
|
self.assertNotIn('AND message_id = %s' % (LARGER_THAN_MAX_MESSAGE_ID,), sql)
|
|
|
|
@@ -1112,11 +1112,11 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
get_old_messages_backend(request, user_profile)
|
|
|
|
get_messages_backend(request, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
# Next, verify the use_first_unread_anchor setting invokes
|
|
|
|
# Next, verify the use_first_unread_anchor setting invokes
|
|
|
|
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
|
|
|
|
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
|
|
|
|
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']]
|
|
|
|
queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
self.assertIn('AND message_id <= %d' % (LARGER_THAN_MAX_MESSAGE_ID - 1,), queries[0]['sql'])
|
|
|
|
self.assertIn('AND message_id <= %d' % (LARGER_THAN_MAX_MESSAGE_ID - 1,), queries[0]['sql'])
|
|
|
|
# There should not be an after_query in this case, since it'd be useless
|
|
|
|
# There should not be an after_query in this case, since it'd be useless
|
|
|
|
@@ -1127,11 +1127,11 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Test that our logic related to `use_first_unread_anchor`
|
|
|
|
Test that our logic related to `use_first_unread_anchor`
|
|
|
|
invokes the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack for
|
|
|
|
invokes the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack for
|
|
|
|
the `/* get_old_messages */` query when relevant muting
|
|
|
|
the `/* get_messages */` query when relevant muting
|
|
|
|
is in effect.
|
|
|
|
is in effect.
|
|
|
|
|
|
|
|
|
|
|
|
This is a very arcane test on arcane, but very heavily
|
|
|
|
This is a very arcane test on arcane, but very heavily
|
|
|
|
field-tested, logic in get_old_messages_backend(). If
|
|
|
|
field-tested, logic in get_messages_backend(). If
|
|
|
|
this test breaks, be absolutely sure you know what you're
|
|
|
|
this test breaks, be absolutely sure you know what you're
|
|
|
|
doing.
|
|
|
|
doing.
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
@@ -1152,7 +1152,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
request = POSTRequestMock(query_params, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
with queries_captured() as all_queries:
|
|
|
|
get_old_messages_backend(request, user_profile)
|
|
|
|
get_messages_backend(request, user_profile)
|
|
|
|
|
|
|
|
|
|
|
|
# Do some tests on the main query, to verify the muting logic
|
|
|
|
# Do some tests on the main query, to verify the muting logic
|
|
|
|
# runs on this code path.
|
|
|
|
# runs on this code path.
|
|
|
|
@@ -1166,7 +1166,7 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
|
|
|
|
|
|
|
|
# Next, verify the use_first_unread_anchor setting invokes
|
|
|
|
# Next, verify the use_first_unread_anchor setting invokes
|
|
|
|
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
|
|
|
|
# the `message_id = LARGER_THAN_MAX_MESSAGE_ID` hack.
|
|
|
|
queries = [q for q in all_queries if '/* get_old_messages */' in q['sql']]
|
|
|
|
queries = [q for q in all_queries if '/* get_messages */' in q['sql']]
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
self.assertEqual(len(queries), 1)
|
|
|
|
self.assertIn('AND message_id = %d' % (LARGER_THAN_MAX_MESSAGE_ID,),
|
|
|
|
self.assertIn('AND message_id = %d' % (LARGER_THAN_MAX_MESSAGE_ID,),
|
|
|
|
queries[0]['sql'])
|
|
|
|
queries[0]['sql'])
|
|
|
|
@@ -1233,94 +1233,94 @@ class GetOldMessagesTest(ZulipTestCase):
|
|
|
|
self.assertEqual(params['recipient_id_3'], get_recipient_id_for_stream_name(realm, 'web stuff'))
|
|
|
|
self.assertEqual(params['recipient_id_3'], get_recipient_id_for_stream_name(realm, 'web stuff'))
|
|
|
|
self.assertEqual(params['upper_2'], 'css')
|
|
|
|
self.assertEqual(params['upper_2'], 'css')
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_queries(self):
|
|
|
|
def test_get_messages_queries(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10}, sql)
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10}, sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DESC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 100 ORDER BY message_id DESC \n LIMIT 11) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 0}, sql)
|
|
|
|
self.common_check_get_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 0}, sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM ((SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 99 ORDER BY message_id DESC \n LIMIT 10) UNION ALL (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id ASC \n LIMIT 11)) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM ((SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id <= 99 ORDER BY message_id DESC \n LIMIT 10) UNION ALL (SELECT message_id, flags \nFROM zerver_usermessage \nWHERE user_profile_id = {hamlet_id} AND message_id >= 100 ORDER BY message_id ASC \n LIMIT 11)) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 10}, sql)
|
|
|
|
self.common_check_get_messages_query({'anchor': 100, 'num_before': 10, 'num_after': 10}, sql)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_old_messages_with_narrow_queries(self):
|
|
|
|
def test_get_messages_with_narrow_queries(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (sender_id = {othello_id} AND recipient_id = {hamlet_recipient} OR sender_id = {hamlet_id} AND recipient_id = {othello_recipient}) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["pm-with", "othello@zulip.com"]]'},
|
|
|
|
'narrow': '[["pm-with", "othello@zulip.com"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["is", "starred"]]'},
|
|
|
|
'narrow': '[["is", "starred"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {othello_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {othello_id} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["sender", "othello@zulip.com"]]'},
|
|
|
|
'narrow': '[["sender", "othello@zulip.com"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["stream", "Scotland"]]'},
|
|
|
|
'narrow': '[["stream", "Scotland"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND upper(subject) = upper('blah') AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND upper(subject) = upper('blah') AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["topic", "blah"]]'},
|
|
|
|
'narrow': '[["topic", "blah"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql_template = "SELECT anon_1.message_id \nFROM (SELECT id AS message_id \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND upper(subject) = upper('blah') AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["stream", "Scotland"], ["topic", "blah"]]'},
|
|
|
|
'narrow': '[["stream", "Scotland"], ["topic", "blah"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
# Narrow to pms with yourself
|
|
|
|
# Narrow to pms with yourself
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND sender_id = {hamlet_id} AND recipient_id = {hamlet_recipient} AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["pm-with", "hamlet@zulip.com"]]'},
|
|
|
|
'narrow': '[["pm-with", "hamlet@zulip.com"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags \nFROM (SELECT message_id, flags \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND recipient_id = {scotland_recipient} AND (flags & 2) != 0 AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["stream", "Scotland"], ["is", "starred"]]'},
|
|
|
|
'narrow': '[["stream", "Scotland"], ["is", "starred"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
@override_settings(USING_PGROONGA=False)
|
|
|
|
def test_get_old_messages_with_search_queries(self):
|
|
|
|
def test_get_messages_with_search_queries(self):
|
|
|
|
# type: () -> None
|
|
|
|
# type: () -> None
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
query_ids = self.get_query_ids()
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" # type: Text
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC" # type: Text
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["search", "jumping"]]'},
|
|
|
|
'narrow': '[["search", "jumping"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT id AS message_id, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql_template = "SELECT anon_1.message_id, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT id AS message_id, subject, rendered_content, ts_match_locs_array('zulip.english_us_search', rendered_content, plainto_tsquery('zulip.english_us_search', 'jumping')) AS content_matches, ts_match_locs_array('zulip.english_us_search', escape_html(subject), plainto_tsquery('zulip.english_us_search', 'jumping')) AS subject_matches \nFROM zerver_message \nWHERE recipient_id = {scotland_recipient} AND (search_tsvector @@ plainto_tsquery('zulip.english_us_search', 'jumping')) AND zerver_message.id >= 0 ORDER BY zerver_message.id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC"
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["stream", "Scotland"], ["search", "jumping"]]'},
|
|
|
|
'narrow': '[["stream", "Scotland"], ["search", "jumping"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|
|
|
|
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array(\'zulip.english_us_search\', rendered_content, plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS content_matches, ts_match_locs_array(\'zulip.english_us_search\', escape_html(subject), plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (content ILIKE \'%jumping%\' OR subject ILIKE \'%jumping%\') AND (search_tsvector @@ plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql_template = 'SELECT anon_1.message_id, anon_1.flags, anon_1.subject, anon_1.rendered_content, anon_1.content_matches, anon_1.subject_matches \nFROM (SELECT message_id, flags, subject, rendered_content, ts_match_locs_array(\'zulip.english_us_search\', rendered_content, plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS content_matches, ts_match_locs_array(\'zulip.english_us_search\', escape_html(subject), plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AS subject_matches \nFROM zerver_usermessage JOIN zerver_message ON zerver_usermessage.message_id = zerver_message.id \nWHERE user_profile_id = {hamlet_id} AND (content ILIKE \'%jumping%\' OR subject ILIKE \'%jumping%\') AND (search_tsvector @@ plainto_tsquery(\'zulip.english_us_search\', \'"jumping" quickly\')) AND message_id >= 0 ORDER BY message_id ASC \n LIMIT 10) AS anon_1 ORDER BY message_id ASC'
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
sql = sql_template.format(**query_ids)
|
|
|
|
self.common_check_get_old_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
self.common_check_get_messages_query({'anchor': 0, 'num_before': 0, 'num_after': 10,
|
|
|
|
'narrow': '[["search", "\\"jumping\\" quickly"]]'},
|
|
|
|
'narrow': '[["search", "\\"jumping\\" quickly"]]'},
|
|
|
|
sql)
|
|
|
|
sql)
|
|
|
|
|