1+ import json
2+
13import pytest
24from urllib3_mock import Responses
5+ import responses as req_responses
36
47import pinecone
5- from pinecone import ApiTypeError
8+ from pinecone import ApiTypeError , ApiException
69
10+ responses_req = Responses ()
711responses = Responses ('requests.packages.urllib3' )
812
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'
944
45+
46+ @req_responses .activate
1047@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+
1368 pinecone .init ('example-api-key' , environment = 'example-environment' )
1469
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'
2179
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 )
2299 index = pinecone .Index ('example-index' )
23100 resp = index .delete (ids = ['vec1' , 'vec2' ])
24101
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'
31106
32107
33108@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
36111 pinecone .init ('example-api-key' , environment = 'example-environment' )
37112 responses .add ('DELETE' , '/vectors/delete' ,
38113 body = '{}' ,
@@ -44,8 +119,9 @@ def test_missing_response_field():
44119
45120
46121@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
49125 pinecone .init ('example-api-key' , environment = 'example-environment' )
50126
51127 responses .add ('DELETE' , '/vectors/delete' ,
0 commit comments