Skip to content

Commit 34dec3d

Browse files
committed
✨Add unit tests to the model service that enables ModelEngine.
1 parent 9fb00b3 commit 34dec3d

13 files changed

+396
-139
lines changed

backend/database/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
POSTGRES_USER,
2020
)
2121
from database.db_models import TableBase
22-
from nexent.storage.storage_client_factory import create_storage_client_from_config, MinIOStorageConfig
22+
from nexent.storage.storage_client_factory import create_storage_client_from_config
23+
from nexent.storage.minio_config import MinIOStorageConfig
2324

2425

2526
logger = logging.getLogger("database.client")

backend/utils/llm_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def call_llm_for_system_prompt(
7272
temperature=0.3,
7373
top_p=0.95,
7474
model_factory=llm_model_config.get("model_factory") if llm_model_config else None,
75-
ssl_verify=llm_model_config.get("ssl_verify", True),
75+
ssl_verify=llm_model_config.get("ssl_verify", True) if llm_model_config else True,
7676
)
7777
messages = [
7878
{"role": MESSAGE_ROLE["SYSTEM"], "content": system_prompt},

test/backend/services/test_conversation_management_service.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,32 @@ def model_dump(self):
7979
# Also ensure backend.consts.model resolves to our stub for tests that import via backend.consts.model
8080
sys.modules["backend.consts.model"] = consts_model_mod
8181

82-
# Stub database.client.as_dict to avoid import-time DB helpers
82+
# Stub database.client.as_dict and db_client to avoid import-time DB helpers
8383
db_client_stub = types.ModuleType("database.client")
8484
db_client_stub.as_dict = lambda obj: {}
85-
db_client_stub.get_db_session = lambda *a, **k: (_ for _ in ()).throw(StopIteration)
85+
86+
# Minimal dummy db_client with clean_string_values and session_maker to satisfy imports.
87+
db_client_stub.db_client = types.SimpleNamespace(
88+
clean_string_values=lambda d: d,
89+
session_maker=lambda: None
90+
)
91+
92+
# Provide a simple context manager compatible get_db_session used with `with get_db_session() as session:`
93+
class _DummySessionCM:
94+
def __enter__(self):
95+
# Return a minimal session-like object with methods used in tests (execute, scalars, commit/rollback/close)
96+
return types.SimpleNamespace(
97+
execute=lambda *a, **k: None,
98+
scalars=lambda *a, **k: types.SimpleNamespace(all=lambda: []),
99+
commit=lambda: None,
100+
rollback=lambda: None,
101+
close=lambda: None,
102+
)
103+
104+
def __exit__(self, exc_type, exc, tb):
105+
return False
106+
107+
db_client_stub.get_db_session = lambda *a, **k: _DummySessionCM()
86108
sys.modules["database.client"] = db_client_stub
87109

88110
# Stub utils.prompt_template_utils to avoid requiring PyYAML

test/backend/services/test_file_management_service.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -796,11 +796,11 @@ async def test_upload_files_impl_semaphore_usage(self):
796796

797797
with patch('backend.services.file_management_service.save_upload_file', AsyncMock(return_value=True)) as mock_save, \
798798
patch('backend.services.file_management_service.upload_semaphore') as mock_semaphore:
799-
799+
800800
# Mock semaphore context manager
801801
mock_semaphore.__aenter__ = AsyncMock()
802802
mock_semaphore.__aexit__ = AsyncMock()
803-
803+
804804
# Execute
805805
errors, uploaded_paths, uploaded_names = await upload_files_impl(
806806
destination="local", file=[mock_file])
@@ -827,7 +827,7 @@ async def test_upload_files_impl_no_semaphore_for_minio(self):
827827
{"success": True, "file_name": "test.txt", "object_name": "folder/test.txt"}
828828
])) as mock_upload, \
829829
patch('backend.services.file_management_service.upload_semaphore') as mock_semaphore:
830-
830+
831831
# Execute
832832
errors, uploaded_paths, uploaded_names = await upload_files_impl(
833833
destination="minio", file=[mock_file], folder="folder")
@@ -934,7 +934,8 @@ def test_get_llm_model_success(self, mock_tenant_config, mock_get_model_name, mo
934934
model_id="gpt-4",
935935
api_base="http://api.example.com",
936936
api_key="test_api_key",
937-
max_context_tokens=4096
937+
max_context_tokens=4096,
938+
ssl_verify=True
938939
)
939940

940941
@patch('backend.services.file_management_service.MODEL_CONFIG_MAPPING', {"llm": "llm_config_key"})

test/backend/services/test_image_service.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,8 @@ def test_get_vlm_model_success(mock_tenant_config_manager, mock_get_model_name,
336336
temperature=0.7,
337337
top_p=0.7,
338338
frequency_penalty=0.5,
339-
max_tokens=512
339+
max_tokens=512,
340+
ssl_verify=True
340341
)
341342
assert result == mock_model_instance
342343

@@ -363,6 +364,7 @@ def test_get_vlm_model_with_empty_config(mock_tenant_config_manager, mock_get_mo
363364
temperature=0.7,
364365
top_p=0.7,
365366
frequency_penalty=0.5,
366-
max_tokens=512
367+
max_tokens=512,
368+
ssl_verify=True
367369
)
368370
assert result == mock_model_instance

test/backend/services/test_model_health_service.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ async def test_perform_connectivity_check_embedding():
143143
model_name="text-embedding-ada-002",
144144
base_url="https://api.openai.com",
145145
api_key="test-key",
146-
embedding_dim=0
146+
embedding_dim=0,
147+
ssl_verify=True
147148
)
148149
mock_embedding_instance.dimension_check.assert_called_once()
149150

@@ -171,7 +172,8 @@ async def test_perform_connectivity_check_multi_embedding():
171172
model_name="jina-embeddings-v2",
172173
base_url="https://api.jina.ai",
173174
api_key="test-key",
174-
embedding_dim=0
175+
embedding_dim=0,
176+
ssl_verify=True
175177
)
176178
mock_embedding_instance.dimension_check.assert_called_once()
177179

@@ -236,7 +238,8 @@ async def test_perform_connectivity_check_vlm():
236238
mock_observer_instance,
237239
model_id="gpt-4-vision",
238240
api_base="https://api.openai.com",
239-
api_key="test-key"
241+
api_key="test-key",
242+
ssl_verify=True
240243
)
241244
mock_model_instance.check_connectivity.assert_called_once()
242245

@@ -645,7 +648,8 @@ async def test_embedding_dimension_check_embedding_success():
645648
model_name="test-embedding",
646649
base_url="http://test.com",
647650
api_key="test-key",
648-
embedding_dim=0
651+
embedding_dim=0,
652+
ssl_verify=True
649653
)
650654

651655

@@ -665,7 +669,8 @@ async def test_embedding_dimension_check_multi_embedding_success():
665669
model_name="test-multi-embedding",
666670
base_url="http://test.com",
667671
api_key="test-key",
668-
embedding_dim=0
672+
embedding_dim=0,
673+
ssl_verify=True
669674
)
670675

671676

@@ -708,7 +713,7 @@ async def test_embedding_dimension_check_wrapper_success():
708713
assert dimension == 1536
709714
mock_get_name.assert_called_once_with(model_config)
710715
mock_internal_check.assert_called_once_with(
711-
"openai/text-embedding-ada-002", "embedding", "https://api.openai.com", "test-key"
716+
"openai/text-embedding-ada-002", "embedding", "https://api.openai.com", "test-key", True
712717
)
713718

714719

@@ -751,7 +756,8 @@ async def test_embedding_dimension_check_multi_embedding_empty_response():
751756
model_name="test-multi-embedding",
752757
base_url="http://test.com",
753758
api_key="test-key",
754-
embedding_dim=0
759+
embedding_dim=0,
760+
ssl_verify=True
755761
)
756762
# Verify warning was logged
757763
mock_logging.warning.assert_called_once_with(
@@ -780,7 +786,7 @@ async def test_embedding_dimension_check_wrapper_value_error():
780786
assert dimension == 0
781787
mock_get_name.assert_called_once_with(model_config)
782788
mock_internal_check.assert_called_once_with(
783-
"test-model", "unsupported", "https://api.test.com", "test-key"
789+
"test-model", "unsupported", "https://api.test.com", "test-key", True
784790
)
785791
# Verify error was logged with the specific ValueError message
786792
mock_logger.error.assert_called_once_with(

0 commit comments

Comments
 (0)