|
25 | 25 | WaitJob, |
26 | 26 | WaitTask, |
27 | 27 | ) |
| 28 | +from uipath.platform.common.interrupt_models import ( |
| 29 | + CreateEphemeralIndex, |
| 30 | + WaitEphemeralIndex, |
| 31 | +) |
28 | 32 | from uipath.platform.context_grounding import ( |
29 | 33 | BatchTransformCreationResponse, |
30 | 34 | BatchTransformOutputColumn, |
31 | 35 | Citation, |
32 | 36 | CitationMode, |
33 | 37 | DeepRagCreationResponse, |
34 | 38 | DeepRagStatus, |
| 39 | + IndexStatus, |
| 40 | +) |
| 41 | +from uipath.platform.context_grounding.context_grounding_index import ( |
| 42 | + ContextGroundingIndex, |
35 | 43 | ) |
36 | 44 | from uipath.platform.orchestrator import ( |
37 | 45 | Job, |
@@ -517,6 +525,95 @@ async def test_read_batch_rag_trigger_pending( |
517 | 525 | reader = UiPathResumeTriggerReader() |
518 | 526 | await reader.read_trigger(resume_trigger) |
519 | 527 |
|
| 528 | + @pytest.mark.anyio |
| 529 | + async def test_read_ephemeral_index_trigger_successful( |
| 530 | + self, |
| 531 | + setup_test_env: None, |
| 532 | + ) -> None: |
| 533 | + """Test reading a successful ephemeral index trigger.""" |
| 534 | + index_id = "test-ephemeral-index-id" |
| 535 | + index_data = { |
| 536 | + "id": index_id, |
| 537 | + "name": "test-index", |
| 538 | + "lastIngestionStatus": IndexStatus.SUCCESSFUL.value, |
| 539 | + } |
| 540 | + |
| 541 | + mock_retrieve_by_id = AsyncMock(return_value=index_data) |
| 542 | + |
| 543 | + with patch( |
| 544 | + "uipath.platform.context_grounding._context_grounding_service.ContextGroundingService.retrieve_by_id", |
| 545 | + new=mock_retrieve_by_id, |
| 546 | + ): |
| 547 | + resume_trigger = UiPathResumeTrigger( |
| 548 | + trigger_type=UiPathResumeTriggerType.EPHEMERAL_INDEX, |
| 549 | + item_key=index_id, |
| 550 | + ) |
| 551 | + reader = UiPathResumeTriggerReader() |
| 552 | + result = await reader.read_trigger(resume_trigger) |
| 553 | + |
| 554 | + assert isinstance(result, ContextGroundingIndex) |
| 555 | + assert result.id == index_id |
| 556 | + mock_retrieve_by_id.assert_called_once_with(index_id) |
| 557 | + |
| 558 | + @pytest.mark.anyio |
| 559 | + async def test_read_ephemeral_index_trigger_pending( |
| 560 | + self, |
| 561 | + setup_test_env: None, |
| 562 | + ) -> None: |
| 563 | + """Test reading a pending ephemeral index trigger raises pending error.""" |
| 564 | + from uipath.core.errors import UiPathPendingTriggerError |
| 565 | + |
| 566 | + index_id = "test-ephemeral-index-id" |
| 567 | + index_data = { |
| 568 | + "id": index_id, |
| 569 | + "name": "test-index", |
| 570 | + "lastIngestionStatus": IndexStatus.IN_PROGRESS.value, |
| 571 | + } |
| 572 | + |
| 573 | + mock_retrieve_by_id = AsyncMock(return_value=index_data) |
| 574 | + |
| 575 | + with patch( |
| 576 | + "uipath.platform.context_grounding._context_grounding_service.ContextGroundingService.retrieve_by_id", |
| 577 | + new=mock_retrieve_by_id, |
| 578 | + ): |
| 579 | + resume_trigger = UiPathResumeTrigger( |
| 580 | + trigger_type=UiPathResumeTriggerType.EPHEMERAL_INDEX, |
| 581 | + item_key=index_id, |
| 582 | + ) |
| 583 | + |
| 584 | + with pytest.raises(UiPathPendingTriggerError): |
| 585 | + reader = UiPathResumeTriggerReader() |
| 586 | + await reader.read_trigger(resume_trigger) |
| 587 | + |
| 588 | + @pytest.mark.anyio |
| 589 | + async def test_read_ephemeral_index_trigger_failed( |
| 590 | + self, |
| 591 | + setup_test_env: None, |
| 592 | + ) -> None: |
| 593 | + """Test reading a failed ephemeral index trigger raises faulted error.""" |
| 594 | + index_id = "test-ephemeral-index-id" |
| 595 | + index_data = { |
| 596 | + "id": index_id, |
| 597 | + "name": "test-index", |
| 598 | + "lastIngestionStatus": IndexStatus.FAILED.value, |
| 599 | + } |
| 600 | + |
| 601 | + mock_retrieve_by_id = AsyncMock(return_value=index_data) |
| 602 | + |
| 603 | + with patch( |
| 604 | + "uipath.platform.context_grounding._context_grounding_service.ContextGroundingService.retrieve_by_id", |
| 605 | + new=mock_retrieve_by_id, |
| 606 | + ): |
| 607 | + resume_trigger = UiPathResumeTrigger( |
| 608 | + trigger_type=UiPathResumeTriggerType.EPHEMERAL_INDEX, |
| 609 | + item_key=index_id, |
| 610 | + ) |
| 611 | + |
| 612 | + with pytest.raises(UiPathFaultedTriggerError) as exc_info: |
| 613 | + reader = UiPathResumeTriggerReader() |
| 614 | + await reader.read_trigger(resume_trigger) |
| 615 | + assert exc_info.value.args[0] == ErrorCategory.USER |
| 616 | + |
520 | 617 |
|
521 | 618 | class TestHitlProcessor: |
522 | 619 | """Tests for the HitlProcessor class.""" |
@@ -778,6 +875,62 @@ async def test_create_resume_trigger_wait_batch_transform( |
778 | 875 | assert resume_trigger.trigger_type == UiPathResumeTriggerType.BATCH_RAG |
779 | 876 | assert resume_trigger.item_key == batch_transform_id |
780 | 877 |
|
| 878 | + @pytest.mark.anyio |
| 879 | + async def test_create_resume_trigger_create_ephemeral_index( |
| 880 | + self, |
| 881 | + setup_test_env: None, |
| 882 | + ) -> None: |
| 883 | + """Test creating a resume trigger for CreateEphemeralIndex.""" |
| 884 | + index_id = "test-ephemeral-index-id" |
| 885 | + attachments = ["attachment-uuid-1", "attachment-uuid-2"] |
| 886 | + create_ephemeral_index = CreateEphemeralIndex( |
| 887 | + usage="DeepRAG", |
| 888 | + attachments=attachments, |
| 889 | + ) |
| 890 | + |
| 891 | + mock_index = ContextGroundingIndex( |
| 892 | + id=index_id, |
| 893 | + name="ephemeral-index", |
| 894 | + last_ingestion_status=IndexStatus.QUEUED.value, |
| 895 | + ) |
| 896 | + mock_create_ephemeral_index = AsyncMock(return_value=mock_index) |
| 897 | + |
| 898 | + with patch( |
| 899 | + "uipath.platform.context_grounding._context_grounding_service.ContextGroundingService.create_ephemeral_index", |
| 900 | + new=mock_create_ephemeral_index, |
| 901 | + ): |
| 902 | + processor = UiPathResumeTriggerCreator() |
| 903 | + resume_trigger = await processor.create_trigger(create_ephemeral_index) |
| 904 | + |
| 905 | + assert resume_trigger is not None |
| 906 | + assert resume_trigger.trigger_type == UiPathResumeTriggerType.EPHEMERAL_INDEX |
| 907 | + assert resume_trigger.item_key == index_id |
| 908 | + mock_create_ephemeral_index.assert_called_once_with( |
| 909 | + usage=create_ephemeral_index.usage, |
| 910 | + attachments=create_ephemeral_index.attachments, |
| 911 | + ) |
| 912 | + |
| 913 | + @pytest.mark.anyio |
| 914 | + async def test_create_resume_trigger_wait_ephemeral_index( |
| 915 | + self, |
| 916 | + setup_test_env: None, |
| 917 | + ) -> None: |
| 918 | + """Test creating a resume trigger for WaitEphemeralIndex.""" |
| 919 | + index_id = "test-ephemeral-index-id" |
| 920 | + ephemeral_index = ContextGroundingIndex( |
| 921 | + id=index_id, |
| 922 | + name="ephemeral-index", |
| 923 | + last_ingestion_status=IndexStatus.IN_PROGRESS.value, |
| 924 | + ) |
| 925 | + wait_ephemeral_index = WaitEphemeralIndex(index=ephemeral_index) |
| 926 | + |
| 927 | + processor = UiPathResumeTriggerCreator() |
| 928 | + resume_trigger = await processor.create_trigger(wait_ephemeral_index) |
| 929 | + |
| 930 | + assert resume_trigger is not None |
| 931 | + assert resume_trigger.trigger_type == UiPathResumeTriggerType.EPHEMERAL_INDEX |
| 932 | + assert resume_trigger.item_key == index_id |
| 933 | + |
781 | 934 |
|
782 | 935 | class TestDocumentExtractionModels: |
783 | 936 | """Tests for document extraction models.""" |
|
0 commit comments