summaryrefslogtreecommitdiffstats
path: root/askbot/tests/search_state_tests.py
diff options
context:
space:
mode:
authorTomasz Zielinski <tomasz.zielinski@pyconsultant.eu>2012-01-14 00:01:22 +0100
committerTomasz Zielinski <tomasz.zielinski@pyconsultant.eu>2012-01-14 00:01:22 +0100
commitd71964cfc70b351015922d7f0e04e53d337459bb (patch)
tree5407c3c574bae8b5d7fb0598fa5d486c3f2a7e73 /askbot/tests/search_state_tests.py
parent4b3bc55042499ca9096c4d1ed4a65ad36cd74868 (diff)
downloadaskbot-d71964cfc70b351015922d7f0e04e53d337459bb.tar.gz
askbot-d71964cfc70b351015922d7f0e04e53d337459bb.tar.bz2
askbot-d71964cfc70b351015922d7f0e04e53d337459bb.zip
Big cleanup of search and pagination
Diffstat (limited to 'askbot/tests/search_state_tests.py')
-rw-r--r--askbot/tests/search_state_tests.py274
1 files changed, 187 insertions, 87 deletions
diff --git a/askbot/tests/search_state_tests.py b/askbot/tests/search_state_tests.py
index 21c416f8..4e60dcd6 100644
--- a/askbot/tests/search_state_tests.py
+++ b/askbot/tests/search_state_tests.py
@@ -1,101 +1,201 @@
-import re
-import unittest
-from django.test import TestCase
-from django.contrib.auth.models import AnonymousUser
-from askbot.search.state_manager import SearchState, parse_query
-from askbot import const
-
-DEFAULT_SORT = const.DEFAULT_POST_SORT_METHOD
-class SearchStateTests(TestCase):
- def setUp(self):
- self.state = SearchState()
-
- def update(self, data, user = None):
- if user is None:
- user = AnonymousUser()
- self.state.update_from_user_input(input_dict=data, user_logged_in=user.is_authenticated())
-
- def add_tag(self, tag):
- self.update({'tags': set([tag])})
-
- def remove_tag(self, tag):
- self.update({'remove_tag': tag})
-
- def assert_tags_are(self, *args):
- self.assertEqual(self.state.tags, set(args))
-
- def test_add_remove_tags(self):
- self.add_tag('tag1')
- self.assert_tags_are('tag1')
- self.add_tag('tag2')
- self.assert_tags_are('tag1', 'tag2')
- self.add_tag('tag3')
- self.assert_tags_are('tag1', 'tag2', 'tag3')
- self.remove_tag('tag3')
- self.assert_tags_are('tag1', 'tag2')
- self.remove_tag('tag2')
- self.assert_tags_are('tag1')
- self.remove_tag('tag1')
- self.assertEqual(len(self.state.tags), 0)
-
- def test_query_and_tags1(self):
- self.update({'query': 'hahaha'})
- self.add_tag('tag1')
- self.assertEquals(self.state.query, 'hahaha')
- self.assert_tags_are('tag1')
- self.update({'reset_query': True})
- self.assertEquals(self.state.query, None)
- self.assert_tags_are('tag1')
-
- def test_start_over(self):
- self.update({'query': 'hahaha'})
- self.add_tag('tag1')
- self.update({'start_over': True})
- self.assertEquals(self.state.query, None)
- self.assertEquals(self.state.tags, None)
-
- def test_auto_reset_sort(self):
- self.update({'sort': 'age-asc'})
- self.assertEquals(self.state.sort, 'age-asc')
- self.update({})
- self.assertEquals(self.state.sort, DEFAULT_SORT)
-
-
-class ParseQueryTests(unittest.TestCase):
+from askbot.tests.utils import AskbotTestCase
+from askbot.search.state_manager import SearchState
+import askbot.conf
+
+
+class SearchStateTests(AskbotTestCase):
+ def _ss(self, query=None, tags=None):
+ return SearchState(
+ scope=None,
+ sort=None,
+ query=query,
+ tags=tags,
+ author=None,
+ page=None,
+ page_size=None,
+
+ user_logged_in=False
+ )
+
+ def test_no_selectors(self):
+ ss = self._ss()
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/page_size:30/page:1/', # search defaults
+ ss.query_string()
+ )
+
+ def test_buggy_selectors(self):
+ ss = SearchState(
+ scope='blah1',
+ sort='blah2',
+ query=None,
+ tags=None,
+
+ # INFO: URLs for the following selectors accept only digits!
+ author=None,
+ page='0',
+ page_size='59',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/page_size:30/page:1/', # search defaults
+ ss.query_string()
+ )
+
+ def test_all_valid_selectors(self):
+ ss = SearchState(
+ scope='unanswered',
+ sort='age-desc',
+ query=' alfa',
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:unanswered/sort:age-desc/query:alfa/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+ )
+
+ def test_edge_cases_1(self):
+ ss = SearchState(
+ scope='favorite', # this is not a valid choice for non-logger users
+ sort='age-desc',
+ query=' alfa',
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:all/sort:age-desc/query:alfa/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+ )
+
+ ss = SearchState(
+ scope='favorite',
+ sort='age-desc',
+ query=' alfa',
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=True
+ )
+ self.assertEqual(
+ 'scope:favorite/sort:age-desc/query:alfa/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+
+ )
+
+ def test_edge_cases_2(self):
+ old_func = askbot.conf.should_show_sort_by_relevance
+ askbot.conf.should_show_sort_by_relevance = lambda: True # monkey patch
+
+ ss = SearchState(
+ scope='all',
+ sort='relevance-desc',
+ query='hejho',
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:all/sort:relevance-desc/query:hejho/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+ )
+
+ ss = SearchState(
+ scope='all',
+ sort='relevance-desc', # this is not a valid choice for empty queries
+ query=None,
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+ )
+
+ askbot.conf.should_show_sort_by_relevance = lambda: False # monkey patch
+
+ ss = SearchState(
+ scope='all',
+ sort='relevance-desc', # this is also invalid for db-s other than Postgresql
+ query='hejho',
+ tags='miki, mini',
+ author='12',
+ page='2',
+ page_size='50',
+
+ user_logged_in=False
+ )
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/query:hejho/tags:miki,mini/author:12/page_size:50/page:2/',
+ ss.query_string()
+ )
+
+ askbot.conf.should_show_sort_by_relevance = old_func
+
+ def test_query_escaping(self):
+ ss = self._ss(query=' alfa miki maki +-%#?= lalala/: ') # query coming from URL is already unescaped
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/query:alfa%20miki%20maki%20+-%25%23%3F%3D%20lalala%2F%3A/page_size:30/page:1/',
+ ss.query_string()
+ )
+
+ def test_tag_escaping(self):
+ ss = self._ss(tags=' aA09_+.-#, miki ') # tag string coming from URL is already unescaped
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/tags:aA09_+.-%23,miki/page_size:30/page:1/',
+ ss.query_string()
+ )
+
def test_extract_users(self):
- text = '@anna haha @"maria fernanda" @\'diego maradona\' hehe [user:karl marx] hoho user:\' george bush \''
- parse_results = parse_query(text)
+ ss = self._ss(query='"@anna haha @"maria fernanda" @\'diego maradona\' hehe [user:karl marx] hoho user:\' george bush \'')
self.assertEquals(
- sorted(parse_results['query_users']),
+ sorted(ss.query_users),
sorted(['anna', 'maria fernanda', 'diego maradona', 'karl marx', 'george bush'])
)
- self.assertEquals(parse_results['stripped_query'], 'haha hehe hoho')
+ self.assertEquals(ss.stripped_query, '" haha hehe hoho')
+ self.assertEqual(
+ 'scope:all/sort:activity-desc/query:%22%40anna%20haha%20%40%22maria%20fernanda%22%20%40%27diego%20maradona%27%20hehe%20%5Buser%3Akarl%20%20marx%5D%20hoho%20%20user%3A%27%20george%20bush%20%20%27/page_size:30/page:1/',
+ ss.query_string()
+ )
def test_extract_tags(self):
- text = '#tag1 [tag: tag2] some text [tag3] query'
- parse_results = parse_query(text)
- self.assertEquals(set(parse_results['query_tags']), set(['tag1', 'tag2', 'tag3']))
- self.assertEquals(parse_results['stripped_query'], 'some text query')
+ ss = self._ss(query='#tag1 [tag: tag2] some text [tag3] query')
+ self.assertEquals(set(ss.query_tags), set(['tag1', 'tag2', 'tag3']))
+ self.assertEquals(ss.stripped_query, 'some text query')
def test_extract_title1(self):
- text = 'some text query [title: what is this?]'
- parse_results = parse_query(text)
- self.assertEquals(parse_results['query_title'], 'what is this?')
- self.assertEquals(parse_results['stripped_query'], 'some text query')
+ ss = self._ss(query='some text query [title: what is this?]')
+ self.assertEquals(ss.query_title, 'what is this?')
+ self.assertEquals(ss.stripped_query, 'some text query')
def test_extract_title2(self):
- text = 'some text query title:"what is this?"'
- parse_results = parse_query(text)
- self.assertEquals(parse_results['query_title'], 'what is this?')
- self.assertEquals(parse_results['stripped_query'], 'some text query')
+ ss = self._ss(query='some text query title:"what is this?"')
+ self.assertEquals(ss.query_title, 'what is this?')
+ self.assertEquals(ss.stripped_query, 'some text query')
def test_extract_title3(self):
- text = 'some text query title:\'what is this?\''
- parse_results = parse_query(text)
- self.assertEquals(parse_results['query_title'], 'what is this?')
- self.assertEquals(parse_results['stripped_query'], 'some text query')
+ ss = self._ss(query='some text query title:\'what is this?\'')
+ self.assertEquals(ss.query_title, 'what is this?')
+ self.assertEquals(ss.stripped_query, 'some text query')
def test_negative_match(self):
- text = 'some query text'
- parse_results = parse_query(text)
- self.assertEquals(parse_results['stripped_query'], 'some query text')
+ ss = self._ss(query='some query text')
+ self.assertEquals(ss.stripped_query, 'some query text')