| Index: third_party/gsutil/boto/tests/unit/cloudsearch/test_search.py
|
| diff --git a/third_party/gsutil/boto/tests/unit/cloudsearch/test_search.py b/third_party/gsutil/boto/tests/unit/cloudsearch/test_search.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b6c23dd4f17492fdde2a4f7283ee1d7c10b6465f
|
| --- /dev/null
|
| +++ b/third_party/gsutil/boto/tests/unit/cloudsearch/test_search.py
|
| @@ -0,0 +1,325 @@
|
| +#!/usr/bin env python
|
| +
|
| +from tests.unit import unittest
|
| +from httpretty import HTTPretty
|
| +
|
| +import urlparse
|
| +import json
|
| +
|
| +from boto.cloudsearch.search import SearchConnection
|
| +
|
| +HOSTNAME = "search-demo-userdomain.us-east-1.cloudsearch.amazonaws.com"
|
| +FULL_URL = 'http://%s/2011-02-01/search' % HOSTNAME
|
| +
|
| +
|
| +class CloudSearchSearchTest(unittest.TestCase):
|
| +
|
| + hits = [
|
| + {
|
| + 'id': '12341',
|
| + 'title': 'Document 1',
|
| + },
|
| + {
|
| + 'id': '12342',
|
| + 'title': 'Document 2',
|
| + },
|
| + {
|
| + 'id': '12343',
|
| + 'title': 'Document 3',
|
| + },
|
| + {
|
| + 'id': '12344',
|
| + 'title': 'Document 4',
|
| + },
|
| + {
|
| + 'id': '12345',
|
| + 'title': 'Document 5',
|
| + },
|
| + {
|
| + 'id': '12346',
|
| + 'title': 'Document 6',
|
| + },
|
| + {
|
| + 'id': '12347',
|
| + 'title': 'Document 7',
|
| + },
|
| + ]
|
| +
|
| + response = {
|
| + 'rank': '-text_relevance',
|
| + 'match-expr':"Test",
|
| + 'hits': {
|
| + 'found': 30,
|
| + 'start': 0,
|
| + 'hit':hits
|
| + },
|
| + 'info': {
|
| + 'rid':'b7c167f6c2da6d93531b9a7b314ad030b3a74803b4b7797edb905ba5a6a08',
|
| + 'time-ms': 2,
|
| + 'cpu-time-ms': 0
|
| + }
|
| +
|
| + }
|
| +
|
| + def get_args(self, requestline):
|
| + (_, request, _) = requestline.split(" ")
|
| + (_, request) = request.split("?", 1)
|
| + args = urlparse.parse_qs(request)
|
| + return args
|
| +
|
| + def setUp(self):
|
| + HTTPretty.enable()
|
| + HTTPretty.register_uri(HTTPretty.GET, FULL_URL,
|
| + body=json.dumps(self.response),
|
| + content_type="text/xml")
|
| +
|
| + def tearDown(self):
|
| + HTTPretty.disable()
|
| +
|
| + def test_cloudsearch_qsearch(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test')
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['q'], ["Test"])
|
| + self.assertEqual(args['start'], ["0"])
|
| + self.assertEqual(args['size'], ["10"])
|
| +
|
| + def test_cloudsearch_bqsearch(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(bq="'Test'")
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['bq'], ["'Test'"])
|
| +
|
| + def test_cloudsearch_search_details(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', size=50, start=20)
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['q'], ["Test"])
|
| + self.assertEqual(args['size'], ["50"])
|
| + self.assertEqual(args['start'], ["20"])
|
| +
|
| + def test_cloudsearch_facet_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet=["Author"])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet'], ["Author"])
|
| +
|
| + def test_cloudsearch_facet_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet=["author", "cat"])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet'], ["author,cat"])
|
| +
|
| + def test_cloudsearch_facet_constraint_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(
|
| + q='Test',
|
| + facet_constraints={'author': "'John Smith','Mark Smith'"})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-constraints'],
|
| + ["'John Smith','Mark Smith'"])
|
| +
|
| + def test_cloudsearch_facet_constraint_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(
|
| + q='Test',
|
| + facet_constraints={'author': "'John Smith','Mark Smith'",
|
| + 'category': "'News','Reviews'"})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-constraints'],
|
| + ["'John Smith','Mark Smith'"])
|
| + self.assertEqual(args['facet-category-constraints'],
|
| + ["'News','Reviews'"])
|
| +
|
| + def test_cloudsearch_facet_sort_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet_sort={'author': 'alpha'})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-sort'], ['alpha'])
|
| +
|
| + def test_cloudsearch_facet_sort_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet_sort={'author': 'alpha',
|
| + 'cat': 'count'})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-sort'], ['alpha'])
|
| + self.assertEqual(args['facet-cat-sort'], ['count'])
|
| +
|
| + def test_cloudsearch_top_n_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet_top_n={'author': 5})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-top-n'], ['5'])
|
| +
|
| + def test_cloudsearch_top_n_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', facet_top_n={'author': 5, 'cat': 10})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['facet-author-top-n'], ['5'])
|
| + self.assertEqual(args['facet-cat-top-n'], ['10'])
|
| +
|
| + def test_cloudsearch_rank_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', rank=["date"])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['rank'], ['date'])
|
| +
|
| + def test_cloudsearch_rank_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', rank=["date", "score"])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['rank'], ['date,score'])
|
| +
|
| + def test_cloudsearch_result_fields_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', return_fields=['author'])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['return-fields'], ['author'])
|
| +
|
| + def test_cloudsearch_result_fields_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', return_fields=['author', 'title'])
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['return-fields'], ['author,title'])
|
| +
|
| +
|
| + def test_cloudsearch_t_field_single(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', t={'year':'2001..2007'})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['t-year'], ['2001..2007'])
|
| +
|
| + def test_cloudsearch_t_field_multiple(self):
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + search.search(q='Test', t={'year':'2001..2007', 'score':'10..50'})
|
| +
|
| + args = self.get_args(HTTPretty.last_request.raw_requestline)
|
| +
|
| + self.assertEqual(args['t-year'], ['2001..2007'])
|
| + self.assertEqual(args['t-score'], ['10..50'])
|
| +
|
| +
|
| + def test_cloudsearch_results_meta(self):
|
| + """Check returned metadata is parsed correctly"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + results = search.search(q='Test')
|
| +
|
| + # These rely on the default response which is fed into HTTPretty
|
| + self.assertEqual(results.rank, "-text_relevance")
|
| + self.assertEqual(results.match_expression, "Test")
|
| +
|
| + def test_cloudsearch_results_info(self):
|
| + """Check num_pages_needed is calculated correctly"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + results = search.search(q='Test')
|
| +
|
| + # This relies on the default response which is fed into HTTPretty
|
| + self.assertEqual(results.num_pages_needed, 3.0)
|
| +
|
| + def test_cloudsearch_results_matched(self):
|
| + """
|
| + Check that information objects are passed back through the API
|
| + correctly.
|
| + """
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| + query = search.build_query(q='Test')
|
| +
|
| + results = search(query)
|
| +
|
| + self.assertEqual(results.search_service, search)
|
| + self.assertEqual(results.query, query)
|
| +
|
| + def test_cloudsearch_results_hits(self):
|
| + """Check that documents are parsed properly from AWS"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + results = search.search(q='Test')
|
| +
|
| + hits = map(lambda x: x['id'], results.docs)
|
| +
|
| + # This relies on the default response which is fed into HTTPretty
|
| + self.assertEqual(
|
| + hits, ["12341", "12342", "12343", "12344",
|
| + "12345", "12346", "12347"])
|
| +
|
| + def test_cloudsearch_results_iterator(self):
|
| + """Check the results iterator"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + results = search.search(q='Test')
|
| + results_correct = iter(["12341", "12342", "12343", "12344",
|
| + "12345", "12346", "12347"])
|
| + for x in results:
|
| + self.assertEqual(x['id'], results_correct.next())
|
| +
|
| +
|
| + def test_cloudsearch_results_internal_consistancy(self):
|
| + """Check the documents length matches the iterator details"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| +
|
| + results = search.search(q='Test')
|
| +
|
| + self.assertEqual(len(results), len(results.docs))
|
| +
|
| + def test_cloudsearch_search_nextpage(self):
|
| + """Check next page query is correct"""
|
| + search = SearchConnection(endpoint=HOSTNAME)
|
| + query1 = search.build_query(q='Test')
|
| + query2 = search.build_query(q='Test')
|
| +
|
| + results = search(query2)
|
| +
|
| + self.assertEqual(results.next_page().query.start,
|
| + query1.start + query1.size)
|
| + self.assertEqual(query1.q, query2.q)
|
|
|