| import os |
| from typing import Optional |
|
|
| import pytest |
| from _pytest.monkeypatch import MonkeyPatch |
| from upstash_vector import Index |
|
|
|
|
| |
| class MockIndex: |
| def __init__(self, url="", token=""): |
| self.url = url |
| self.token = token |
| self.vectors = [] |
|
|
| def upsert(self, vectors): |
| for vector in vectors: |
| vector.score = 0.5 |
| self.vectors.append(vector) |
| return {"code": 0, "msg": "operation success", "affectedCount": len(vectors)} |
|
|
| def fetch(self, ids): |
| return [vector for vector in self.vectors if vector.id in ids] |
|
|
| def delete(self, ids): |
| self.vectors = [vector for vector in self.vectors if vector.id not in ids] |
| return {"code": 0, "msg": "Success"} |
|
|
| def query( |
| self, |
| vector: None, |
| top_k: int = 10, |
| include_vectors: bool = False, |
| include_metadata: bool = False, |
| filter: str = "", |
| data: Optional[str] = None, |
| namespace: str = "", |
| include_data: bool = False, |
| ): |
| |
| mock_result = [] |
| for vector_data in self.vectors: |
| mock_result.append(vector_data) |
| return mock_result[:top_k] |
|
|
| def reset(self): |
| self.vectors = [] |
|
|
| def info(self): |
| return AttrDict({"dimension": 1024}) |
|
|
|
|
| class AttrDict(dict): |
| def __getattr__(self, item): |
| return self.get(item) |
|
|
|
|
| MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true" |
|
|
|
|
| @pytest.fixture |
| def setup_upstashvector_mock(request, monkeypatch: MonkeyPatch): |
| if MOCK: |
| monkeypatch.setattr(Index, "__init__", MockIndex.__init__) |
| monkeypatch.setattr(Index, "upsert", MockIndex.upsert) |
| monkeypatch.setattr(Index, "fetch", MockIndex.fetch) |
| monkeypatch.setattr(Index, "delete", MockIndex.delete) |
| monkeypatch.setattr(Index, "query", MockIndex.query) |
| monkeypatch.setattr(Index, "reset", MockIndex.reset) |
| monkeypatch.setattr(Index, "info", MockIndex.info) |
|
|
| yield |
|
|
| if MOCK: |
| monkeypatch.undo() |
|
|