Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit 5887ef4

Browse files
committed
Added support for info and search_info endpoints in design document
- Added unit tests in DesignDocumentTests
1 parent 29f025a commit 5887ef4

File tree

3 files changed

+63
-8
lines changed

3 files changed

+63
-8
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- [NEW] Added support for Cloudant Search index management.
55
- [NEW] Added support for managing and querying list functions.
66
- [NEW] Added ``rewrites`` accessor property for URL rewriting.
7+
- [NEW] Added support for DesignDocument ``_info`` and ``_search_info`` endpoints.
78
- [NEW] Added support for a custom ``requests.HTTPAdapter`` to be configured using an optional ``adapter`` arg e.g.
89
``Cloudant(USERNAME, PASSWORD, account=ACCOUNT_NAME, adapter=Replay429Adapter())``.
910
- [IMPROVED] Made the 429 response code backoff optional and configurable. To enable the backoff add

src/cloudant/design_document.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,4 +488,17 @@ def info(self):
488488
489489
GET databasename/_design/{ddoc}/_info
490490
"""
491-
raise NotImplementedError("_info not yet implemented")
491+
ddoc_info = self.r_session.get(
492+
'/'.join([self.document_url, '_info']))
493+
return ddoc_info.json()
494+
495+
def search_info(self, search_index):
496+
"""
497+
Retrieves information about a specified search index within the design
498+
document, returns dictionary
499+
500+
GET databasename/_design/{ddoc}/_search_info/{search_index}
501+
"""
502+
ddoc_search_info = self.r_session.get(
503+
'/'.join([self.document_url, '_search_info', search_index]))
504+
return ddoc_search_info.json()

tests/unit/design_document_tests.py

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
module docstring.
2222
2323
"""
24+
import os
2425
import unittest
2526

2627
from cloudant.document import Document
@@ -681,15 +682,55 @@ def test_get_view(self):
681682

682683
def test_get_info(self):
683684
"""
684-
Test that the appropriate "not implemented" exception is raised
685-
when attempting to execute the .info() method
685+
Test retrieval of info endpoint from the DesignDocument.
686686
"""
687687
ddoc = DesignDocument(self.db, '_design/ddoc001')
688-
try:
689-
ddoc.info()
690-
self.fail('Above statement should raise an Exception')
691-
except NotImplementedError as err:
692-
self.assertEqual(str(err), '_info not yet implemented')
688+
ddoc.save()
689+
ddoc_remote = DesignDocument(self.db, '_design/ddoc001')
690+
ddoc_remote.fetch()
691+
info = ddoc_remote.info()
692+
info['view_index'].pop('signature')
693+
info['view_index'].pop('disk_size')
694+
# Remove Cloudant specific sizes object
695+
if 'sizes' in info['view_index']:
696+
info['view_index'].pop('sizes')
697+
name = ddoc_remote['_id']
698+
else:
699+
name = 'ddoc001'
700+
self.assertEqual(
701+
info,
702+
{'view_index': {'update_seq': 0, 'waiting_clients': 0,
703+
'language': 'javascript',
704+
'purge_seq': 0, 'compact_running': False,
705+
'waiting_commit': False, 'updater_running': False,
706+
'data_size': 0}, 'name': name})
707+
708+
@unittest.skipUnless(
709+
os.environ.get('RUN_CLOUDANT_TESTS') is not None,
710+
'Skipping Cloudant _search_info endpoint test'
711+
)
712+
def test_get_search_info(self):
713+
"""
714+
Test retrieval of search_info endpoint from the DesignDocument.
715+
"""
716+
self.populate_db_with_documents(100)
717+
ddoc = DesignDocument(self.db, '_design/ddoc001')
718+
ddoc.add_search_index(
719+
'search001',
720+
'function (doc) {\n index("default", doc._id); '
721+
'if (doc._id) {index("name", doc.name, {"store": true}); }\n}'
722+
)
723+
ddoc.save()
724+
ddoc_remote = DesignDocument(self.db, '_design/ddoc001')
725+
ddoc_remote.fetch()
726+
search_info = ddoc_remote.search_info('search001')
727+
search_info['search_index'].pop('disk_size')
728+
self.assertEqual(
729+
search_info,
730+
{'name': '_design/ddoc001/search001',
731+
'search_index': {'doc_del_count': 0, 'doc_count': 100,
732+
'pending_seq': 101, 'committed_seq': 0},
733+
})
693734

694735
def test_add_a_search_index(self):
695736
"""

0 commit comments

Comments
 (0)