@@ -157,18 +157,58 @@ def test_update_uses_upsert(self, milvus_db, mock_milvus_client):
157157 vector_id = "test_id"
158158 vector = [0.1 ] * 1536
159159 payload = {"user_id" : "alice" , "data" : "Updated memory" }
160-
160+
161161 milvus_db .update (vector_id = vector_id , vector = vector , payload = payload )
162-
162+
163163 # Verify upsert was called (not delete+insert)
164164 mock_milvus_client .upsert .assert_called_once ()
165-
165+
166166 call_args = mock_milvus_client .upsert .call_args
167167 assert call_args [1 ]['collection_name' ] == "test_collection"
168168 assert call_args [1 ]['data' ]['id' ] == vector_id
169169 assert call_args [1 ]['data' ]['vectors' ] == vector
170170 assert call_args [1 ]['data' ]['metadata' ] == payload
171171
172+ def test_update_with_vector_none (self , milvus_db , mock_milvus_client ):
173+ """Test that update with vector=None fetches and preserves existing vector."""
174+ vector_id = "test_id"
175+ existing_vector = [0.5 ] * 1536
176+ payload = {"user_id" : "alice" , "data" : "Updated metadata only" }
177+
178+ # Mock the get call to return existing vector
179+ mock_milvus_client .get .return_value = [
180+ {"id" : vector_id , "vectors" : existing_vector , "metadata" : {"user_id" : "alice" , "data" : "Old data" }}
181+ ]
182+
183+ # Update with vector=None should fetch existing vector
184+ milvus_db .update (vector_id = vector_id , vector = None , payload = payload )
185+
186+ # Verify get was called to fetch existing vector
187+ mock_milvus_client .get .assert_called_once_with (
188+ collection_name = "test_collection" ,
189+ ids = vector_id
190+ )
191+
192+ # Verify upsert was called with the existing vector
193+ mock_milvus_client .upsert .assert_called_once ()
194+ call_args = mock_milvus_client .upsert .call_args
195+ assert call_args [1 ]['collection_name' ] == "test_collection"
196+ assert call_args [1 ]['data' ]['id' ] == vector_id
197+ assert call_args [1 ]['data' ]['vectors' ] == existing_vector # Should use existing vector
198+ assert call_args [1 ]['data' ]['metadata' ] == payload
199+
200+ def test_update_with_vector_none_raises_error_if_not_found (self , milvus_db , mock_milvus_client ):
201+ """Test that update with vector=None raises error if vector not found."""
202+ vector_id = "nonexistent_id"
203+ payload = {"user_id" : "alice" }
204+
205+ # Mock the get call to return empty list
206+ mock_milvus_client .get .return_value = []
207+
208+ # Should raise ValueError
209+ with pytest .raises (ValueError , match = f"Vector with ID { vector_id } not found" ):
210+ milvus_db .update (vector_id = vector_id , vector = None , payload = payload )
211+
172212 def test_delete (self , milvus_db , mock_milvus_client ):
173213 """Test vector deletion."""
174214 vector_id = "test_id"
0 commit comments