1
+ import json
2
+
1
3
import pytest
2
4
from urllib3_mock import Responses
5
+ import responses as req_responses
3
6
4
7
import pinecone
5
- from pinecone import ApiTypeError
8
+ from pinecone import ApiTypeError , ApiException
6
9
10
+ responses_req = Responses ()
7
11
responses = Responses ('requests.packages.urllib3' )
8
12
13
+ @req_responses .activate
14
+ @responses .activate
15
+ def test_invalid_upsert_request_vector_value_type ():
16
+ environment = 'example-environment'
17
+ project_name = 'example-project'
18
+ req_responses .add (
19
+ 'GET' , f'https://controller.{ environment } .pinecone.io/actions/whoami' ,
20
+ status = 200 , content_type = 'application/json' ,
21
+ body = json .dumps (dict (project_name = project_name , user_label = 'example-label' , user_name = 'test' ))
22
+ )
23
+ responses .add (
24
+ 'POST' , '/vectors/upsert' ,
25
+ status = 400 , content_type = 'text/plain' ,
26
+ adding_headers = {
27
+ 'content-length' : '62' ,
28
+ 'date' : 'Thu, 28 Oct 2021 09:14:51 GMT' ,
29
+ 'server' : 'envoy' ,
30
+ 'connection' : 'close'
31
+ },
32
+ body = 'vectors[0].values[1]: invalid value "type" for type TYPE_FLOAT'
33
+ )
34
+
35
+ pinecone .init ('example-api-key' , environment = 'example-environment' )
36
+ with pytest .raises (ApiException ) as exc_info :
37
+ index = pinecone .Index ('example-index' )
38
+ resp = index .upsert (vectors = [('vec1' , [0.1 ]* 8 ), ('vec2' , [0.2 ]* 8 )])
39
+
40
+ assert len (responses .calls ) == 1
41
+ assert responses .calls [0 ].request .scheme == 'https'
42
+ assert responses .calls [0 ].request .host == 'example-index-example-project.svc.example-environment.pinecone.io'
43
+ assert responses .calls [0 ].request .url == '/vectors/upsert'
9
44
45
+
46
+ @req_responses .activate
10
47
@responses .activate
11
- def test_unrecognized_response_field ():
12
- # unrecognized response fields are okay, shouldn't raise an exception
48
+ def test_multiple_indexes ():
49
+ environment = 'example-environment'
50
+ project_name = 'example-project'
51
+ index1_name = 'index-1'
52
+ index2_name = 'index-2'
53
+ req_responses .add (
54
+ 'GET' , f'https://controller.{ environment } .pinecone.io/actions/whoami' ,
55
+ status = 200 , content_type = 'application/json' ,
56
+ body = json .dumps (dict (project_name = project_name , user_label = 'example-label' , user_name = 'test' ))
57
+ )
58
+ responses .add (
59
+ 'GET' , f'/describe_index_stats' ,
60
+ status = 200 , content_type = 'application/json' ,
61
+ adding_headers = {
62
+ 'date' : 'Thu, 28 Oct 2021 09:14:51 GMT' ,
63
+ 'server' : 'envoy'
64
+ },
65
+ body = '{"namespaces":{"":{"vectorCount":50000},"example-namespace-2":{"vectorCount":30000}},"dimension":1024}'
66
+ )
67
+
13
68
pinecone .init ('example-api-key' , environment = 'example-environment' )
14
69
15
- # responses.add('GET', '/actions/whoami', # fixme: requests-based, so mock fails?
16
- # body='{"project_name": "example-project", "user_label": "example-label", "user_name": "test"}',
17
- # status=200, content_type='application/json')
18
- responses .add ('DELETE' , '/vectors/delete' ,
19
- body = '{"deleted_count": 2, "unexpected_key": "xyzzy"}' ,
20
- status = 200 , content_type = 'application/json' )
70
+ index1 = pinecone .Index (index1_name )
71
+ resp1 = index1 .describe_index_stats ()
72
+ assert resp1 .dimension == 1024
73
+ assert responses .calls [0 ].request .host == f'{ index1_name } -{ project_name } .svc.{ environment } .pinecone.io'
74
+
75
+ index2 = pinecone .Index (index2_name )
76
+ resp2 = index2 .describe_index_stats ()
77
+ assert resp2 .dimension == 1024
78
+ assert responses .calls [1 ].request .host == f'{ index2_name } -{ project_name } .svc.{ environment } .pinecone.io'
21
79
80
+
81
+ @req_responses .activate
82
+ @responses .activate
83
+ def test_invalid_delete_response_unrecognized_field ():
84
+ # unrecognized response fields are okay, shouldn't raise an exception
85
+ environment = 'example-environment'
86
+ project_name = 'example-project'
87
+ req_responses .add (
88
+ 'GET' , f'https://controller.{ environment } .pinecone.io/actions/whoami' ,
89
+ status = 200 , content_type = 'application/json' ,
90
+ body = json .dumps (dict (project_name = project_name , user_label = 'example-label' , user_name = 'test' ))
91
+ )
92
+ responses .add (
93
+ 'DELETE' , '/vectors/delete' ,
94
+ body = '{"unexpected_key": "xyzzy"}' ,
95
+ status = 200 , content_type = 'application/json'
96
+ )
97
+
98
+ pinecone .init ('example-api-key' , environment = environment )
22
99
index = pinecone .Index ('example-index' )
23
100
resp = index .delete (ids = ['vec1' , 'vec2' ])
24
101
25
- # assert len(responses.calls) == 1
26
- # assert responses.calls[0].request.url == '/vectors/delete?ids=vec1&ids=vec2'
27
- # assert responses.calls[0].request.host == 'example-index-unknown.svc.example-environment.pinecone.io'
28
- # assert responses.calls[0].request.scheme == 'https'
29
-
30
- assert resp .deleted_count == 2
102
+ assert len (req_responses .calls ) == 1
103
+ assert responses .calls [0 ].request .scheme == 'https'
104
+ assert responses .calls [0 ].request .host == f'example-index-{ project_name } .svc.{ environment } .pinecone.io'
105
+ assert responses .calls [0 ].request .url == '/vectors/delete?ids=vec1&ids=vec2'
31
106
32
107
33
108
@responses .activate
34
- def test_missing_response_field ():
35
- # unrecognized response fields are okay, shouldn't raise an exception
109
+ def test_delete_response_missing_field ():
110
+ # missing (optional) response fields are okay, shouldn't raise an exception
36
111
pinecone .init ('example-api-key' , environment = 'example-environment' )
37
112
responses .add ('DELETE' , '/vectors/delete' ,
38
113
body = '{}' ,
@@ -44,8 +119,9 @@ def test_missing_response_field():
44
119
45
120
46
121
@responses .activate
47
- def test_malformed_response_wrong_type ():
48
- # unrecognized response fields are okay, shouldn't raise an exception
122
+ def _test_invalid_delete_response_wrong_type ():
123
+ # FIXME: re-enable this test when accepted_count added back to response
124
+ # wrong-typed response fields should raise an exception
49
125
pinecone .init ('example-api-key' , environment = 'example-environment' )
50
126
51
127
responses .add ('DELETE' , '/vectors/delete' ,
0 commit comments