Skip to content

Commit 4843de4

Browse files
Improved unit tests - shorter and easier to edit
Mostly syntax improvements, to slightly reduce code duplication
1 parent df2b3b5 commit 4843de4

File tree

1 file changed

+69
-49
lines changed

1 file changed

+69
-49
lines changed

tests/unit/test_grpc_index.py

+69-49
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
from copy import deepcopy
2+
3+
import numpy as np
14
import pytest
25

36
import pinecone
4-
from core.utils import dict_to_proto_struct
57
from pinecone import DescribeIndexStatsRequest
68
from pinecone.core.grpc.protos.vector_service_pb2 import Vector, DescribeIndexStatsRequest, UpdateRequest, \
7-
UpsertRequest, FetchRequest, QueryRequest, DeleteRequest, QueryVector, UpsertResponse
9+
UpsertRequest, FetchRequest, QueryRequest, DeleteRequest, QueryVector, UpsertResponse, SparseValues
10+
from pinecone.core.utils import dict_to_proto_struct
811

912

1013
class TestGrpcIndex:
@@ -13,6 +16,10 @@ def setup_method(self):
1316
self.vector_dim = 8
1417
self.vals1 = [0.1] * self.vector_dim
1518
self.vals2 = [0.2] * self.vector_dim
19+
self.sparse_indices_1 = [1, 8, 42]
20+
self.sparse_values_1 = [0.8, 0.9, 0.42]
21+
self.sparse_indices_2 = [1, 3, 5]
22+
self.sparse_values_2 = [0.7, 0.3, 0.31415]
1623
self.md1 = {'genre': 'action', 'year': 2021}
1724
self.md2 = {'genre': 'documentary', 'year': 2020}
1825
self.filter1 = {'genre': {'$in': ['action']}}
@@ -21,59 +28,77 @@ def setup_method(self):
2128
pinecone.init(api_key='example-key')
2229
self.index = pinecone.GRPCIndex('example-name')
2330

31+
self.expected_vec1 = Vector(id='vec1', values=self.vals1, metadata={})
32+
self.expected_vec2 = Vector(id='vec2', values=self.vals2, metadata={})
33+
self.expected_vec_md1 = Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1))
34+
self.expected_vec_md2 = Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))
35+
2436
# region: upsert tests
2537

26-
def test_upsert_tuplesOfIdVec_UpserWithoutMD(self, mocker):
27-
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
28-
self.index.upsert([('vec1', self.vals1), ('vec2', self.vals2)], namespace='ns')
38+
def _assert_called_once(self, vectors):
2939
self.index._wrap_grpc_call.assert_called_once_with(
3040
self.index.stub.Upsert,
3141
UpsertRequest(
32-
vectors=[
33-
Vector(id='vec1', values=self.vals1, metadata={}),
34-
Vector(id='vec2', values=self.vals2, metadata={})],
42+
vectors=vectors,
3543
namespace='ns'),
3644
timeout=None
3745
)
3846

47+
def test_upsert_tuplesOfIdVec_UpserWithoutMD(self, mocker):
48+
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
49+
self.index.upsert([('vec1', self.vals1), ('vec2', self.vals2)], namespace='ns')
50+
self._assert_called_once([
51+
self.expected_vec1,
52+
self.expected_vec2
53+
])
54+
55+
3956
def test_upsert_tuplesOfIdVecMD_UpsertVectorsWithMD(self, mocker):
4057
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
4158
self.index.upsert([('vec1', self.vals1, self.md1), ('vec2', self.vals2, self.md2)], namespace='ns')
42-
self.index._wrap_grpc_call.assert_called_once_with(
43-
self.index.stub.Upsert,
44-
UpsertRequest(
45-
vectors=[
46-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
47-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
48-
namespace='ns'),
49-
timeout=None)
59+
self._assert_called_once([
60+
self.expected_vec_md1,
61+
self.expected_vec_md2],
62+
)
63+
5064

5165
def test_upsert_vectors_upsertInputVectors(self, mocker):
5266
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
53-
self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
54-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
67+
self.index.upsert([self.expected_vec_md1,
68+
self.expected_vec_md2],
5569
namespace='ns')
56-
self.index._wrap_grpc_call.assert_called_once_with(
57-
self.index.stub.Upsert,
58-
UpsertRequest(
59-
vectors=[
60-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
61-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
62-
namespace='ns'),
63-
timeout=None)
70+
self._assert_called_once([
71+
self.expected_vec_md1,
72+
self.expected_vec_md2],
73+
)
74+
75+
76+
def test_upsert_vectors_upsertInputVectorsSparse(self, mocker):
77+
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
78+
self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1),
79+
sparse_values=SparseValues(indices=self.sparse_indices_1, values=self.sparse_values_1)),
80+
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2),
81+
sparse_values=SparseValues(indices=self.sparse_indices_2, values=self.sparse_values_2))],
82+
namespace='ns')
83+
self._assert_called_once([
84+
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1),
85+
sparse_values=SparseValues(indices=self.sparse_indices_1, values=self.sparse_values_1)),
86+
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2),
87+
sparse_values=SparseValues(indices=self.sparse_indices_2, values=self.sparse_values_2))],
88+
)
6489

6590
def test_upsert_async_upsertInputVectorsAsync(self, mocker):
6691
mocker.patch.object(self.index, '_wrap_grpc_call', autospec=True)
67-
self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
68-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
92+
self.index.upsert([self.expected_vec_md1,
93+
self.expected_vec_md2],
6994
namespace='ns',
7095
async_req=True)
7196
self.index._wrap_grpc_call.assert_called_once_with(
7297
self.index.stub.Upsert.future,
7398
UpsertRequest(
7499
vectors=[
75-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
76-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
100+
self.expected_vec_md1,
101+
self.expected_vec_md2],
77102
namespace='ns'),
78103
timeout=None)
79104

@@ -82,8 +107,8 @@ def test_upsert_vectorListIsMultiplyOfBatchSize_vectorsUpsertedInBatches(self, m
82107
side_effect=lambda stub, upsert_request, timeout: UpsertResponse(
83108
upserted_count=len(upsert_request.vectors)))
84109

85-
result = self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
86-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
110+
result = self.index.upsert([self.expected_vec_md1,
111+
self.expected_vec_md2],
87112
namespace='ns',
88113
batch_size=1,
89114
show_progress=False)
@@ -98,7 +123,7 @@ def test_upsert_vectorListIsMultiplyOfBatchSize_vectorsUpsertedInBatches(self, m
98123
self.index._wrap_grpc_call.assert_any_call(
99124
self.index.stub.Upsert,
100125
UpsertRequest(
101-
vectors=[Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
126+
vectors=[self.expected_vec_md2],
102127
namespace='ns'),
103128
timeout=None)
104129

@@ -109,7 +134,7 @@ def test_upsert_vectorListNotMultiplyOfBatchSize_vectorsUpsertedInBatches(self,
109134
side_effect=lambda stub, upsert_request, timeout: UpsertResponse(
110135
upserted_count=len(upsert_request.vectors)))
111136

112-
result = self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
137+
result = self.index.upsert([self.expected_vec_md1,
113138
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2)),
114139
Vector(id='vec3', values=self.vals1, metadata=dict_to_proto_struct(self.md1))],
115140
namespace='ns',
@@ -118,8 +143,8 @@ def test_upsert_vectorListNotMultiplyOfBatchSize_vectorsUpsertedInBatches(self,
118143
self.index.stub.Upsert,
119144
UpsertRequest(
120145
vectors=[
121-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
122-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
146+
self.expected_vec_md1,
147+
self.expected_vec_md2],
123148
namespace='ns'),
124149
timeout=None)
125150

@@ -137,19 +162,14 @@ def test_upsert_vectorListSmallerThanBatchSize_vectorsUpsertedInBatches(self, mo
137162
side_effect=lambda stub, upsert_request, timeout: UpsertResponse(
138163
upserted_count=len(upsert_request.vectors)))
139164

140-
result = self.index.upsert([Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
141-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
165+
result = self.index.upsert([self.expected_vec_md1,
166+
self.expected_vec_md2],
142167
namespace='ns',
143168
batch_size=5)
144-
145-
self.index._wrap_grpc_call.assert_called_once_with(
146-
self.index.stub.Upsert,
147-
UpsertRequest(
148-
vectors=[
149-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
150-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
151-
namespace='ns'),
152-
timeout=None)
169+
self._assert_called_once([
170+
self.expected_vec_md1,
171+
self.expected_vec_md2],
172+
)
153173

154174
assert result.upserted_count == 2
155175

@@ -167,8 +187,8 @@ def test_upsert_tuplesList_vectorsUpsertedInBatches(self, mocker):
167187
self.index.stub.Upsert,
168188
UpsertRequest(
169189
vectors=[
170-
Vector(id='vec1', values=self.vals1, metadata=dict_to_proto_struct(self.md1)),
171-
Vector(id='vec2', values=self.vals2, metadata=dict_to_proto_struct(self.md2))],
190+
self.expected_vec_md1,
191+
self.expected_vec_md2],
172192
namespace='ns'),
173193
timeout=None)
174194

0 commit comments

Comments
 (0)