test_dataset_service_update_dataset.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. import datetime
  2. from typing import Any, Optional
  3. # Mock redis_client before importing dataset_service
  4. from unittest.mock import Mock, patch
  5. import pytest
  6. from core.model_runtime.entities.model_entities import ModelType
  7. from models.dataset import Dataset, ExternalKnowledgeBindings
  8. from services.dataset_service import DatasetService
  9. from services.errors.account import NoPermissionError
  10. class DatasetUpdateTestDataFactory:
  11. """Factory class for creating test data and mock objects for dataset update tests."""
  12. @staticmethod
  13. def create_dataset_mock(
  14. dataset_id: str = "dataset-123",
  15. provider: str = "vendor",
  16. name: str = "old_name",
  17. description: str = "old_description",
  18. indexing_technique: str = "high_quality",
  19. retrieval_model: str = "old_model",
  20. embedding_model_provider: Optional[str] = None,
  21. embedding_model: Optional[str] = None,
  22. collection_binding_id: Optional[str] = None,
  23. **kwargs,
  24. ) -> Mock:
  25. """Create a mock dataset with specified attributes."""
  26. dataset = Mock(spec=Dataset)
  27. dataset.id = dataset_id
  28. dataset.provider = provider
  29. dataset.name = name
  30. dataset.description = description
  31. dataset.indexing_technique = indexing_technique
  32. dataset.retrieval_model = retrieval_model
  33. dataset.embedding_model_provider = embedding_model_provider
  34. dataset.embedding_model = embedding_model
  35. dataset.collection_binding_id = collection_binding_id
  36. for key, value in kwargs.items():
  37. setattr(dataset, key, value)
  38. return dataset
  39. @staticmethod
  40. def create_user_mock(user_id: str = "user-789") -> Mock:
  41. """Create a mock user."""
  42. user = Mock()
  43. user.id = user_id
  44. return user
  45. @staticmethod
  46. def create_external_binding_mock(
  47. external_knowledge_id: str = "old_knowledge_id", external_knowledge_api_id: str = "old_api_id"
  48. ) -> Mock:
  49. """Create a mock external knowledge binding."""
  50. binding = Mock(spec=ExternalKnowledgeBindings)
  51. binding.external_knowledge_id = external_knowledge_id
  52. binding.external_knowledge_api_id = external_knowledge_api_id
  53. return binding
  54. @staticmethod
  55. def create_embedding_model_mock(model: str = "text-embedding-ada-002", provider: str = "openai") -> Mock:
  56. """Create a mock embedding model."""
  57. embedding_model = Mock()
  58. embedding_model.model = model
  59. embedding_model.provider = provider
  60. return embedding_model
  61. @staticmethod
  62. def create_collection_binding_mock(binding_id: str = "binding-456") -> Mock:
  63. """Create a mock collection binding."""
  64. binding = Mock()
  65. binding.id = binding_id
  66. return binding
  67. @staticmethod
  68. def create_current_user_mock(tenant_id: str = "tenant-123") -> Mock:
  69. """Create a mock current user."""
  70. current_user = Mock()
  71. current_user.current_tenant_id = tenant_id
  72. return current_user
  73. class TestDatasetServiceUpdateDataset:
  74. """
  75. Comprehensive unit tests for DatasetService.update_dataset method.
  76. This test suite covers all supported scenarios including:
  77. - External dataset updates
  78. - Internal dataset updates with different indexing techniques
  79. - Embedding model updates
  80. - Permission checks
  81. - Error conditions and edge cases
  82. """
  83. @pytest.fixture
  84. def mock_dataset_service_dependencies(self):
  85. """Common mock setup for dataset service dependencies."""
  86. with (
  87. patch("services.dataset_service.DatasetService.get_dataset") as mock_get_dataset,
  88. patch("services.dataset_service.DatasetService.check_dataset_permission") as mock_check_perm,
  89. patch("extensions.ext_database.db.session") as mock_db,
  90. patch("services.dataset_service.naive_utc_now") as mock_naive_utc_now,
  91. ):
  92. current_time = datetime.datetime(2023, 1, 1, 12, 0, 0)
  93. mock_naive_utc_now.return_value = current_time
  94. yield {
  95. "get_dataset": mock_get_dataset,
  96. "check_permission": mock_check_perm,
  97. "db_session": mock_db,
  98. "naive_utc_now": mock_naive_utc_now,
  99. "current_time": current_time,
  100. }
  101. @pytest.fixture
  102. def mock_external_provider_dependencies(self):
  103. """Mock setup for external provider tests."""
  104. with patch("services.dataset_service.Session") as mock_session:
  105. from extensions.ext_database import db
  106. with patch.object(db.__class__, "engine", new_callable=Mock):
  107. session_mock = Mock()
  108. mock_session.return_value.__enter__.return_value = session_mock
  109. yield session_mock
  110. @pytest.fixture
  111. def mock_internal_provider_dependencies(self):
  112. """Mock setup for internal provider tests."""
  113. with (
  114. patch("services.dataset_service.ModelManager") as mock_model_manager,
  115. patch(
  116. "services.dataset_service.DatasetCollectionBindingService.get_dataset_collection_binding"
  117. ) as mock_get_binding,
  118. patch("services.dataset_service.deal_dataset_vector_index_task") as mock_task,
  119. patch("services.dataset_service.current_user") as mock_current_user,
  120. ):
  121. mock_current_user.current_tenant_id = "tenant-123"
  122. yield {
  123. "model_manager": mock_model_manager,
  124. "get_binding": mock_get_binding,
  125. "task": mock_task,
  126. "current_user": mock_current_user,
  127. }
  128. def _assert_database_update_called(self, mock_db, dataset_id: str, expected_updates: dict[str, Any]):
  129. """Helper method to verify database update calls."""
  130. mock_db.query.return_value.filter_by.return_value.update.assert_called_once_with(expected_updates)
  131. mock_db.commit.assert_called_once()
  132. def _assert_external_dataset_update(self, mock_dataset, mock_binding, update_data: dict[str, Any]):
  133. """Helper method to verify external dataset updates."""
  134. assert mock_dataset.name == update_data.get("name", mock_dataset.name)
  135. assert mock_dataset.description == update_data.get("description", mock_dataset.description)
  136. assert mock_dataset.retrieval_model == update_data.get("external_retrieval_model", mock_dataset.retrieval_model)
  137. if "external_knowledge_id" in update_data:
  138. assert mock_binding.external_knowledge_id == update_data["external_knowledge_id"]
  139. if "external_knowledge_api_id" in update_data:
  140. assert mock_binding.external_knowledge_api_id == update_data["external_knowledge_api_id"]
  141. # ==================== External Dataset Tests ====================
  142. def test_update_external_dataset_success(
  143. self, mock_dataset_service_dependencies, mock_external_provider_dependencies
  144. ):
  145. """Test successful update of external dataset."""
  146. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(
  147. provider="external", name="old_name", description="old_description", retrieval_model="old_model"
  148. )
  149. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  150. user = DatasetUpdateTestDataFactory.create_user_mock()
  151. binding = DatasetUpdateTestDataFactory.create_external_binding_mock()
  152. # Mock external knowledge binding query
  153. mock_external_provider_dependencies.query.return_value.filter_by.return_value.first.return_value = binding
  154. update_data = {
  155. "name": "new_name",
  156. "description": "new_description",
  157. "external_retrieval_model": "new_model",
  158. "permission": "only_me",
  159. "external_knowledge_id": "new_knowledge_id",
  160. "external_knowledge_api_id": "new_api_id",
  161. }
  162. result = DatasetService.update_dataset("dataset-123", update_data, user)
  163. # Verify permission check was called
  164. mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user)
  165. # Verify dataset and binding updates
  166. self._assert_external_dataset_update(dataset, binding, update_data)
  167. # Verify database operations
  168. mock_db = mock_dataset_service_dependencies["db_session"]
  169. mock_db.add.assert_any_call(dataset)
  170. mock_db.add.assert_any_call(binding)
  171. mock_db.commit.assert_called_once()
  172. # Verify return value
  173. assert result == dataset
  174. def test_update_external_dataset_missing_knowledge_id_error(self, mock_dataset_service_dependencies):
  175. """Test error when external knowledge id is missing."""
  176. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="external")
  177. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  178. user = DatasetUpdateTestDataFactory.create_user_mock()
  179. update_data = {"name": "new_name", "external_knowledge_api_id": "api_id"}
  180. with pytest.raises(ValueError) as context:
  181. DatasetService.update_dataset("dataset-123", update_data, user)
  182. assert "External knowledge id is required" in str(context.value)
  183. def test_update_external_dataset_missing_api_id_error(self, mock_dataset_service_dependencies):
  184. """Test error when external knowledge api id is missing."""
  185. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="external")
  186. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  187. user = DatasetUpdateTestDataFactory.create_user_mock()
  188. update_data = {"name": "new_name", "external_knowledge_id": "knowledge_id"}
  189. with pytest.raises(ValueError) as context:
  190. DatasetService.update_dataset("dataset-123", update_data, user)
  191. assert "External knowledge api id is required" in str(context.value)
  192. def test_update_external_dataset_binding_not_found_error(
  193. self, mock_dataset_service_dependencies, mock_external_provider_dependencies
  194. ):
  195. """Test error when external knowledge binding is not found."""
  196. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="external")
  197. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  198. user = DatasetUpdateTestDataFactory.create_user_mock()
  199. # Mock external knowledge binding query returning None
  200. mock_external_provider_dependencies.query.return_value.filter_by.return_value.first.return_value = None
  201. update_data = {
  202. "name": "new_name",
  203. "external_knowledge_id": "knowledge_id",
  204. "external_knowledge_api_id": "api_id",
  205. }
  206. with pytest.raises(ValueError) as context:
  207. DatasetService.update_dataset("dataset-123", update_data, user)
  208. assert "External knowledge binding not found" in str(context.value)
  209. # ==================== Internal Dataset Basic Tests ====================
  210. def test_update_internal_dataset_basic_success(self, mock_dataset_service_dependencies):
  211. """Test successful update of internal dataset with basic fields."""
  212. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(
  213. provider="vendor",
  214. indexing_technique="high_quality",
  215. embedding_model_provider="openai",
  216. embedding_model="text-embedding-ada-002",
  217. collection_binding_id="binding-123",
  218. )
  219. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  220. user = DatasetUpdateTestDataFactory.create_user_mock()
  221. update_data = {
  222. "name": "new_name",
  223. "description": "new_description",
  224. "indexing_technique": "high_quality",
  225. "retrieval_model": "new_model",
  226. "embedding_model_provider": "openai",
  227. "embedding_model": "text-embedding-ada-002",
  228. }
  229. result = DatasetService.update_dataset("dataset-123", update_data, user)
  230. # Verify permission check was called
  231. mock_dataset_service_dependencies["check_permission"].assert_called_once_with(dataset, user)
  232. # Verify database update was called with correct filtered data
  233. expected_filtered_data = {
  234. "name": "new_name",
  235. "description": "new_description",
  236. "indexing_technique": "high_quality",
  237. "retrieval_model": "new_model",
  238. "embedding_model_provider": "openai",
  239. "embedding_model": "text-embedding-ada-002",
  240. "updated_by": user.id,
  241. "updated_at": mock_dataset_service_dependencies["current_time"],
  242. }
  243. self._assert_database_update_called(
  244. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  245. )
  246. # Verify return value
  247. assert result == dataset
  248. def test_update_internal_dataset_filter_none_values(self, mock_dataset_service_dependencies):
  249. """Test that None values are filtered out except for description field."""
  250. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="vendor", indexing_technique="high_quality")
  251. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  252. user = DatasetUpdateTestDataFactory.create_user_mock()
  253. update_data = {
  254. "name": "new_name",
  255. "description": None, # Should be included
  256. "indexing_technique": "high_quality",
  257. "retrieval_model": "new_model",
  258. "embedding_model_provider": None, # Should be filtered out
  259. "embedding_model": None, # Should be filtered out
  260. }
  261. result = DatasetService.update_dataset("dataset-123", update_data, user)
  262. # Verify database update was called with filtered data
  263. expected_filtered_data = {
  264. "name": "new_name",
  265. "description": None, # Description should be included even if None
  266. "indexing_technique": "high_quality",
  267. "retrieval_model": "new_model",
  268. "updated_by": user.id,
  269. "updated_at": mock_dataset_service_dependencies["current_time"],
  270. }
  271. actual_call_args = mock_dataset_service_dependencies[
  272. "db_session"
  273. ].query.return_value.filter_by.return_value.update.call_args[0][0]
  274. # Remove timestamp for comparison as it's dynamic
  275. del actual_call_args["updated_at"]
  276. del expected_filtered_data["updated_at"]
  277. assert actual_call_args == expected_filtered_data
  278. # Verify return value
  279. assert result == dataset
  280. # ==================== Indexing Technique Switch Tests ====================
  281. def test_update_internal_dataset_indexing_technique_to_economy(
  282. self, mock_dataset_service_dependencies, mock_internal_provider_dependencies
  283. ):
  284. """Test updating internal dataset indexing technique to economy."""
  285. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="vendor", indexing_technique="high_quality")
  286. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  287. user = DatasetUpdateTestDataFactory.create_user_mock()
  288. update_data = {"indexing_technique": "economy", "retrieval_model": "new_model"}
  289. result = DatasetService.update_dataset("dataset-123", update_data, user)
  290. # Verify database update was called with embedding model fields cleared
  291. expected_filtered_data = {
  292. "indexing_technique": "economy",
  293. "embedding_model": None,
  294. "embedding_model_provider": None,
  295. "collection_binding_id": None,
  296. "retrieval_model": "new_model",
  297. "updated_by": user.id,
  298. "updated_at": mock_dataset_service_dependencies["current_time"],
  299. }
  300. self._assert_database_update_called(
  301. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  302. )
  303. # Verify return value
  304. assert result == dataset
  305. def test_update_internal_dataset_indexing_technique_to_high_quality(
  306. self, mock_dataset_service_dependencies, mock_internal_provider_dependencies
  307. ):
  308. """Test updating internal dataset indexing technique to high_quality."""
  309. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="vendor", indexing_technique="economy")
  310. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  311. user = DatasetUpdateTestDataFactory.create_user_mock()
  312. # Mock embedding model
  313. embedding_model = DatasetUpdateTestDataFactory.create_embedding_model_mock()
  314. mock_internal_provider_dependencies[
  315. "model_manager"
  316. ].return_value.get_model_instance.return_value = embedding_model
  317. # Mock collection binding
  318. binding = DatasetUpdateTestDataFactory.create_collection_binding_mock()
  319. mock_internal_provider_dependencies["get_binding"].return_value = binding
  320. update_data = {
  321. "indexing_technique": "high_quality",
  322. "embedding_model_provider": "openai",
  323. "embedding_model": "text-embedding-ada-002",
  324. "retrieval_model": "new_model",
  325. }
  326. result = DatasetService.update_dataset("dataset-123", update_data, user)
  327. # Verify embedding model was validated
  328. mock_internal_provider_dependencies["model_manager"].return_value.get_model_instance.assert_called_once_with(
  329. tenant_id=mock_internal_provider_dependencies["current_user"].current_tenant_id,
  330. provider="openai",
  331. model_type=ModelType.TEXT_EMBEDDING,
  332. model="text-embedding-ada-002",
  333. )
  334. # Verify collection binding was retrieved
  335. mock_internal_provider_dependencies["get_binding"].assert_called_once_with("openai", "text-embedding-ada-002")
  336. # Verify database update was called with correct data
  337. expected_filtered_data = {
  338. "indexing_technique": "high_quality",
  339. "embedding_model": "text-embedding-ada-002",
  340. "embedding_model_provider": "openai",
  341. "collection_binding_id": "binding-456",
  342. "retrieval_model": "new_model",
  343. "updated_by": user.id,
  344. "updated_at": mock_dataset_service_dependencies["current_time"],
  345. }
  346. self._assert_database_update_called(
  347. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  348. )
  349. # Verify vector index task was triggered
  350. mock_internal_provider_dependencies["task"].delay.assert_called_once_with("dataset-123", "add")
  351. # Verify return value
  352. assert result == dataset
  353. # ==================== Embedding Model Update Tests ====================
  354. def test_update_internal_dataset_keep_existing_embedding_model(self, mock_dataset_service_dependencies):
  355. """Test updating internal dataset without changing embedding model."""
  356. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(
  357. provider="vendor",
  358. indexing_technique="high_quality",
  359. embedding_model_provider="openai",
  360. embedding_model="text-embedding-ada-002",
  361. collection_binding_id="binding-123",
  362. )
  363. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  364. user = DatasetUpdateTestDataFactory.create_user_mock()
  365. update_data = {"name": "new_name", "indexing_technique": "high_quality", "retrieval_model": "new_model"}
  366. result = DatasetService.update_dataset("dataset-123", update_data, user)
  367. # Verify database update was called with existing embedding model preserved
  368. expected_filtered_data = {
  369. "name": "new_name",
  370. "indexing_technique": "high_quality",
  371. "embedding_model_provider": "openai",
  372. "embedding_model": "text-embedding-ada-002",
  373. "collection_binding_id": "binding-123",
  374. "retrieval_model": "new_model",
  375. "updated_by": user.id,
  376. "updated_at": mock_dataset_service_dependencies["current_time"],
  377. }
  378. self._assert_database_update_called(
  379. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  380. )
  381. # Verify return value
  382. assert result == dataset
  383. def test_update_internal_dataset_embedding_model_update(
  384. self, mock_dataset_service_dependencies, mock_internal_provider_dependencies
  385. ):
  386. """Test updating internal dataset with new embedding model."""
  387. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(
  388. provider="vendor",
  389. indexing_technique="high_quality",
  390. embedding_model_provider="openai",
  391. embedding_model="text-embedding-ada-002",
  392. )
  393. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  394. user = DatasetUpdateTestDataFactory.create_user_mock()
  395. # Mock embedding model
  396. embedding_model = DatasetUpdateTestDataFactory.create_embedding_model_mock("text-embedding-3-small")
  397. mock_internal_provider_dependencies[
  398. "model_manager"
  399. ].return_value.get_model_instance.return_value = embedding_model
  400. # Mock collection binding
  401. binding = DatasetUpdateTestDataFactory.create_collection_binding_mock("binding-789")
  402. mock_internal_provider_dependencies["get_binding"].return_value = binding
  403. update_data = {
  404. "indexing_technique": "high_quality",
  405. "embedding_model_provider": "openai",
  406. "embedding_model": "text-embedding-3-small",
  407. "retrieval_model": "new_model",
  408. }
  409. result = DatasetService.update_dataset("dataset-123", update_data, user)
  410. # Verify embedding model was validated
  411. mock_internal_provider_dependencies["model_manager"].return_value.get_model_instance.assert_called_once_with(
  412. tenant_id=mock_internal_provider_dependencies["current_user"].current_tenant_id,
  413. provider="openai",
  414. model_type=ModelType.TEXT_EMBEDDING,
  415. model="text-embedding-3-small",
  416. )
  417. # Verify collection binding was retrieved
  418. mock_internal_provider_dependencies["get_binding"].assert_called_once_with("openai", "text-embedding-3-small")
  419. # Verify database update was called with correct data
  420. expected_filtered_data = {
  421. "indexing_technique": "high_quality",
  422. "embedding_model": "text-embedding-3-small",
  423. "embedding_model_provider": "openai",
  424. "collection_binding_id": "binding-789",
  425. "retrieval_model": "new_model",
  426. "updated_by": user.id,
  427. "updated_at": mock_dataset_service_dependencies["current_time"],
  428. }
  429. self._assert_database_update_called(
  430. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  431. )
  432. # Verify vector index task was triggered
  433. mock_internal_provider_dependencies["task"].delay.assert_called_once_with("dataset-123", "update")
  434. # Verify return value
  435. assert result == dataset
  436. def test_update_internal_dataset_no_indexing_technique_change(self, mock_dataset_service_dependencies):
  437. """Test updating internal dataset without changing indexing technique."""
  438. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(
  439. provider="vendor",
  440. indexing_technique="high_quality",
  441. embedding_model_provider="openai",
  442. embedding_model="text-embedding-ada-002",
  443. collection_binding_id="binding-123",
  444. )
  445. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  446. user = DatasetUpdateTestDataFactory.create_user_mock()
  447. update_data = {
  448. "name": "new_name",
  449. "indexing_technique": "high_quality", # Same as current
  450. "retrieval_model": "new_model",
  451. }
  452. result = DatasetService.update_dataset("dataset-123", update_data, user)
  453. # Verify database update was called with correct data
  454. expected_filtered_data = {
  455. "name": "new_name",
  456. "indexing_technique": "high_quality",
  457. "embedding_model_provider": "openai",
  458. "embedding_model": "text-embedding-ada-002",
  459. "collection_binding_id": "binding-123",
  460. "retrieval_model": "new_model",
  461. "updated_by": user.id,
  462. "updated_at": mock_dataset_service_dependencies["current_time"],
  463. }
  464. self._assert_database_update_called(
  465. mock_dataset_service_dependencies["db_session"], "dataset-123", expected_filtered_data
  466. )
  467. # Verify return value
  468. assert result == dataset
  469. # ==================== Error Handling Tests ====================
  470. def test_update_dataset_not_found_error(self, mock_dataset_service_dependencies):
  471. """Test error when dataset is not found."""
  472. mock_dataset_service_dependencies["get_dataset"].return_value = None
  473. user = DatasetUpdateTestDataFactory.create_user_mock()
  474. update_data = {"name": "new_name"}
  475. with pytest.raises(ValueError) as context:
  476. DatasetService.update_dataset("dataset-123", update_data, user)
  477. assert "Dataset not found" in str(context.value)
  478. def test_update_dataset_permission_error(self, mock_dataset_service_dependencies):
  479. """Test error when user doesn't have permission."""
  480. dataset = DatasetUpdateTestDataFactory.create_dataset_mock()
  481. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  482. user = DatasetUpdateTestDataFactory.create_user_mock()
  483. mock_dataset_service_dependencies["check_permission"].side_effect = NoPermissionError("No permission")
  484. update_data = {"name": "new_name"}
  485. with pytest.raises(NoPermissionError):
  486. DatasetService.update_dataset("dataset-123", update_data, user)
  487. def test_update_internal_dataset_embedding_model_error(
  488. self, mock_dataset_service_dependencies, mock_internal_provider_dependencies
  489. ):
  490. """Test error when embedding model is not available."""
  491. dataset = DatasetUpdateTestDataFactory.create_dataset_mock(provider="vendor", indexing_technique="economy")
  492. mock_dataset_service_dependencies["get_dataset"].return_value = dataset
  493. user = DatasetUpdateTestDataFactory.create_user_mock()
  494. # Mock model manager to raise error
  495. mock_internal_provider_dependencies["model_manager"].return_value.get_model_instance.side_effect = Exception(
  496. "No Embedding Model available"
  497. )
  498. update_data = {
  499. "indexing_technique": "high_quality",
  500. "embedding_model_provider": "invalid_provider",
  501. "embedding_model": "invalid_model",
  502. "retrieval_model": "new_model",
  503. }
  504. with pytest.raises(Exception) as context:
  505. DatasetService.update_dataset("dataset-123", update_data, user)
  506. assert "No Embedding Model available".lower() in str(context.value).lower()