Skip to content

Commit c4fc48d

Browse files
committed
Refactor Tests for test_client directory
1 parent 25b50e3 commit c4fc48d

File tree

8 files changed

+197
-160
lines changed

8 files changed

+197
-160
lines changed

test_elasticsearch/test_async/test_server/test_clients.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,10 @@ async def test_indices_analyze(self, async_client):
2929

3030

3131
class TestBulk:
32-
async def test_bulk_works_with_string_body(self, async_client):
33-
docs = '{ "index" : { "_index" : "bulk_test_index", "_id" : "1" } }\n{"answer": 42}'
34-
response = await async_client.bulk(body=docs)
35-
36-
assert response["errors"] is False
37-
assert len(response["items"]) == 1
32+
docs = '{ "index" : { "_index" : "bulk_test_index", "_id" : "1" } }\n{"answer": 42}'
3833

39-
async def test_bulk_works_with_bytestring_body(self, async_client):
40-
docs = b'{ "index" : { "_index" : "bulk_test_index", "_id" : "2" } }\n{"answer": 42}'
34+
@pytest.mark.parametrize("docs", [docs, docs.encode("utf-8")])
35+
async def test_bulk_works_with_string_bytestring_body(self, docs, async_client):
4136
response = await async_client.bulk(body=docs)
4237

4338
assert response["errors"] is False

test_elasticsearch/test_client/__init__.py

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,52 +17,9 @@
1717

1818
from __future__ import unicode_literals
1919

20-
from elasticsearch.client import Elasticsearch, _normalize_hosts
20+
from elasticsearch.client import Elasticsearch
2121

22-
from ..test_cases import ElasticsearchTestCase, TestCase
23-
24-
25-
class TestNormalizeHosts(TestCase):
26-
def test_none_uses_defaults(self):
27-
self.assertEqual([{}], _normalize_hosts(None))
28-
29-
def test_strings_are_used_as_hostnames(self):
30-
self.assertEqual([{"host": "elastic.co"}], _normalize_hosts(["elastic.co"]))
31-
32-
def test_strings_are_parsed_for_port_and_user(self):
33-
self.assertEqual(
34-
[
35-
{"host": "elastic.co", "port": 42},
36-
{"host": "elastic.co", "http_auth": "user:secre]"},
37-
],
38-
_normalize_hosts(["elastic.co:42", "user:secre%5D@elastic.co"]),
39-
)
40-
41-
def test_strings_are_parsed_for_scheme(self):
42-
self.assertEqual(
43-
[
44-
{"host": "elastic.co", "port": 42, "use_ssl": True},
45-
{
46-
"host": "elastic.co",
47-
"http_auth": "user:secret",
48-
"use_ssl": True,
49-
"port": 443,
50-
"url_prefix": "/prefix",
51-
},
52-
],
53-
_normalize_hosts(
54-
["https://elastic.co:42", "https://user:secret@elastic.co/prefix"]
55-
),
56-
)
57-
58-
def test_dicts_are_left_unchanged(self):
59-
self.assertEqual(
60-
[{"host": "local", "extra": 123}],
61-
_normalize_hosts([{"host": "local", "extra": 123}]),
62-
)
63-
64-
def test_single_string_is_wrapped_in_list(self):
65-
self.assertEqual([{"host": "elastic.co"}], _normalize_hosts("elastic.co"))
22+
from ..test_cases import ElasticsearchTestCase
6623

6724

6825
class TestClient(ElasticsearchTestCase):
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Licensed to Elasticsearch B.V. under one or more contributor
2+
# license agreements. See the NOTICE file distributed with
3+
# this work for additional information regarding copyright
4+
# ownership. Elasticsearch B.V. licenses this file to you under
5+
# the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
18+
from collections import defaultdict
19+
from typing import TYPE_CHECKING
20+
21+
from elasticsearch.connection import Connection
22+
23+
if TYPE_CHECKING:
24+
from elasticsearch import Elasticsearch
25+
26+
27+
class DummyTransport(Connection):
28+
def __init__(self, hosts, **kwargs):
29+
self.hosts = hosts
30+
self.responses = kwargs.pop("responses", None)
31+
self.call_count = 0
32+
self.calls = defaultdict(list)
33+
34+
def perform_request(self, method, url, params=None, headers=None, body=None):
35+
resp = 200, {}
36+
if self.responses:
37+
resp = self.responses[self.call_count]
38+
self.call_count += 1
39+
self.calls[(method, url)].append((params, headers, body))
40+
return resp
41+
42+
43+
def assert_helper(client: "Elasticsearch", method: str, url: str) -> None:
44+
calls = client.transport.calls
45+
assert 1 == len(calls)
46+
assert (method, url) in calls

test_elasticsearch/test_client/test_cluster.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,38 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18-
from test_elasticsearch.test_cases import ElasticsearchTestCase
19-
20-
21-
class TestCluster(ElasticsearchTestCase):
22-
def test_stats_without_node_id(self):
23-
self.client.cluster.stats()
24-
self.assert_url_called("GET", "/_cluster/stats")
25-
26-
def test_stats_with_node_id(self):
27-
self.client.cluster.stats("node-1")
28-
self.assert_url_called("GET", "/_cluster/stats/nodes/node-1")
29-
30-
self.client.cluster.stats(node_id="node-2")
31-
self.assert_url_called("GET", "/_cluster/stats/nodes/node-2")
32-
33-
def test_state_with_index_without_metric_defaults_to_all(self):
34-
self.client.cluster.state()
35-
self.assert_url_called("GET", "/_cluster/state")
36-
37-
self.client.cluster.state(metric="cluster_name")
38-
self.assert_url_called("GET", "/_cluster/state/cluster_name")
39-
40-
self.client.cluster.state(index="index-1")
41-
self.assert_url_called("GET", "/_cluster/state/_all/index-1")
42-
43-
self.client.cluster.state(index="index-1", metric="cluster_name")
44-
self.assert_url_called("GET", "/_cluster/state/cluster_name/index-1")
18+
import pytest
19+
20+
from elasticsearch.client import Elasticsearch
21+
22+
from .common import DummyTransport, assert_helper
23+
24+
25+
class TestCluster:
26+
@pytest.mark.parametrize("node_id", [None, "node-1", "node-2"])
27+
def test_stats_node_id(self, node_id):
28+
client = Elasticsearch(transport_class=DummyTransport)
29+
client.cluster.stats(node_id=node_id)
30+
url = "/_cluster/stats"
31+
if node_id:
32+
url += f"/nodes/{node_id}"
33+
assert_helper(client, "GET", url)
34+
35+
@pytest.mark.parametrize(
36+
["index", "metric", "url_suffix"],
37+
[
38+
(None, None, None),
39+
(None, "cluster_name", "/cluster_name"),
40+
("index-1", None, "/_all/index-1"),
41+
("index-1", "cluster_name", "/cluster_name/index-1"),
42+
],
43+
)
44+
def test_state_with_index_without_metric_defaults_to_all(
45+
self, index, metric, url_suffix
46+
):
47+
client = Elasticsearch(transport_class=DummyTransport)
48+
client.cluster.state(index=index, metric=metric)
49+
url = "/_cluster/state"
50+
if url_suffix:
51+
url += url_suffix
52+
assert_helper(client, "GET", url)

test_elasticsearch/test_client/test_indices.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,31 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18-
from test_elasticsearch.test_cases import ElasticsearchTestCase
18+
import pytest
1919

20+
from elasticsearch.client import Elasticsearch
2021

21-
class TestIndices(ElasticsearchTestCase):
22+
from .common import DummyTransport, assert_helper
23+
24+
25+
class TestIndices:
2226
def test_create_one_index(self):
23-
self.client.indices.create("test-index")
24-
self.assert_url_called("PUT", "/test-index")
27+
client = Elasticsearch(transport_class=DummyTransport)
28+
client.indices.create("test-index")
29+
assert_helper(client, "PUT", "/test-index")
2530

2631
def test_delete_multiple_indices(self):
27-
self.client.indices.delete(["test-index", "second.index", "third/index"])
28-
self.assert_url_called("DELETE", "/test-index,second.index,third%2Findex")
32+
client = Elasticsearch(transport_class=DummyTransport)
33+
client.indices.delete(["test-index", "second.index", "third/index"])
34+
assert_helper(client, "DELETE", "/test-index,second.index,third%2Findex")
2935

3036
def test_exists_index(self):
31-
self.client.indices.exists("second.index,third/index")
32-
self.assert_url_called("HEAD", "/second.index,third%2Findex")
37+
client = Elasticsearch(transport_class=DummyTransport)
38+
client.indices.exists("second.index,third/index")
39+
assert_helper(client, "HEAD", "/second.index,third%2Findex")
3340

34-
def test_passing_empty_value_for_required_param_raises_exception(self):
35-
self.assertRaises(ValueError, self.client.indices.exists, index=None)
36-
self.assertRaises(ValueError, self.client.indices.exists, index=[])
37-
self.assertRaises(ValueError, self.client.indices.exists, index="")
41+
@pytest.mark.parametrize("index", [None, [], ""])
42+
def test_passing_empty_value_for_required_param_raises_exception(self, index):
43+
client = Elasticsearch(transport_class=DummyTransport)
44+
with pytest.raises(ValueError):
45+
client.indices.exists(index=index)

test_elasticsearch/test_client/test_overrides.py

Lines changed: 43 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -16,55 +16,46 @@
1616
# specific language governing permissions and limitations
1717
# under the License.
1818

19-
from test_elasticsearch.test_cases import ElasticsearchTestCase
20-
21-
22-
class TestOverriddenUrlTargets(ElasticsearchTestCase):
23-
def test_create(self):
24-
self.client.create(index="test-index", id="test-id", body={})
25-
self.assert_url_called("PUT", "/test-index/_create/test-id")
26-
27-
self.client.create(
28-
index="test-index", doc_type="test-type", id="test-id", body={}
29-
)
30-
self.assert_url_called("PUT", "/test-index/test-type/test-id/_create")
31-
32-
def test_delete(self):
33-
self.client.delete(index="test-index", id="test-id")
34-
self.assert_url_called("DELETE", "/test-index/_doc/test-id")
35-
36-
self.client.delete(index="test-index", doc_type="test-type", id="test-id")
37-
self.assert_url_called("DELETE", "/test-index/test-type/test-id")
38-
39-
def test_index(self):
40-
self.client.index(index="test-index", body={})
41-
self.assert_url_called("POST", "/test-index/_doc")
42-
43-
self.client.index(index="test-index", id="test-id", body={})
44-
self.assert_url_called("PUT", "/test-index/_doc/test-id")
45-
46-
def test_update(self):
47-
self.client.update(index="test-index", id="test-id", body={})
48-
self.assert_url_called("POST", "/test-index/_update/test-id")
49-
50-
self.client.update(
51-
index="test-index", doc_type="test-type", id="test-id", body={}
52-
)
53-
self.assert_url_called("POST", "/test-index/test-type/test-id/_update")
54-
55-
def test_cluster_state(self):
56-
self.client.cluster.state()
57-
self.assert_url_called("GET", "/_cluster/state")
58-
59-
self.client.cluster.state(index="test-index")
60-
self.assert_url_called("GET", "/_cluster/state/_all/test-index")
61-
62-
self.client.cluster.state(index="test-index", metric="test-metric")
63-
self.assert_url_called("GET", "/_cluster/state/test-metric/test-index")
64-
65-
def test_cluster_stats(self):
66-
self.client.cluster.stats()
67-
self.assert_url_called("GET", "/_cluster/stats")
68-
69-
self.client.cluster.stats(node_id="test-node")
70-
self.assert_url_called("GET", "/_cluster/stats/nodes/test-node")
19+
import pytest
20+
21+
from elasticsearch.client import Elasticsearch
22+
23+
from .common import DummyTransport, assert_helper
24+
25+
26+
class TestOverriddenUrlTargets:
27+
@pytest.mark.parametrize(
28+
["doc_type", "url_suffix"],
29+
[(None, "/_create/test-id"), ("test-type", "/test-type/test-id/_create")],
30+
)
31+
def test_create(self, doc_type, url_suffix):
32+
client = Elasticsearch(transport_class=DummyTransport)
33+
client.create(index="test-index", doc_type=doc_type, id="test-id", body={})
34+
assert_helper(client, "PUT", "/test-index" + url_suffix)
35+
36+
@pytest.mark.parametrize(
37+
["doc_type", "url_suffix"],
38+
[(None, "/_doc/test-id"), ("test-type", "/test-type/test-id")],
39+
)
40+
def test_delete(self, doc_type, url_suffix):
41+
client = Elasticsearch(transport_class=DummyTransport)
42+
client.delete(index="test-index", doc_type=doc_type, id="test-id")
43+
assert_helper(client, "DELETE", "/test-index" + url_suffix)
44+
45+
@pytest.mark.parametrize(
46+
["doc_type", "url_suffix"],
47+
[(None, "/_update/test-id"), ("test-type", "/test-type/test-id/_update")],
48+
)
49+
def test_update(self, doc_type, url_suffix):
50+
client = Elasticsearch(transport_class=DummyTransport)
51+
client.update(index="test-index", doc_type=doc_type, id="test-id", body={})
52+
assert_helper(client, "POST", "/test-index" + url_suffix)
53+
54+
@pytest.mark.parametrize(
55+
["request_method", "id", "url_suffix"],
56+
[("POST", None, ""), ("PUT", "test-id", "/test-id")],
57+
)
58+
def test_index(self, request_method, id, url_suffix):
59+
client = Elasticsearch(transport_class=DummyTransport)
60+
client.index(index="test-index", id=id, body={})
61+
assert_helper(client, request_method, "/test-index/_doc" + url_suffix)

test_elasticsearch/test_client/test_utils.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,49 @@
1818

1919
from __future__ import unicode_literals
2020

21+
from elasticsearch.client import _normalize_hosts
2122
from elasticsearch.client.utils import _bulk_body, _escape, _make_path, query_params
2223
from elasticsearch.compat import PY2
2324

2425
from ..test_cases import SkipTest, TestCase
2526

2627

28+
class TestNormalizeHosts:
29+
def test_none_uses_defaults(self):
30+
assert [{}] == _normalize_hosts(None)
31+
32+
def test_strings_are_used_as_hostnames(self):
33+
assert [{"host": "elastic.co"}] == _normalize_hosts(["elastic.co"])
34+
35+
def test_strings_are_parsed_for_port_and_user(self):
36+
assert [
37+
{"host": "elastic.co", "port": 42},
38+
{"host": "elastic.co", "http_auth": "user:secre]"},
39+
] == _normalize_hosts(["elastic.co:42", "user:secre%5D@elastic.co"])
40+
41+
def test_strings_are_parsed_for_scheme(self):
42+
assert [
43+
{"host": "elastic.co", "port": 42, "use_ssl": True},
44+
{
45+
"host": "elastic.co",
46+
"http_auth": "user:secret",
47+
"use_ssl": True,
48+
"port": 443,
49+
"url_prefix": "/prefix",
50+
},
51+
] == _normalize_hosts(
52+
["https://elastic.co:42", "https://user:secret@elastic.co/prefix"]
53+
)
54+
55+
def test_dicts_are_left_unchanged(self):
56+
assert [{"host": "local", "extra": 123}] == _normalize_hosts(
57+
[{"host": "local", "extra": 123}]
58+
)
59+
60+
def test_single_string_is_wrapped_in_list(self):
61+
assert [{"host": "elastic.co"}] == _normalize_hosts("elastic.co")
62+
63+
2764
class TestQueryParams(TestCase):
2865
def setup_method(self, _):
2966
self.calls = []

0 commit comments

Comments
 (0)