diff --git a/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs b/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs index 6ba12311f..930a24c5e 100644 --- a/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs +++ b/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs @@ -31,7 +31,8 @@ public interface IWorkflowInstanceService : IPaginatedApi /// /// /// + /// /// - public Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null); + public Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null, string? payloadId = null); } } diff --git a/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs b/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs index 79c26c9e4..9e885be6a 100644 --- a/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs +++ b/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs @@ -39,10 +39,10 @@ public async Task GetByIdAsync(string id) public async Task CountAsync() => await _workflowInstanceRepository.CountAsync(); - public async Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null) - => await _workflowInstanceRepository.GetAllAsync(skip, limit, status); + public async Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null, string? payloadId = null) + => await _workflowInstanceRepository.GetAllAsync(skip, limit, status, payloadId); public async Task> GetAllAsync(int? skip = null, int? limit = null) - => await _workflowInstanceRepository.GetAllAsync(skip, limit, null); + => await _workflowInstanceRepository.GetAllAsync(skip, limit, null, null); } } diff --git a/src/WorkflowManager/Database/Interfaces/IWorkflowInstanceRepository.cs b/src/WorkflowManager/Database/Interfaces/IWorkflowInstanceRepository.cs index 484c4769f..b5444adc5 100644 --- a/src/WorkflowManager/Database/Interfaces/IWorkflowInstanceRepository.cs +++ b/src/WorkflowManager/Database/Interfaces/IWorkflowInstanceRepository.cs @@ -58,7 +58,7 @@ public interface IWorkflowInstanceRepository /// /// /// - Task> GetAllAsync(int? skip, int? limit, Status? status); + Task> GetAllAsync(int? skip, int? limit, Status? status, string? payloadId); /// /// Updates the Task Status for a given task within a workflow instance. diff --git a/src/WorkflowManager/Database/Repositories/WorkflowInstanceRepository.cs b/src/WorkflowManager/Database/Repositories/WorkflowInstanceRepository.cs index 11e52f45a..5b7b242d0 100644 --- a/src/WorkflowManager/Database/Repositories/WorkflowInstanceRepository.cs +++ b/src/WorkflowManager/Database/Repositories/WorkflowInstanceRepository.cs @@ -236,7 +236,7 @@ public async Task GetByWorkflowInstanceIdAsync(string workflow public Task CountAsync() => CountAsync(_workflowInstanceCollection, null); - public async Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null) + public async Task> GetAllAsync(int? skip = null, int? limit = null, Status? status = null, string? payloadId = null) { var builder = Builders.Filter; var filter = builder.Empty; @@ -244,6 +244,10 @@ public async Task> GetAllAsync(int? skip = null, int? li { filter &= builder.Eq(w => w.Status, status); } + if (string.IsNullOrEmpty(payloadId) is false) + { + filter &= builder.Eq(w => w.PayloadId, payloadId); + } return await GetAllAsync(_workflowInstanceCollection, filter, diff --git a/src/WorkflowManager/WorkflowExecuter/Services/WorkflowExecuterService.cs b/src/WorkflowManager/WorkflowExecuter/Services/WorkflowExecuterService.cs index a350c9668..209ff3d93 100644 --- a/src/WorkflowManager/WorkflowExecuter/Services/WorkflowExecuterService.cs +++ b/src/WorkflowManager/WorkflowExecuter/Services/WorkflowExecuterService.cs @@ -116,7 +116,7 @@ await _workflowRepository.GetWorkflowsByAeTitleAsync(message.CalledAeTitle) as L { processed &= await _workflowInstanceRepository.CreateAsync(workflowInstances); - var workflowInstanceIds = workflowInstances.Select(workflowInstance => workflowInstance.WorkflowId); + var workflowInstanceIds = workflowInstances.Select(workflowInstance => workflowInstance.Id); await _payloadService.UpdateWorkflowInstanceIdsAsync(payload.Id, workflowInstanceIds).ConfigureAwait(false); } diff --git a/src/WorkflowManager/WorkflowManager/Controllers/WorkflowInstanceController.cs b/src/WorkflowManager/WorkflowManager/Controllers/WorkflowInstanceController.cs index de83cef5b..e98e162ef 100644 --- a/src/WorkflowManager/WorkflowManager/Controllers/WorkflowInstanceController.cs +++ b/src/WorkflowManager/WorkflowManager/Controllers/WorkflowInstanceController.cs @@ -67,24 +67,35 @@ public WorkflowInstanceController( /// /// Filters. /// Workflow instance status filter. + /// PayloadId. + /// Disabled pagination. /// A list of workflow instances. [HttpGet] - public async Task GetListAsync([FromQuery] PaginationFilter filter, [FromQuery] string status = null) + public async Task GetListAsync([FromQuery] PaginationFilter filter, [FromQuery] string status = null, [FromQuery] string? payloadId = null, [FromQuery] bool disablePagination = false) { try { + Status? parsedStatus = status == null ? null : Enum.Parse(status, true); + + if (disablePagination is true) + { + var unpagedData = await _workflowInstanceService.GetAllAsync(null, null, parsedStatus, payloadId); + + return Ok(unpagedData); + } + var route = Request?.Path.Value ?? string.Empty; var pageSize = filter.PageSize ?? _options.Value.EndpointSettings.DefaultPageSize; - Status? parsedStatus = status == null ? null : Enum.Parse(status, true); var validFilter = new PaginationFilter(filter.PageNumber, pageSize, _options.Value.EndpointSettings.MaxPageSize); var pagedData = await _workflowInstanceService.GetAllAsync( (validFilter.PageNumber - 1) * validFilter.PageSize, validFilter.PageSize, - parsedStatus); + parsedStatus, + payloadId); var dataTotal = await _workflowInstanceService.CountAsync(); - var pagedReponse = CreatePagedReponse(pagedData.ToList(), validFilter, dataTotal, _uriService, route); + var pagedReponse = CreatePagedReponse(pagedData.ToList(), validFilter, dataTotal, _uriService, route); return Ok(pagedReponse); } diff --git a/src/WorkflowManager/WorkflowManager/Services/UriService.cs b/src/WorkflowManager/WorkflowManager/Services/UriService.cs index cfc3cbfa7..292eeec3b 100644 --- a/src/WorkflowManager/WorkflowManager/Services/UriService.cs +++ b/src/WorkflowManager/WorkflowManager/Services/UriService.cs @@ -44,6 +44,11 @@ public UriService(Uri baseUri) /// Uri. public string GetPageUriString(PaginationFilter filter, string route) { + if (_baseUri.ToString().EndsWith('/') && route.StartsWith('/')) + { + route = route.TrimStart('/'); + } + var endpointUri = new Uri(string.Concat(_baseUri, route)); var modifiedUri = QueryHelpers.AddQueryString(endpointUri.ToString(), "pageNumber", filter.PageNumber.ToString()); modifiedUri = QueryHelpers.AddQueryString(modifiedUri, "pageSize", filter?.PageSize?.ToString() ?? string.Empty); diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/PayloadCollection.feature b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/PayloadCollection.feature index 0c3c38fc3..050708992 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/PayloadCollection.feature +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/PayloadCollection.feature @@ -41,3 +41,22 @@ Scenario: Payload collection will be populated with null patient details after r When I publish a Workflow Request Message Basic_AeTitle_Payload_Collection_Request_3 with artifacts no_patient_metadata in minio Then A payload collection is created with patient details Null_Patient And I can see 1 Workflow Instance is created + +@WorkflowInstanceDetails +Scenario: Payload collection will be populated with workflow instance id after receiving a Workflow Request when workflow is matched + Given I have a clinical workflow Basic_Workflow_1 + When I publish a Workflow Request Message Basic_AeTitle_Payload_Collection_Request_1 with artifacts full_patient_metadata in minio + Then A payload collection is created with 1 workflow instance id + +@WorkflowInstanceDetails +Scenario: Payload collection will be populated with workflow instance ids after receiving a Workflow Request when multiple workflows are matched + Given I have a clinical workflow Basic_Workflow_1 + Given I have a clinical workflow Basic_Workflow_2 + When I publish a Workflow Request Message Basic_AeTitle_Payload_Collection_Request_1 with artifacts full_patient_metadata in minio + Then A payload collection is created with 2 workflow instance id + +@WorkflowInstanceDetails +Scenario: Payload collection will not be populated with workflow instance ids after receiving a Workflow Request when no workflows are matched + Given I publish a Workflow Request Message Basic_AeTitle_Payload_Collection_Request_1 with artifacts full_patient_metadata in minio + Then A payload collection is created with 0 workflow instance id + diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature index 9ecb31eb1..53e1c78bc 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature @@ -65,6 +65,20 @@ Scenario Outline: Get all workflow instances from API - Test pagination | | 0 | 0 | | ?pageNumber=1&pageSize=100 | 15 | 15 | +@WorkflowInstancePagination +Scenario Outline: Get all workflow instances from API with provided status or PayloadId - Test pagination + Given I have an endpoint /workflowinstances/ + And I have Workflow Instances + When I send a GET request + Then I will get a 200 response + And Pagination is working correctly for the workflow instances + And All results have correct and + Examples: + | pagination_query | amount | pagination_count | expected_status | expected_payloadId | + | ?pageSize=1 | 15 | 15 | | | + | ?pageSize=1&status=created | 15 | 15 | 0 | | + | ?pageSize=1&payloadId=5450c3a9-2b19-45b0-8b17-fb10f89d1b2d | 15 | 15 | | 5450c3a9-2b19-45b0-8b17-fb10f89d1b2d | + @WorkflowInstancePagination Scenario Outline: Invalid pagination returns 400 Given I have an endpoint /workflowinstances/ diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadCollectionStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadCollectionStepDefinitions.cs index b6dc79914..ad887f66a 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadCollectionStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadCollectionStepDefinitions.cs @@ -17,6 +17,10 @@ using BoDi; using Monai.Deploy.WorkflowManager.IntegrationTests.Support; using TechTalk.SpecFlow.Infrastructure; +using Polly; +using Polly.Retry; +using NUnit.Framework; +using Monai.Deploy.WorkflowManager.Contracts.Models; namespace Monai.Deploy.WorkflowManager.IntegrationTests.StepDefinitions { @@ -29,6 +33,7 @@ public class PayloadCollectionStepDefinitions private Assertions Assertions { get; set; } private DataHelper DataHelper { get; set; } private readonly ISpecFlowOutputHelper _outputHelper; + private RetryPolicy RetryPolicy { get; set; } #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. public PayloadCollectionStepDefinitions(ObjectContainer objectContainer, ISpecFlowOutputHelper outputHelper) @@ -37,6 +42,7 @@ public PayloadCollectionStepDefinitions(ObjectContainer objectContainer, ISpecFl _outputHelper = outputHelper; Assertions = new Assertions(objectContainer); DataHelper = objectContainer.Resolve(); + RetryPolicy = Policy.Handle().WaitAndRetry(retryCount: 5, sleepDurationProvider: _ => TimeSpan.FromMilliseconds(500)); } [Then(@"A payload collection is created with patient details (.*)")] @@ -64,5 +70,39 @@ public void ThenPayloadCollectionIsCreated(string patientDetailsName) } } } + [Then(@"A payload collection is created with (.*) workflow instance id")] + public void ThenAPayloadCollectionIsCreatedWithWorkflowInstanceId(int count) + { + RetryPolicy.Execute(() => + { + _outputHelper.WriteLine($"Retrieving payload collection using the payloadid={DataHelper.WorkflowRequestMessage.PayloadId}"); + var payloadCollections = DataHelper.GetPayloadCollections(DataHelper.WorkflowRequestMessage.PayloadId.ToString()); + _outputHelper.WriteLine($"Retrieved payload collection"); + + if (payloadCollections != null) + { + foreach (var payloadCollection in payloadCollections) + { + + var workflowInstances = DataHelper.GetWorkflowInstances(count, DataHelper.WorkflowRequestMessage.PayloadId.ToString()); + if (count != 0) + { + if (workflowInstances != null) + { + Assertions.AssertPayloadWorkflowInstanceId(payloadCollection, workflowInstances); + } + else + { + throw new Exception($"Workflow Instance not found"); + } + } + else + { + payloadCollection.WorkflowInstanceIds.Should().BeEmpty(); + } + } + } + }); + } } } diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs index 08198ce77..5a56be9ca 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs @@ -56,10 +56,30 @@ public void ThenICanSeeExpectedWorkflowInstanceIsReturned() [Then(@"Pagination is working correctly for the (.*) workflow instances")] public void ThenPaginationIsWorkingCorrectlyForTheWorkflowInstance(int count) { - var request = ApiHelper.Request.RequestUri.Query; + var request = ApiHelper.Request.RequestUri?.Query; var result = ApiHelper.Response.Content.ReadAsStringAsync().Result; var deserializedResult = JsonConvert.DeserializeObject>>(result); Assertions.AssertPagination(count, request, deserializedResult); } + + [Then(@"All results have correct (.*) and (.*)")] + public void AllResultsHaveExpectedStatusOrPayloadId(int? expected_status, string? expected_payloadId) + { + var result = ApiHelper.Response.Content.ReadAsStringAsync().Result; + var deserializedResult = JsonConvert.DeserializeObject>>(result); + + Action func = wi => { }; + if (string.IsNullOrWhiteSpace(expected_payloadId) is false) + { + func += wi => wi.PayloadId.Should().Be(expected_payloadId); + } + if (expected_status is not null) + { + func += wi => wi.Status.Should().Be((Status)expected_status); + } + + deserializedResult.Should().NotBeNull(); + deserializedResult?.Data.ForEach(func); + } } } diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowRequestStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowRequestStepDefinitions.cs index 599d0faa5..8a6eff0d0 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowRequestStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowRequestStepDefinitions.cs @@ -70,6 +70,7 @@ public void GivenIHaveClinicalWorkflows(int count) } } + [Given(@"I publish a Workflow Request Message (.*) with artifacts (.*) in minio")] [When(@"I publish a Workflow Request Message (.*) with artifacts (.*) in minio")] public async Task WhenIPublishAWorkflowRequestMessageWithObjects(string name, string folderName) { diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs index 7579b9c6e..01aa8db2c 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs @@ -283,34 +283,42 @@ public void AssertPayloadCollection(Payload payloadCollection, PatientDetails pa payloadCollection.Timestamp.Should().BeCloseTo(DateTime.UtcNow, precision: TimeSpan.FromMinutes(1)); payloadCollection.PatientDetails.Should().BeEquivalentTo(patientDetails); } + public void AssertPayloadWorkflowInstanceId(Payload payloadCollection, List workflowInstances) + { + foreach (var workflowInstance in workflowInstances) + { + payloadCollection.WorkflowInstanceIds.Should().Contain(workflowInstance.Id.ToString()); + } + } public void AssertWorkflowIstanceMatchesExpectedTaskStatusUpdate(WorkflowInstance updatedWorkflowInstance, TaskExecutionStatus taskExecutionStatus) { updatedWorkflowInstance.Tasks[0].Status.Should().Be(taskExecutionStatus); } - public static void AssertPagination(int count, string queries, T? Response) + public static void AssertPagination(int count, string? queries, T? Response) { var responseType = Response?.GetType(); - var data = responseType?.GetProperty("Data")?.GetValue(Response, null) as ICollection; - var totalPages = responseType?.GetProperty("TotalPages")?.GetValue(Response, null); - var pageSize = responseType?.GetProperty("PageSize")?.GetValue(Response, null); - var totalRecords = responseType?.GetProperty("TotalRecords")?.GetValue(Response, null); - var pageNumber = responseType?.GetProperty("PageNumber")?.GetValue(Response, null); - int pageNumberQuery = 1; - int pageSizeQuery = 10; - var splitQuery = queries.Split("&").ToList(); - if (queries != "") + GetPropertyValues(Response, responseType, out var data, out var totalPages, out var pageSize, out var totalRecords, out var pageNumber); + var pageNumberQuery = 1; + var pageSizeQuery = 10; + + if (string.IsNullOrWhiteSpace(queries) is false) { + var splitQuery = queries?.Split("&") ?? Array.Empty(); foreach (var query in splitQuery) { - if (query.Contains("pageNumber")) + if (query.Contains("status=") || query.Contains("payloadId=")) + { + continue; + } + else if (query.Contains("pageNumber") && int.TryParse(query.Split("=")[1], out var pageNumberResult)) { - pageNumberQuery = Int32.Parse(query.Split("=")[1]); + pageNumberQuery = pageNumberResult; } - else if (query.Contains("pageSize")) + else if (query.Contains("pageSize") && int.TryParse(query.Split("=")[1], out var pageSizeResult)) { - pageSizeQuery = Int32.Parse(query.Split("=")[1]); + pageSizeQuery = pageSizeResult; } else { @@ -318,6 +326,7 @@ public static void AssertPagination(int count, string queries, T? Response) } } } + AssertDataCount(data, pageNumberQuery, pageSizeQuery, count); AssertTotalPages(totalPages, count, pageSizeQuery); totalRecords.Should().Be(count); @@ -325,6 +334,15 @@ public static void AssertPagination(int count, string queries, T? Response) pageSize.Should().Be(pageSizeQuery); } + private static void GetPropertyValues(T? Response, Type? responseType, out ICollection? data, out object? totalPages, out object? pageSize, out object? totalRecords, out object? pageNumber) + { + data = responseType?.GetProperty("Data")?.GetValue(Response, null) as ICollection; + totalPages = responseType?.GetProperty("TotalPages")?.GetValue(Response, null); + pageSize = responseType?.GetProperty("PageSize")?.GetValue(Response, null); + totalRecords = responseType?.GetProperty("TotalRecords")?.GetValue(Response, null); + pageNumber = responseType?.GetProperty("PageNumber")?.GetValue(Response, null); + } + public void WorkflowInstanceIncludesTaskDetails(List taskDispatchEvents, WorkflowInstance workflowInstance, WorkflowRevision workflowRevision) { foreach (var taskDispatchEvent in taskDispatchEvents) diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs index 5c0e88517..ca912d5cd 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs @@ -22,7 +22,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Configuration; using Monai.Deploy.WorkflowManager.Contracts.Models; @@ -34,58 +33,47 @@ namespace Monai.Deploy.WorkflowManager.Test.Controllers { - public class WorkflowsInstanceControllerTests + public class PayloadControllerTests { - private WorkflowInstanceController WorkflowInstanceController { get; set; } + private PayloadsController PayloadController { get; set; } - private readonly Mock _workflowInstanceService; - private readonly Mock> _logger; + private readonly Mock _payloadService; + private readonly Mock> _logger; private readonly Mock _uriService; private readonly IOptions _options; - public WorkflowsInstanceControllerTests() + public PayloadControllerTests() { _options = Options.Create(new WorkflowManagerOptions()); - _workflowInstanceService = new Mock(); - _logger = new Mock>(); + _payloadService = new Mock(); + _logger = new Mock>(); _uriService = new Mock(); - WorkflowInstanceController = new WorkflowInstanceController(_workflowInstanceService.Object, _logger.Object, _uriService.Object, _options); + PayloadController = new PayloadsController(_payloadService.Object, _logger.Object, _uriService.Object, _options); } [Fact] - public async Task GetListAsync_WorkflowInstancesExist_ReturnsList() + public async Task GetListAsync_PayloadsExist_ReturnsList() { - var workflowsInstances = new List + var payloads = new List { - new WorkflowInstance + new Payload { Id = Guid.NewGuid().ToString(), - WorkflowId = Guid.NewGuid().ToString(), PayloadId = Guid.NewGuid().ToString(), - Status = Status.Created, - BucketId = "bucket", - Tasks = new List - { - new TaskExecution - { - TaskId = Guid.NewGuid().ToString(), - Status = TaskExecutionStatus.Dispatched - } - } } }; - _workflowInstanceService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(() => workflowsInstances); - _workflowInstanceService.Setup(w => w.CountAsync()).ReturnsAsync(workflowsInstances.Count); + _payloadService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(payloads); + _payloadService.Setup(w => w.CountAsync()).ReturnsAsync(payloads.Count); _uriService.Setup(s => s.GetPageUriString(It.IsAny(), It.IsAny())).Returns(() => "unitTest"); - var result = await WorkflowInstanceController.GetListAsync(new Filter.PaginationFilter()); + var result = await PayloadController.GetAllAsync(new Filter.PaginationFilter()); var objectResult = Assert.IsType(result); - var responseValue = (PagedResponse>)objectResult.Value; - responseValue.Data.Should().BeEquivalentTo(workflowsInstances); + var responseValue = (PagedResponse>)objectResult.Value; + responseValue.Data.Should().BeEquivalentTo(payloads); responseValue.FirstPage.Should().Be("unitTest"); responseValue.LastPage.Should().Be("unitTest"); responseValue.PageNumber.Should().Be(1); @@ -101,50 +89,39 @@ public async Task GetListAsync_WorkflowInstancesExist_ReturnsList() [Fact] public async Task GetListAsync_ServiceException_ReturnProblem() { - _workflowInstanceService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny())).ThrowsAsync(new Exception()); - _workflowInstanceService.Setup(w => w.CountAsync()).ReturnsAsync(0); + _payloadService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ThrowsAsync(new Exception()); - var result = await WorkflowInstanceController.GetListAsync(new Filter.PaginationFilter()); + var result = await PayloadController.GetAllAsync(new Filter.PaginationFilter()); var objectResult = Assert.IsType(result); Assert.Equal((int)HttpStatusCode.InternalServerError, objectResult.StatusCode); } [Fact] - public async Task GetByIdAsync_WorkflowInstancesExist_ReturnsOk() + public async Task GetByIdAsync_PayloadExists_ReturnsOk() { - var workflowsInstance = new WorkflowInstance + var payloadId = Guid.NewGuid().ToString(); + var payload = new Payload { Id = Guid.NewGuid().ToString(), - WorkflowId = Guid.NewGuid().ToString(), - PayloadId = Guid.NewGuid().ToString(), - Status = Status.Created, - BucketId = "bucket", - Tasks = new List - { - new TaskExecution - { - TaskId = Guid.NewGuid().ToString(), - Status = TaskExecutionStatus.Dispatched - } - } + PayloadId = payloadId, }; - _workflowInstanceService.Setup(w => w.GetByIdAsync(workflowsInstance.WorkflowId)).ReturnsAsync(workflowsInstance); + _payloadService.Setup(w => w.GetByIdAsync(payloadId)).ReturnsAsync(payload); - var result = await WorkflowInstanceController.GetByIdAsync(workflowsInstance.WorkflowId); + var result = await PayloadController.GetAsync(payloadId); var objectResult = Assert.IsType(result); - objectResult.Value.Should().BeEquivalentTo(workflowsInstance); + objectResult.Value.Should().BeEquivalentTo(payload); } [Fact] - public async Task GetByIdAsync_WorkflowInstanceDoesNotExist_ReturnsNotFound() + public async Task GetByIdAsync_PayloadDoesNotExist_ReturnsNotFound() { - var workflowId = Guid.NewGuid().ToString(); + var payloadId = Guid.NewGuid().ToString(); - var result = await WorkflowInstanceController.GetByIdAsync(workflowId); + var result = await PayloadController.GetAsync(payloadId); var objectResult = Assert.IsType(result); @@ -154,9 +131,9 @@ public async Task GetByIdAsync_WorkflowInstanceDoesNotExist_ReturnsNotFound() [Fact] public async Task GetByIdAsync_InvalidId_ReturnsBadRequest() { - var workflowId = "2"; + var payloadId = "2"; - var result = await WorkflowInstanceController.GetByIdAsync(workflowId); + var result = await PayloadController.GetAsync(payloadId); var objectResult = Assert.IsType(result); @@ -166,10 +143,10 @@ public async Task GetByIdAsync_InvalidId_ReturnsBadRequest() [Fact] public async Task GetByIdAsync_ServiceException_ReturnProblem() { - var workflowId = Guid.NewGuid().ToString(); - _workflowInstanceService.Setup(w => w.GetByIdAsync(workflowId)).ThrowsAsync(new Exception()); + var payloadId = Guid.NewGuid().ToString(); + _payloadService.Setup(w => w.GetByIdAsync(payloadId)).ThrowsAsync(new Exception()); - var result = await WorkflowInstanceController.GetByIdAsync(workflowId); + var result = await PayloadController.GetAsync(payloadId); var objectResult = Assert.IsType(result); Assert.Equal((int)HttpStatusCode.InternalServerError, objectResult.StatusCode); diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs index ca912d5cd..48bd308fb 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs @@ -22,6 +22,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Configuration; using Monai.Deploy.WorkflowManager.Contracts.Models; @@ -33,47 +34,58 @@ namespace Monai.Deploy.WorkflowManager.Test.Controllers { - public class PayloadControllerTests + public class WorkflowsInstanceControllerTests { - private PayloadsController PayloadController { get; set; } + private WorkflowInstanceController WorkflowInstanceController { get; set; } - private readonly Mock _payloadService; - private readonly Mock> _logger; + private readonly Mock _workflowInstanceService; + private readonly Mock> _logger; private readonly Mock _uriService; private readonly IOptions _options; - public PayloadControllerTests() + public WorkflowsInstanceControllerTests() { _options = Options.Create(new WorkflowManagerOptions()); - _payloadService = new Mock(); - _logger = new Mock>(); + _workflowInstanceService = new Mock(); + _logger = new Mock>(); _uriService = new Mock(); - PayloadController = new PayloadsController(_payloadService.Object, _logger.Object, _uriService.Object, _options); + WorkflowInstanceController = new WorkflowInstanceController(_workflowInstanceService.Object, _logger.Object, _uriService.Object, _options); } [Fact] - public async Task GetListAsync_PayloadsExist_ReturnsList() + public async Task GetListAsync_WorkflowInstancesExist_ReturnsList() { - var payloads = new List + var workflowsInstances = new List { - new Payload + new WorkflowInstance { Id = Guid.NewGuid().ToString(), + WorkflowId = Guid.NewGuid().ToString(), PayloadId = Guid.NewGuid().ToString(), + Status = Status.Created, + BucketId = "bucket", + Tasks = new List + { + new TaskExecution + { + TaskId = Guid.NewGuid().ToString(), + Status = TaskExecutionStatus.Dispatched + } + } } }; - _payloadService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(payloads); - _payloadService.Setup(w => w.CountAsync()).ReturnsAsync(payloads.Count); + _workflowInstanceService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(() => workflowsInstances); + _workflowInstanceService.Setup(w => w.CountAsync()).ReturnsAsync(workflowsInstances.Count); _uriService.Setup(s => s.GetPageUriString(It.IsAny(), It.IsAny())).Returns(() => "unitTest"); - var result = await PayloadController.GetAllAsync(new Filter.PaginationFilter()); + var result = await WorkflowInstanceController.GetListAsync(new Filter.PaginationFilter()); var objectResult = Assert.IsType(result); - var responseValue = (PagedResponse>)objectResult.Value; - responseValue.Data.Should().BeEquivalentTo(payloads); + var responseValue = (PagedResponse>)objectResult.Value; + responseValue.Data.Should().BeEquivalentTo(workflowsInstances); responseValue.FirstPage.Should().Be("unitTest"); responseValue.LastPage.Should().Be("unitTest"); responseValue.PageNumber.Should().Be(1); @@ -86,42 +98,86 @@ public async Task GetListAsync_PayloadsExist_ReturnsList() responseValue.Errors.Should().BeNullOrEmpty(); } + [Fact] + public async Task GetListAsync_PaginationDisabled_ReturnsList() + { + var workflowsInstances = new List + { + new WorkflowInstance + { + Id = Guid.NewGuid().ToString(), + WorkflowId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), + Status = Status.Created, + BucketId = "bucket", + Tasks = new List + { + new TaskExecution + { + TaskId = Guid.NewGuid().ToString(), + Status = TaskExecutionStatus.Dispatched + } + } + } + }; + + _workflowInstanceService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(() => workflowsInstances); + + var result = await WorkflowInstanceController.GetListAsync(new Filter.PaginationFilter(), null, null, true); + + var objectResult = Assert.IsType(result); + + var responseValue = (List)objectResult.Value; + responseValue.Should().BeEquivalentTo(workflowsInstances); + } + [Fact] public async Task GetListAsync_ServiceException_ReturnProblem() { - _payloadService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ThrowsAsync(new Exception()); + _workflowInstanceService.Setup(w => w.GetAllAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ThrowsAsync(new Exception()); + _workflowInstanceService.Setup(w => w.CountAsync()).ReturnsAsync(0); - var result = await PayloadController.GetAllAsync(new Filter.PaginationFilter()); + var result = await WorkflowInstanceController.GetListAsync(new Filter.PaginationFilter()); var objectResult = Assert.IsType(result); Assert.Equal((int)HttpStatusCode.InternalServerError, objectResult.StatusCode); } [Fact] - public async Task GetByIdAsync_PayloadExists_ReturnsOk() + public async Task GetByIdAsync_WorkflowInstancesExist_ReturnsOk() { - var payloadId = Guid.NewGuid().ToString(); - var payload = new Payload + var workflowsInstance = new WorkflowInstance { Id = Guid.NewGuid().ToString(), - PayloadId = payloadId, + WorkflowId = Guid.NewGuid().ToString(), + PayloadId = Guid.NewGuid().ToString(), + Status = Status.Created, + BucketId = "bucket", + Tasks = new List + { + new TaskExecution + { + TaskId = Guid.NewGuid().ToString(), + Status = TaskExecutionStatus.Dispatched + } + } }; - _payloadService.Setup(w => w.GetByIdAsync(payloadId)).ReturnsAsync(payload); + _workflowInstanceService.Setup(w => w.GetByIdAsync(workflowsInstance.WorkflowId)).ReturnsAsync(workflowsInstance); - var result = await PayloadController.GetAsync(payloadId); + var result = await WorkflowInstanceController.GetByIdAsync(workflowsInstance.WorkflowId); var objectResult = Assert.IsType(result); - objectResult.Value.Should().BeEquivalentTo(payload); + objectResult.Value.Should().BeEquivalentTo(workflowsInstance); } [Fact] - public async Task GetByIdAsync_PayloadDoesNotExist_ReturnsNotFound() + public async Task GetByIdAsync_WorkflowInstanceDoesNotExist_ReturnsNotFound() { - var payloadId = Guid.NewGuid().ToString(); + var workflowId = Guid.NewGuid().ToString(); - var result = await PayloadController.GetAsync(payloadId); + var result = await WorkflowInstanceController.GetByIdAsync(workflowId); var objectResult = Assert.IsType(result); @@ -131,9 +187,9 @@ public async Task GetByIdAsync_PayloadDoesNotExist_ReturnsNotFound() [Fact] public async Task GetByIdAsync_InvalidId_ReturnsBadRequest() { - var payloadId = "2"; + var workflowId = "2"; - var result = await PayloadController.GetAsync(payloadId); + var result = await WorkflowInstanceController.GetByIdAsync(workflowId); var objectResult = Assert.IsType(result); @@ -143,10 +199,10 @@ public async Task GetByIdAsync_InvalidId_ReturnsBadRequest() [Fact] public async Task GetByIdAsync_ServiceException_ReturnProblem() { - var payloadId = Guid.NewGuid().ToString(); - _payloadService.Setup(w => w.GetByIdAsync(payloadId)).ThrowsAsync(new Exception()); + var workflowId = Guid.NewGuid().ToString(); + _workflowInstanceService.Setup(w => w.GetByIdAsync(workflowId)).ThrowsAsync(new Exception()); - var result = await PayloadController.GetAsync(payloadId); + var result = await WorkflowInstanceController.GetByIdAsync(workflowId); var objectResult = Assert.IsType(result); Assert.Equal((int)HttpStatusCode.InternalServerError, objectResult.StatusCode);