~bac/charmworld/bundle-redirect

« back to all changes in this revision

Viewing changes to charmworld/views/tests/test_search.py

  • Committer: Brad Crittenden
  • Date: 2015-02-18 13:41:14 UTC
  • mfrom: (520.2.2 trunk)
  • Revision ID: bac@canonical.com-20150218134114-jx604y1brpyq4a0e
MergeĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright 2012, 2013 Canonical Ltd.  This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
3
 
4
 
from mock import patch
5
 
from pyelasticsearch import ElasticSearch
6
 
from pyelasticsearch.exceptions import ElasticHttpError
 
4
from pyramid.httpexceptions import HTTPMovedPermanently
7
5
 
8
 
from charmworld.search import (
9
 
    ElasticSearchClient,
10
 
    IndexNotReady,
11
 
)
12
6
from charmworld.testing import (
13
7
    ViewTestBase,
14
8
    WebTestBase,
26
20
 
27
21
class SearchTests(ViewTestBase):
28
22
 
29
 
    @patch('charmworld.views.search.do_search',
30
 
           autospec=True, return_value=RETURN_VAL)
31
 
    def test_search(self, mock):
32
 
        terms = {"search_text": 'foo'}
33
 
        keys = ['result_total', 'results', 'search_time']
34
 
        request = self.getRequest(params=terms)
35
 
        response = search.search(request)
36
 
 
37
 
        mock.assert_called_with(request)
38
 
        self.assertEqual(keys, sorted(response.keys()))
39
 
        self.assertEqual(0, response['result_total'])
40
 
        self.assertEqual([], response['results'])
41
 
        self.assertEqual(0.0, response['search_time'])
42
 
 
43
 
    @patch('charmworld.views.search.do_search',
44
 
           autospec=True, side_effect=IndexNotReady)
45
 
    def test_search_503(self, mock):
46
 
        terms = {"search_text": 'foo'}
47
 
        request = self.getRequest(params=terms)
48
 
        # render_to_response requires the request to be much more like a real
49
 
        # request, with scheme and static stuff handling, so mock it out.
50
 
        with patch('charmworld.views.search.render_to_response') as render:
51
 
            response = search.search(request)
52
 
        render.assert_called_with('../templates/search-not-ready.pt', {},
53
 
                                  request=request)
54
 
        self.assertEqual(503, response.status_code)
55
 
 
56
 
    def test_search_503_on_connection_error(self):
57
 
        terms = {"search_text": 'foo'}
58
 
        request = self.getRequest(params=terms)
59
 
        request.index_client = ElasticSearchClient(
60
 
            ElasticSearch(['http://localhost:70']), 'foo')
61
 
        # render_to_response requires the request to be much more like a real
62
 
        # request, with scheme and static stuff handling, so mock it out.
63
 
        with patch('charmworld.views.search.render_to_response') as render:
64
 
            response = search.search(request)
65
 
        render.assert_called_with('../templates/search-not-ready.pt', {},
66
 
                                  request=request)
67
 
        self.assertEqual(503, response.status_code)
68
 
 
69
 
    def test_tildes_not_in_start_are_unchanged(self):
70
 
        terms = {"search_text": 'fo~o'}
71
 
        request = self.getRequest(params=terms)
72
 
        request.index_client = ElasticSearchClient(
73
 
            ElasticSearch(['http://localhost:70']), '')
74
 
        with patch.object(request.index_client, 'search') as req_search:
75
 
            search.search(request)
76
 
            req_search.assert_called_with('fo~o')
77
 
 
78
 
    def test_otherwise_tilde_causes_400(self):
79
 
        terms = {"search_text": 'fo~o'}
80
 
        request = self.getRequest(params=terms)
81
 
        request.index_client = ElasticSearchClient(
82
 
            ElasticSearch(['http://localhost:70']), '')
83
 
 
84
 
        def mock_search(request):
85
 
            raise ElasticHttpError('oops')
86
 
 
87
 
        with patch.object(request.index_client, 'search', mock_search):
88
 
            with patch('charmworld.views.search.render_to_response') as render:
89
 
                response = search.search(request)
90
 
        render.assert_called_with(
91
 
            '../templates/search-terms-bad.pt',
92
 
            {'search_text': 'fo~o'},
93
 
            request=request)
94
 
        self.assertEqual(400, response.status_code)
 
23
    def test_search(self):
 
24
        terms = {"search_text": 'foo'}
 
25
        request = self.getRequest(params=terms)
 
26
        with self.assertRaises(HTTPMovedPermanently) as e:
 
27
            search.search(request)
 
28
        self.assertIn('/q/foo', e.exception.location)
 
29
 
 
30
    def test_search_multiple(self):
 
31
        terms = {"search_text": 'foo bar'}
 
32
        request = self.getRequest(params=terms)
 
33
        with self.assertRaises(HTTPMovedPermanently) as e:
 
34
            search.search(request)
 
35
        self.assertIn('/q/foo/bar', e.exception.location)
 
36
 
 
37
    def test_search_with_space(self):
 
38
        terms = {"search_text": ' foo   bar '}
 
39
        request = self.getRequest(params=terms)
 
40
        with self.assertRaises(HTTPMovedPermanently) as e:
 
41
            search.search(request)
 
42
        self.assertIn('/q/foo/bar', e.exception.location)
95
43
 
96
44
 
97
45
class SearchJSONTests(WebTestBase):