Simple test case for unit testing client commands
This commit is contained in:
@@ -83,7 +83,7 @@ class Elasticsearch(object):
|
|||||||
Elasticsearch low-level client. Provides a straightforward mapping from
|
Elasticsearch low-level client. Provides a straightforward mapping from
|
||||||
Python to ES REST endpoints.
|
Python to ES REST endpoints.
|
||||||
"""
|
"""
|
||||||
def __init__(self, hosts=None, **kwargs):
|
def __init__(self, hosts=None, transport_class=Transport, **kwargs):
|
||||||
"""
|
"""
|
||||||
:arg hosts: list of nodes we should connect to. Node should be a
|
:arg hosts: list of nodes we should connect to. Node should be a
|
||||||
dictionary ({"host": "localhost", "port": 9200}), the entire dictionary
|
dictionary ({"host": "localhost", "port": 9200}), the entire dictionary
|
||||||
@@ -92,11 +92,13 @@ class Elasticsearch(object):
|
|||||||
translated to a dictionary automatically. If no value is given the
|
translated to a dictionary automatically. If no value is given the
|
||||||
:class:`~elasticsearch.Connection` class defaults will be used.
|
:class:`~elasticsearch.Connection` class defaults will be used.
|
||||||
|
|
||||||
|
:arg transport_class: :class:`~elasticsearch.Transport` subclass to use.
|
||||||
|
|
||||||
:arg kwargs: any additional arguments will be passed on to the
|
:arg kwargs: any additional arguments will be passed on to the
|
||||||
:class:`~elasticsearch.Transport` class and, subsequently, to the
|
:class:`~elasticsearch.Transport` class and, subsequently, to the
|
||||||
:class:`~elasticsearch.Connection` instances.
|
:class:`~elasticsearch.Connection` instances.
|
||||||
"""
|
"""
|
||||||
self.transport = Transport(_normalize_hosts(hosts), **kwargs)
|
self.transport = transport_class(_normalize_hosts(hosts), **kwargs)
|
||||||
|
|
||||||
# namespaced clients for compatibility with API names
|
# namespaced clients for compatibility with API names
|
||||||
self.indices = InidicesClient(self)
|
self.indices = InidicesClient(self)
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
from elasticsearch import Elasticsearch
|
||||||
|
|
||||||
|
class DummyTransport(object):
|
||||||
|
def __init__(self, hosts, responses=None, **kwargs):
|
||||||
|
self.responses = responses
|
||||||
|
self.call_count = 0
|
||||||
|
self.calls = defaultdict(list)
|
||||||
|
|
||||||
|
def perform_request(self, method, url, params=None, body=None):
|
||||||
|
resp = 200, {}
|
||||||
|
if self.responses:
|
||||||
|
resp = self.responses[self.call_count]
|
||||||
|
self.call_count += 1
|
||||||
|
self.calls[(method, url)].append((params, body))
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
class ElasticsearchTestCase(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(ElasticsearchTestCase, self).setUp()
|
||||||
|
self.client = Elasticsearch(transport_class=DummyTransport)
|
||||||
|
|
||||||
|
def assert_call_count_equals(self, count):
|
||||||
|
self.assertEquals(count, self.client.transport.call_count)
|
||||||
|
|
||||||
|
def assert_url_called(self, method, url, count=1):
|
||||||
|
self.assertIn((method, url), self.client.transport.calls)
|
||||||
|
calls = self.client.transport.calls[(method, url)]
|
||||||
|
self.assertEquals(count, len(calls))
|
||||||
|
return calls
|
||||||
|
|
||||||
|
|
||||||
|
class TestElasticsearchTestCase(ElasticsearchTestCase):
|
||||||
|
def test_our_transport_used(self):
|
||||||
|
self.assertIsInstance(self.client.transport, DummyTransport)
|
||||||
|
|
||||||
|
def test_start_with_0_call(self):
|
||||||
|
self.assert_call_count_equals(0)
|
||||||
|
|
||||||
|
def test_each_call_is_recorded(self):
|
||||||
|
self.client.transport.perform_request('GET', '/')
|
||||||
|
self.client.transport.perform_request('DELETE', '/42', params={}, body='body')
|
||||||
|
self.assert_call_count_equals(2)
|
||||||
|
self.assertEquals([({}, 'body')], self.assert_url_called('DELETE', '/42', 1))
|
||||||
Reference in New Issue
Block a user