Skip to content

Commit

Permalink
[#1701] Move and clean up search index tests
Browse files Browse the repository at this point in the history
  • Loading branch information
amercader committed Aug 1, 2014
1 parent bfe5571 commit 3e1becd
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 102 deletions.
94 changes: 94 additions & 0 deletions ckan/new_tests/lib/search/test_index.py
@@ -0,0 +1,94 @@
import datetime
import hashlib
import nose

from pylons import config
import ckan.lib.search as search


eq_ = nose.tools.eq_


class TestSearchIndex(object):

@classmethod
def setup_class(cls):

if not search.is_available():
raise nose.SkipTest('Solr not reachable')

cls.solr_client = search.make_connection()

cls.fq = " +site_id:\"%s\" " % config['ckan.site_id']

cls.package_index = search.PackageSearchIndex()

cls.base_package_dict = {
'id': 'test-index',
'name': 'monkey',
'title': 'Monkey',
'state': 'active',
'private': False,
'type': 'dataset',
'owner_org': None,
'metadata_created': datetime.datetime.now().isoformat(),
'metadata_modified': datetime.datetime.now().isoformat(),
}

def teardown(self):
# clear the search index after every test
self.package_index.clear()

def test_index_basic(self):

self.package_index.index_package(self.base_package_dict)

response = self.solr_client.query('name:monkey', fq=self.fq)

eq_(len(response), 1)

eq_(response.results[0]['id'], 'test-index')
eq_(response.results[0]['name'], 'monkey')
eq_(response.results[0]['title'], 'Monkey')

index_id = hashlib.md5(
'{0}{1}'.format(self.base_package_dict['id'],
config['ckan.site_id'])
).hexdigest()

eq_(response.results[0]['index_id'], index_id)

def test_no_state_no_index(self):
pkg_dict = self.base_package_dict.copy()
pkg_dict.update({
'state': None,
})

self.package_index.index_package(pkg_dict)

response = self.solr_client.query('name:monkey', fq=self.fq)

eq_(len(response), 0)

def test_clear_index(self):

self.package_index.index_package(self.base_package_dict)

self.package_index.clear()

response = self.solr_client.query('name:monkey', fq=self.fq)
eq_(len(response), 0)

def test_index_illegal_xml_chars(self):

pkg_dict = self.base_package_dict.copy()
pkg_dict.update({
'title': u'\u00c3a\u0001ltimo n\u00famero penguin',
'notes': u'\u00c3a\u0001ltimo n\u00famero penguin',
})
self.package_index.index_package(pkg_dict)

response = self.solr_client.query('name:monkey', fq=self.fq)

eq_(len(response), 1)
eq_(response.results[0]['title'], u'\u00c3altimo n\u00famero penguin')
102 changes: 0 additions & 102 deletions ckan/tests/lib/test_solr_search_index.py
Expand Up @@ -29,108 +29,6 @@ def test_solr_url_exists(self):
raise AssertionError('SOLR connection problem. Connection defined in development.ini as: solr_url=%s Error: %s' % (config['solr_url'], e))


class TestSolrSearchIndex(TestController):
"""
Tests that a package is indexed when the packagenotification is
received by the indexer.
"""
@classmethod
def setup_class(cls):
setup_test_search_index()
CreateTestData.create()
cls.solr = search.make_connection()
cls.fq = " +site_id:\"%s\" " % config['ckan.site_id']

@classmethod
def teardown_class(cls):
model.repo.rebuild_db()
cls.solr.close()

def teardown(self):
# clear the search index after every test
search.index_for('Package').clear()

def _get_index_id(self,pkg_id):
return hashlib.md5('%s%s' % (pkg_id,config['ckan.site_id'])).hexdigest()

def test_index(self):

datetime_now = datetime.now()
pkg_dict = {
'id': u'penguin-id',
'title': u'penguin',
'state': u'active',
'type': u'dataset',
'private': False,
'owner_org': None,
'metadata_created': datetime_now.isoformat(),
'metadata_modified': datetime_now.isoformat(),
'extras': [
{'key': 'test_date', 'value': '2013-03-01'},
{'key': 'test_wrong_date', 'value': 'Not a date'},
]
}
search.dispatch_by_operation('Package', pkg_dict, 'new')
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 1, len(response)
assert response.results[0]['index_id'] == self._get_index_id (pkg_dict['id'])
assert response.results[0]['title'] == 'penguin'

# looks like solrpy messes with microseconds and time zones,
# so ignore them for testing
assert datetime_now.strftime('%Y-%m-%d %H:%M:%S') == response.results[0]['metadata_created'].strftime('%Y-%m-%d %H:%M:%S')
assert datetime_now.strftime('%Y-%m-%d %H:%M:%S') == response.results[0]['metadata_modified'].strftime('%Y-%m-%d %H:%M:%S')

def test_no_state_not_indexed(self):
pkg_dict = {
'title': 'penguin'
}
search.dispatch_by_operation('Package', pkg_dict, 'new')
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 0, len(response)

def test_index_clear(self):
pkg_dict = {
'id': u'penguin-id',
'title': u'penguin',
'state': u'active',
'type': u'dataset',
'private': False,
'owner_org': None,
'metadata_created': datetime.now().isoformat(),
'metadata_modified': datetime.now().isoformat(),
}
search.dispatch_by_operation('Package', pkg_dict, 'new')
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 1, len(response)
search.index_for('Package').clear()
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 0
# clear whilst empty
search.index_for('Package').clear()
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 0

def test_index_illegal_xml_chars(self):

pkg_dict = {
'id': u'penguin-id',
'title': u'\u00c3a\u0001ltimo n\u00famero penguin',
'notes': u'\u00c3a\u0001ltimo n\u00famero penguin',
'state': u'active',
'type': u'dataset',
'private': False,
'owner_org': None,
'metadata_created': datetime.now().isoformat(),
'metadata_modified': datetime.now().isoformat(),
}
search.dispatch_by_operation('Package', pkg_dict, 'new')
response = self.solr.query('title:penguin', fq=self.fq)
assert len(response) == 1, len(response)
assert response.results[0]['index_id'] == self._get_index_id (pkg_dict['id'])
assert response.results[0]['title'] == u'\u00c3altimo n\u00famero penguin'


class TestSolrSearch:
@classmethod
def setup_class(cls):
Expand Down

0 comments on commit 3e1becd

Please sign in to comment.