Skip to content

Commit

Permalink
Merge branch 'revision-limit'
Browse files Browse the repository at this point in the history
Conflicts:
	ckan/controllers/api.py
  • Loading branch information
joetsoi committed Sep 9, 2015
2 parents 2b178c5 + bf17fbc commit bdde94c
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 73 deletions.
10 changes: 6 additions & 4 deletions ckan/controllers/api.py
Expand Up @@ -509,10 +509,12 @@ def search(self, ver=None, register=None):
else:
return self._finish_bad_request(
_("Missing search term ('since_id=UUID' or " +
" 'since_time=TIMESTAMP')"))
revs = model.Session.query(model.Revision).\
filter(model.Revision.timestamp > since_time)
return self._finish_ok([rev_.id for rev_ in revs])
" 'since_time=TIMESTAMP')"))
revs = model.Session.query(model.Revision) \
.filter(model.Revision.timestamp > since_time) \
.order_by(model.Revision.timestamp) \
.limit(50) # reasonable enough for a page
return self._finish_ok([rev.id for rev in revs])
elif register in ['dataset', 'package', 'resource']:
try:
params = MultiDict(self._get_search_params(request.params))
Expand Down
86 changes: 86 additions & 0 deletions ckan/tests/controllers/test_api.py
Expand Up @@ -8,7 +8,9 @@
from nose.tools import assert_equal

import ckan.tests.helpers as helpers
from ckan.tests.helpers import assert_in
from ckan.tests import factories
from ckan import model


class TestApiController(helpers.FunctionalTestBase):
Expand Down Expand Up @@ -166,3 +168,87 @@ def test_organization_autocomplete_by_title(self):
results = json.loads(response.body)
assert_equal(len(results), 1)
assert_equal(results[0]['title'], 'Simple dummy org')


class TestRevisionSearch(helpers.FunctionalTestBase):

# Error cases

def test_no_search_term(self):
app = self._get_test_app()
response = app.get('/api/search/revision', status=400)
assert_in('Bad request - Missing search term', response.body)

def test_no_search_term_api_v2(self):
app = self._get_test_app()
response = app.get('/api/2/search/revision', status=400)
assert_in('Bad request - Missing search term', response.body)

def test_date_instead_of_revision(self):
app = self._get_test_app()
response = app.get('/api/search/revision'
'?since_id=2010-01-01T00:00:00', status=404)
assert_in('Not found - There is no revision', response.body)

def test_date_invalid(self):
app = self._get_test_app()
response = app.get('/api/search/revision'
'?since_time=2010-02-31T00:00:00', status=400)
assert_in('Bad request - ValueError: day is out of range for month',
response.body)

def test_no_value(self):
app = self._get_test_app()
response = app.get('/api/search/revision?since_id=', status=400)
assert_in('Bad request - No revision specified', response.body)

def test_revision_doesnt_exist(self):
app = self._get_test_app()
response = app.get('/api/search/revision?since_id=1234', status=404)
assert_in('Not found - There is no revision', response.body)

def test_revision_doesnt_exist_api_v2(self):
app = self._get_test_app()
response = app.get('/api/2/search/revision?since_id=1234', status=404)
assert_in('Not found - There is no revision', response.body)

# Normal usage

@classmethod
def _create_revisions(cls, num_revisions):
rev_ids = []
for i in xrange(num_revisions):
rev = model.repo.new_revision()
rev.id = unicode(i)
model.Session.commit()
rev_ids.append(rev.id)
return rev_ids

def test_revision_since_id(self):
rev_ids = self._create_revisions(4)
app = self._get_test_app()

response = app.get('/api/2/search/revision?since_id=%s' % rev_ids[1])

res = json.loads(response.body)
assert_equal(res, rev_ids[2:])

def test_revision_since_time(self):
rev_ids = self._create_revisions(4)
app = self._get_test_app()

rev1 = model.Session.query(model.Revision).get(rev_ids[1])
response = app.get('/api/2/search/revision?since_time=%s'
% rev1.timestamp.isoformat())

res = json.loads(response.body)
assert_equal(res, rev_ids[2:])

def test_revisions_returned_are_limited(self):
rev_ids = self._create_revisions(55)
app = self._get_test_app()

response = app.get('/api/2/search/revision?since_id=%s' % rev_ids[1])

res = json.loads(response.body)
assert_equal(res, rev_ids[2:52]) # i.e. limited to 50
68 changes: 0 additions & 68 deletions ckan/tests/legacy/functional/api/test_revision_search.py

This file was deleted.

3 changes: 2 additions & 1 deletion doc/api/legacy-api.rst
Expand Up @@ -315,7 +315,8 @@ Here are the data formats for the Search API.
| Resource-Search-Response| { count: Count-int, results: [Resource, Resource, ... ] } |
+-------------------------+------------------------------------------------------------+
| Revision-List | [ Revision-Id, Revision-Id, Revision-Id, ... ] |
| | NB: Ordered with youngest revision first |
| | NB: Ordered with youngest revision first. |
| | NB: Limited to 50 results at a time. |
+-------------------------+------------------------------------------------------------+
| Tag-Count-List | [ [Name-String, Integer], [Name-String, Integer], ... ] |
+-------------------------+------------------------------------------------------------+
Expand Down

0 comments on commit bdde94c

Please sign in to comment.