|
24 | 24 | using FluentAssertions;
|
25 | 25 | using Microsoft.Extensions.Logging;
|
26 | 26 | using Microsoft.Extensions.Options;
|
| 27 | +using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities; |
27 | 28 | using Monai.Deploy.Messaging.API;
|
28 | 29 | using Monai.Deploy.Messaging.Events;
|
29 | 30 | using Monai.Deploy.Messaging.Messages;
|
|
36 | 37 | using Monai.Deploy.WorkflowManager.Contracts.Models;
|
37 | 38 | using Monai.Deploy.WorkflowManager.Database;
|
38 | 39 | using Monai.Deploy.WorkflowManager.Database.Interfaces;
|
| 40 | +using Monai.Deploy.WorkflowManager.Database.Repositories; |
39 | 41 | using Monai.Deploy.WorkflowManager.Shared;
|
40 | 42 | using Monai.Deploy.WorkflowManager.Storage.Services;
|
41 | 43 | using Monai.Deploy.WorkflowManager.WorkfowExecuter.Common;
|
42 | 44 | using Monai.Deploy.WorkflowManager.WorkfowExecuter.Services;
|
43 | 45 | using Moq;
|
44 | 46 | using Newtonsoft.Json;
|
45 | 47 | using Xunit;
|
| 48 | +using Message = Monai.Deploy.Messaging.Messages.Message; |
46 | 49 |
|
47 | 50 | namespace Monai.Deploy.WorkflowManager.WorkflowExecuter.Tests.Services
|
48 | 51 | {
|
@@ -115,6 +118,60 @@ public WorkflowExecuterServiceTests()
|
115 | 118 | _payloadService.Object);
|
116 | 119 | }
|
117 | 120 |
|
| 121 | + [Fact] |
| 122 | + public async Task WorkflowExecuterService_Throw_If_No_Config() |
| 123 | + { |
| 124 | + var dicom = new Mock<IDicomService>(); |
| 125 | + var logger = new Mock<ILogger<ConditionalParameterParser>>(); |
| 126 | + |
| 127 | + var conditionalParser = new ConditionalParameterParser(logger.Object, |
| 128 | + dicom.Object, |
| 129 | + _workflowInstanceService.Object, |
| 130 | + _payloadService.Object, |
| 131 | + _workflowService.Object); |
| 132 | + |
| 133 | +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. |
| 134 | + Assert.Throws<ArgumentNullException>(() => new WorkflowExecuterService(_logger.Object, |
| 135 | + null, |
| 136 | + _storageConfiguration, |
| 137 | + _workflowRepository.Object, |
| 138 | + _workflowInstanceRepository.Object, |
| 139 | + _messageBrokerPublisherService.Object, |
| 140 | + _workflowInstanceService.Object, |
| 141 | + conditionalParser, |
| 142 | + _taskExecutionStatsRepository.Object, |
| 143 | + _artifactMapper.Object, |
| 144 | + _storageService.Object, |
| 145 | + _payloadService.Object)); |
| 146 | + |
| 147 | + } |
| 148 | + |
| 149 | + [Fact] |
| 150 | + public async Task WorkflowExecuterService_Throw_If_No_Storage_Config() |
| 151 | + { |
| 152 | + var dicom = new Mock<IDicomService>(); |
| 153 | + var logger = new Mock<ILogger<ConditionalParameterParser>>(); |
| 154 | + |
| 155 | + var conditionalParser = new ConditionalParameterParser(logger.Object, |
| 156 | + dicom.Object, |
| 157 | + _workflowInstanceService.Object, |
| 158 | + _payloadService.Object, |
| 159 | + _workflowService.Object); |
| 160 | + |
| 161 | + Assert.Throws<ArgumentNullException>(() => new WorkflowExecuterService(_logger.Object, |
| 162 | + _configuration, |
| 163 | + null, |
| 164 | + _workflowRepository.Object, |
| 165 | + _workflowInstanceRepository.Object, |
| 166 | + _messageBrokerPublisherService.Object, |
| 167 | + _workflowInstanceService.Object, |
| 168 | + conditionalParser, |
| 169 | + _taskExecutionStatsRepository.Object, |
| 170 | + _artifactMapper.Object, |
| 171 | + _storageService.Object, |
| 172 | + _payloadService.Object)); |
| 173 | + } |
| 174 | + |
118 | 175 | [Fact]
|
119 | 176 | public async Task ProcessPayload_ValidAeTitleWorkflowRequest_ReturnesTrue()
|
120 | 177 | {
|
@@ -2685,5 +2742,114 @@ public async Task ProcessPayload_WithExternalAppComplete_Pauses()
|
2685 | 2742 |
|
2686 | 2743 | response.Should().BeTrue();
|
2687 | 2744 | }
|
| 2745 | + |
| 2746 | + [Fact] |
| 2747 | + public async Task ProcessPayload_With_WorkflowInstanceId_Continues() |
| 2748 | + { |
| 2749 | + var workflowInstanceId = Guid.NewGuid().ToString(); |
| 2750 | + var correlationId = Guid.NewGuid().ToString(); |
| 2751 | + |
| 2752 | + var exportEvent = new ExportCompleteEvent |
| 2753 | + { |
| 2754 | + WorkflowInstanceId = workflowInstanceId, |
| 2755 | + ExportTaskId = "pizza", |
| 2756 | + Status = ExportStatus.Success, |
| 2757 | + Message = "This is a message" |
| 2758 | + }; |
| 2759 | + |
| 2760 | + var workflowId = Guid.NewGuid().ToString(); |
| 2761 | + |
| 2762 | + var workflow = new WorkflowRevision |
| 2763 | + { |
| 2764 | + Id = Guid.NewGuid().ToString(), |
| 2765 | + WorkflowId = workflowId, |
| 2766 | + Revision = 1, |
| 2767 | + Workflow = new Workflow |
| 2768 | + { |
| 2769 | + Name = "Workflowname2", |
| 2770 | + Description = "Workflowdesc2", |
| 2771 | + Version = "1", |
| 2772 | + InformaticsGateway = new InformaticsGateway |
| 2773 | + { |
| 2774 | + AeTitle = "aetitle" |
| 2775 | + }, |
| 2776 | + Tasks = new TaskObject[] |
| 2777 | + { |
| 2778 | + new TaskObject { |
| 2779 | + Id = "pizza", |
| 2780 | + Type = ValidationConstants.ExportTaskType, |
| 2781 | + Description = "taskdesc", |
| 2782 | + TaskDestinations = new TaskDestination[] |
| 2783 | + { |
| 2784 | + new TaskDestination |
| 2785 | + { |
| 2786 | + Name = "coffee" |
| 2787 | + }, |
| 2788 | + new TaskDestination |
| 2789 | + { |
| 2790 | + Name = "doughnuts" |
| 2791 | + } |
| 2792 | + } |
| 2793 | + }, |
| 2794 | + new TaskObject { |
| 2795 | + Id = "coffee", |
| 2796 | + Type = "type", |
| 2797 | + Description = "taskdesc" |
| 2798 | + }, |
| 2799 | + new TaskObject { |
| 2800 | + Id = "doughnuts", |
| 2801 | + Type = "type", |
| 2802 | + Description = "taskdesc", |
| 2803 | + } |
| 2804 | + } |
| 2805 | + } |
| 2806 | + }; |
| 2807 | + |
| 2808 | + var workflowInstance = new WorkflowInstance |
| 2809 | + { |
| 2810 | + Id = workflowInstanceId, |
| 2811 | + WorkflowId = workflowId, |
| 2812 | + WorkflowName = workflow.Workflow.Name, |
| 2813 | + PayloadId = Guid.NewGuid().ToString(), |
| 2814 | + Status = Status.Created, |
| 2815 | + BucketId = "bucket", |
| 2816 | + Tasks = new List<TaskExecution> |
| 2817 | + { |
| 2818 | + new TaskExecution |
| 2819 | + { |
| 2820 | + TaskId = "pizza", |
| 2821 | + Status = TaskExecutionStatus.Created |
| 2822 | + }, |
| 2823 | + new TaskExecution |
| 2824 | + { |
| 2825 | + TaskId = "coffee", |
| 2826 | + Status = TaskExecutionStatus.Created |
| 2827 | + } |
| 2828 | + } |
| 2829 | + }; |
| 2830 | + |
| 2831 | + var payload = new Payload { PatientDetails = new PatientDetails { } }; |
| 2832 | + |
| 2833 | + _workflowInstanceRepository.Setup(w => w.UpdateTaskStatusAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<TaskExecutionStatus>())).ReturnsAsync(true); |
| 2834 | + _workflowInstanceRepository.Setup(w => w.GetByWorkflowInstanceIdAsync(workflowInstance.Id)).ReturnsAsync(workflowInstance); |
| 2835 | + _workflowInstanceRepository.Setup(w => w.UpdateTasksAsync(workflowInstance.Id, It.IsAny<List<TaskExecution>>())).ReturnsAsync(true); |
| 2836 | + _workflowRepository.Setup(w => w.GetByWorkflowIdAsync(workflowInstance.WorkflowId)).ReturnsAsync(workflow); |
| 2837 | + _payloadService.Setup(p => p.GetByIdAsync(It.IsAny<string>())).ReturnsAsync(payload); |
| 2838 | + |
| 2839 | + var mess = new WorkflowRequestEvent { WorkflowInstanceId = workflowInstance.Id, TaskId = "coffee" }; |
| 2840 | + |
| 2841 | + |
| 2842 | + var response = await WorkflowExecuterService.ProcessPayload(mess, payload); |
| 2843 | + |
| 2844 | + _messageBrokerPublisherService.Verify(w => w.Publish(_configuration.Value.Messaging.Topics.TaskDispatchRequest, It.IsAny<Message>()), Times.Exactly(0)); |
| 2845 | + _taskExecutionStatsRepository.Verify(w => w.UpdateExecutionStatsAsync(It.IsAny<TaskExecution>(), workflowId, TaskExecutionStatus.Succeeded)); |
| 2846 | + _workflowInstanceRepository.Verify(w => w.UpdateTaskStatusAsync(workflowInstanceId, "coffee", TaskExecutionStatus.Succeeded)); |
| 2847 | + |
| 2848 | + response.Should().BeTrue(); |
| 2849 | + |
| 2850 | + _workflowRepository.Verify(w => w.GetByWorkflowsIdsAsync(It.IsAny<List<string>>()), Times.Never()); |
| 2851 | + _workflowRepository.Verify(w => w.GetWorkflowsForWorkflowRequestAsync(It.IsAny<string>(), It.IsAny<string>()), Times.Never); |
| 2852 | + } |
2688 | 2853 | }
|
| 2854 | +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. |
2689 | 2855 | }
|
0 commit comments