27
21
class SearchTests(ViewTestBase):
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)
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'])
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', {},
54
self.assertEqual(503, response.status_code)
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', {},
67
self.assertEqual(503, response.status_code)
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')
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']), '')
84
def mock_search(request):
85
raise ElasticHttpError('oops')
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'},
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)
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)
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)
97
45
class SearchJSONTests(WebTestBase):