Skip to content

Commit ccecbe4

Browse files
committed
Iterate on tests
1 parent efbbfbf commit ccecbe4

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed

tests/integration/data/test_update.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,14 @@ def poll_until_update_reflected(
7272
)
7373

7474
if expected_metadata is not None:
75-
metadata_match = vec.metadata == expected_metadata
75+
# Check that all expected metadata fields are present and match
76+
# (metadata may be merged, so we check for our fields specifically)
77+
if vec.metadata is None:
78+
metadata_match = False
79+
else:
80+
metadata_match = all(
81+
vec.metadata.get(k) == v for k, v in expected_metadata.items()
82+
)
7683

7784
if values_match and metadata_match:
7885
logger.debug(f"Update reflected for vector {vector_id}")
@@ -173,14 +180,41 @@ def test_update_only_metadata_no_values(self, idx, update_namespace):
173180
new_metadata = {"genre": "thriller", "year": 2023}
174181
idx.update(id=vector_id, set_metadata=new_metadata, namespace=target_namespace)
175182

176-
# Wait for update to be reflected
177-
poll_until_update_reflected(
178-
idx, vector_id, target_namespace, expected_metadata=new_metadata, timeout=180
179-
)
183+
# Wait for update to be reflected - check that specified fields are present
184+
# Note: set_metadata may replace or merge, so we check for the fields we set
185+
def check_metadata_update():
186+
fetched = idx.fetch(ids=[vector_id], namespace=target_namespace)
187+
if vector_id in fetched.vectors:
188+
vec = fetched.vectors[vector_id]
189+
if vec.metadata is not None:
190+
# Check that our specified fields match
191+
return (
192+
vec.metadata.get("genre") == "thriller" and vec.metadata.get("year") == 2023
193+
)
194+
return False
195+
196+
timeout = 180
197+
delta_t = 2
198+
total_time = 0
199+
max_delta_t = 10
200+
201+
while total_time < timeout:
202+
if check_metadata_update():
203+
break
204+
time.sleep(delta_t)
205+
total_time += delta_t
206+
delta_t = min(delta_t * 1.5, max_delta_t)
207+
else:
208+
raise TimeoutError(
209+
f"Timed out waiting for metadata update on vector {vector_id} in namespace {target_namespace}"
210+
)
180211

181212
# Verify metadata updated but values unchanged
182213
fetched_vec = idx.fetch(ids=[vector_id], namespace=target_namespace)
183-
assert fetched_vec.vectors[vector_id].metadata == new_metadata
214+
# Check that the fields we set are present
215+
assert fetched_vec.vectors[vector_id].metadata is not None
216+
assert fetched_vec.vectors[vector_id].metadata.get("genre") == "thriller"
217+
assert fetched_vec.vectors[vector_id].metadata.get("year") == 2023
184218
# Values should remain the same (approximately, due to floating point)
185219
assert len(fetched_vec.vectors[vector_id].values) == len(original_values)
186220
assert fetched_vec.vectors[vector_id].values[0] == pytest.approx(original_values[0], 0.01)

tests/integration/data_grpc_futures/test_update_future.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,14 @@ def poll_until_update_reflected_async(
7171
)
7272

7373
if expected_metadata is not None:
74-
metadata_match = vec.metadata == expected_metadata
74+
# Check that all expected metadata fields are present and match
75+
# (metadata may be merged, so we check for our fields specifically)
76+
if vec.metadata is None:
77+
metadata_match = False
78+
else:
79+
metadata_match = all(
80+
vec.metadata.get(k) == v for k, v in expected_metadata.items()
81+
)
7582

7683
if values_match and metadata_match:
7784
logger.debug(f"Update reflected for vector {vector_id}")
@@ -201,19 +208,25 @@ def test_update_multiple_async(self, idx, namespace_update_async):
201208
result = future.result()
202209
assert result == {} # Update response should be empty dict
203210

204-
# Wait for all updates to be reflected
211+
# Wait for all updates to be reflected - check each one individually
212+
# with a reasonable timeout per vector
205213
for vector_id, new_values, new_metadata in updates:
206214
poll_until_update_reflected_async(
207215
idx,
208216
vector_id,
209217
target_namespace,
210218
expected_values=new_values,
211219
expected_metadata=new_metadata,
212-
timeout=180,
220+
timeout=240, # Increased timeout for async operations
213221
)
214222

215223
# Verify all updates
216224
fetched_vecs = idx.fetch(ids=[str(i) for i in range(5, 8)], namespace=target_namespace)
217225
for vector_id, new_values, new_metadata in updates:
218226
assert fetched_vecs.vectors[vector_id].values[0] == pytest.approx(new_values[0], 0.01)
219-
assert fetched_vecs.vectors[vector_id].metadata == new_metadata
227+
# Check that metadata fields are present (may be merged with existing)
228+
assert fetched_vecs.vectors[vector_id].metadata is not None
229+
assert fetched_vecs.vectors[vector_id].metadata.get("genre") == new_metadata["genre"]
230+
assert (
231+
fetched_vecs.vectors[vector_id].metadata.get("updated") == new_metadata["updated"]
232+
)

0 commit comments

Comments
 (0)