diff options
author | Tomasz Zielinski <tomasz.zielinski@pyconsultant.eu> | 2012-01-14 00:01:22 +0100 |
---|---|---|
committer | Tomasz Zielinski <tomasz.zielinski@pyconsultant.eu> | 2012-01-14 00:01:22 +0100 |
commit | d71964cfc70b351015922d7f0e04e53d337459bb (patch) | |
tree | 5407c3c574bae8b5d7fb0598fa5d486c3f2a7e73 /askbot/tests/search_state_tests.py | |
parent | 4b3bc55042499ca9096c4d1ed4a65ad36cd74868 (diff) | |
download | askbot-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.py | 274 |
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') |