Skip to content

Commit 77fb6b8

Browse files
authored
Merge pull request #813 from Project-MONAI/samrooke/AC-2211-task-manager-email-plugin-int-tests
add initial int test for email task
2 parents 2a9eeb5 + 2c60c0e commit 77fb6b8

21 files changed

+447
-257
lines changed

src/TaskManager/Plug-ins/AideClinicalReview/packages.lock.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -733,8 +733,8 @@
733733
"monai.deploy.workflowmanager.configuration": {
734734
"type": "Project",
735735
"dependencies": {
736-
"Monai.Deploy.Messaging": "[0.1.23, )",
737-
"Monai.Deploy.Storage": "[0.2.15, )"
736+
"Monai.Deploy.Messaging": "0.1.23",
737+
"Monai.Deploy.Storage": "0.2.15"
738738
}
739739
},
740740
"monai.deploy.workflowmanager.shared": {
@@ -749,11 +749,11 @@
749749
"monai.deploy.workflowmanager.taskmanager.api": {
750750
"type": "Project",
751751
"dependencies": {
752-
"Monai.Deploy.Messaging": "[0.1.23, )",
753-
"Mongo.Migration": "[3.1.4, )",
754-
"MongoDB.Bson": "[2.19.0, )"
752+
"Monai.Deploy.Messaging": "0.1.23",
753+
"Mongo.Migration": "3.1.4",
754+
"MongoDB.Bson": "2.19.0"
755755
}
756756
}
757757
}
758758
}
759-
}
759+
}

src/TaskManager/Plug-ins/Argo/packages.lock.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -1203,8 +1203,8 @@
12031203
"monai.deploy.workflowmanager.configuration": {
12041204
"type": "Project",
12051205
"dependencies": {
1206-
"Monai.Deploy.Messaging": "[0.1.23, )",
1207-
"Monai.Deploy.Storage": "[0.2.15, )"
1206+
"Monai.Deploy.Messaging": "0.1.23",
1207+
"Monai.Deploy.Storage": "0.2.15"
12081208
}
12091209
},
12101210
"monai.deploy.workflowmanager.shared": {
@@ -1219,11 +1219,11 @@
12191219
"monai.deploy.workflowmanager.taskmanager.api": {
12201220
"type": "Project",
12211221
"dependencies": {
1222-
"Monai.Deploy.Messaging": "[0.1.23, )",
1223-
"Mongo.Migration": "[3.1.4, )",
1224-
"MongoDB.Bson": "[2.19.0, )"
1222+
"Monai.Deploy.Messaging": "0.1.23",
1223+
"Mongo.Migration": "3.1.4",
1224+
"MongoDB.Bson": "2.19.0"
12251225
}
12261226
}
12271227
}
12281228
}
1229-
}
1229+
}

src/TaskManager/Plug-ins/Email/EmailPlugin.cs

-4
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616

1717

1818
using System.Net.Mail;
19-
using System.Text.Json;
2019
using Ardalis.GuardClauses;
21-
using FellowOakDicom.Serialization;
2220
using FellowOakDicom;
2321
using Microsoft.Extensions.Logging;
2422
using Microsoft.Extensions.Options;
@@ -113,8 +111,6 @@ private void ValidateEventAndInit()
113111
}
114112
}
115113

116-
117-
118114
public override async Task<ExecutionStatus> ExecuteTask(CancellationToken cancellationToken = default)
119115
{
120116
using var loggingScope = _logger.BeginScope(new Dictionary<string, object>

src/TaskManager/TaskManager/Program.cs

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
using Monai.Deploy.WorkflowManager.Shared.Services;
4242
using Microsoft.AspNetCore.Builder;
4343

44-
4544
namespace Monai.Deploy.WorkflowManager.TaskManager
4645
{
4746
public class Program

src/TaskManager/TaskManager/packages.lock.json

+15-6
Original file line numberDiff line numberDiff line change
@@ -1920,8 +1920,8 @@
19201920
"monai.deploy.workflowmanager.configuration": {
19211921
"type": "Project",
19221922
"dependencies": {
1923-
"Monai.Deploy.Messaging": "[0.1.23, )",
1924-
"Monai.Deploy.Storage": "[0.2.15, )"
1923+
"Monai.Deploy.Messaging": "0.1.23",
1924+
"Monai.Deploy.Storage": "0.2.15"
19251925
}
19261926
},
19271927
"monai.deploy.workflowmanager.shared": {
@@ -1969,9 +1969,18 @@
19691969
"monai.deploy.workflowmanager.taskmanager.docker": {
19701970
"type": "Project",
19711971
"dependencies": {
1972-
"Docker.DotNet": "[3.125.13, )",
1973-
"Monai.Deploy.WorkflowManager.Configuration": "[1.0.0, )",
1974-
"Monai.Deploy.WorkflowManager.TaskManager.API": "[1.0.0, )"
1972+
"Docker.DotNet": "3.125.13",
1973+
"Monai.Deploy.WorkflowManager.Configuration": "1.0.0",
1974+
"Monai.Deploy.WorkflowManager.TaskManager.API": "1.0.0"
1975+
}
1976+
},
1977+
"monai.deploy.workflowmanager.taskmanager.email": {
1978+
"type": "Project",
1979+
"dependencies": {
1980+
"Monai.Deploy.WorkflowManager.Configuration": "1.0.0",
1981+
"Monai.Deploy.WorkflowManager.Shared": "1.0.0",
1982+
"Monai.Deploy.WorkflowManager.TaskManager.API": "1.0.0",
1983+
"fo-dicom": "5.0.3"
19751984
}
19761985
},
19771986
"monai.deploy.workflowmanager.taskmanager.email": {
@@ -1985,4 +1994,4 @@
19851994
}
19861995
}
19871996
}
1988-
}
1997+
}

src/WorkflowManager/WorkflowManager/Program.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ namespace Monai.Deploy.WorkflowManager
5252
{
5353
#pragma warning disable SA1600 // Elements should be documented
5454

55-
internal class Program
55+
public class Program
5656
{
5757
protected Program()
5858
{

tests/IntegrationTests/TaskManager.IntegrationTests/Features/ClinicalReview.feature

+1-13
Original file line numberDiff line numberDiff line change
@@ -12,80 +12,68 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
@IntergrationTests
15+
@IntegrationTests
1616
Feature: ClinicalReview
1717

1818
Integration tests for the clinical review plugin
1919

2020
@ClinicalReviewPlugin
2121
Scenario: Clincial review task dispatch event triggers a clinical review request event with all patient details
22-
Given I have a bucket in MinIO bucket1
2322
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Full_Patient_Details
2423
Then A Clincial Review Request event is published
2524

2625
@ClinicalReviewPlugin
2726
Scenario: Clincial review task dispatch event triggers a clinical review request event with partial patient details
28-
Given I have a bucket in MinIO bucket1
2927
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Partial_Patient_Details
3028
Then A Clincial Review Request event is published
3129

3230
@ClinicalReviewPlugin
3331
Scenario: Clincial review task dispatch event triggers a clinical review request event with no patient details
34-
Given I have a bucket in MinIO bucket1
3532
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_No_Patient_Details
3633
Then A Clincial Review Request event is published
3734

3835
@ClinicalReviewPlugin
3936
Scenario: Clincial review task dispatch event triggers a clinical review request event with multiple files
40-
Given I have a bucket in MinIO bucket1
4137
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Multi_File
4238
Then A Clincial Review Request event is published
4339

4440
@ClinicalReviewPlugin
4541
Scenario: Clincial review task dispatch event triggers clincial review event with single reviewer role
46-
Given I have a bucket in MinIO bucket1
4742
When A Task Dispatch event is published Task_Dispatch_Clinical_Reviewer_Role_Single_Role
4843
Then A Clincial Review Request event is published
4944

5045
@ClinicalReviewPlugin
5146
Scenario: Clincial review task dispatch event triggers clincial review event with default reviewer role
52-
Given I have a bucket in MinIO bucket1
5347
When A Task Dispatch event is published Task_Dispatch_Clinical_Reviewer_Role_Mutiple_Roles
5448
Then A Clincial Review Request event is published
5549

5650
@ClinicalReviewPlugin
5751
Scenario: Clincial review task dispatch event triggers clincial review event with mutiple reviewer roles
58-
Given I have a bucket in MinIO bucket1
5952
When A Task Dispatch event is published Task_Dispatch_Clinical_Reviewer_Role_Default_Role
6053
Then A Clincial Review Request event is published
6154

6255
@ClinicalReviewPlugin
6356
Scenario: Clincial review task dispatch event triggers clincial review event with application name
64-
Given I have a bucket in MinIO bucket1
6557
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Application_Name
6658
Then A Clincial Review Request event is published
6759

6860
@ClinicalReviewPlugin
6961
Scenario: Clincial review task dispatch event triggers clincial review event with application version
70-
Given I have a bucket in MinIO bucket1
7162
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Application_Version
7263
Then A Clincial Review Request event is published
7364

7465
@ClinicalReviewPlugin
7566
Scenario: Clincial review task dispatch event triggers clincial review event with QA mode
76-
Given I have a bucket in MinIO bucket1
7767
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_QA_Mode
7868
Then A Clincial Review Request event is published
7969

8070
@ClinicalReviewPlugin
8171
Scenario: Clincial review task dispatch event triggers clincial review event with reviewed execution Id
82-
Given I have a bucket in MinIO bucket1
8372
When A Task Dispatch event is published Task_Dispatch_Clinical_Review_Reviewed_Execution_Id
8473
Then A Clincial Review Request event is published
8574

8675
@ClinicalReviewPlugin
8776
Scenario Outline: Clincial review task dispatch event triggers clincial review event with notifications
88-
Given I have a bucket in MinIO bucket1
8977
When A Task Dispatch event is published <testData>
9078
Then A Clincial Review Request event is published
9179
Examples:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright 2023 MONAI Consortium
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
@IntegrationTests
16+
Feature: EmialNotification
17+
18+
Integration tests for the email plugin
19+
20+
@EmailPlugin
21+
Scenario: Email task dispatch event triggers an email request event with all relevant args
22+
Given I have an input DICOM file saved in MinIO for TaskDispatch Task_Dispatch_Email_All
23+
When A Task Dispatch event is published Task_Dispatch_Email_All
24+
Then An email request event is published
25+
26+
@EmailPlugin
27+
Scenario: Email task dispatch event triggers an email request event with only emails arg
28+
Given I have an input DICOM file saved in MinIO for TaskDispatch Task_Dispatch_Email_Emails
29+
When A Task Dispatch event is published Task_Dispatch_Email_Emails
30+
Then An email request event is published
31+
32+
@EmailPlugin
33+
Scenario: Email task dispatch event triggers an email request event with only roles arg
34+
Given I have an input DICOM file saved in MinIO for TaskDispatch Task_Dispatch_Email_Roles
35+
When A Task Dispatch event is published Task_Dispatch_Email_Roles
36+
Then An email request event is published

tests/IntegrationTests/TaskManager.IntegrationTests/Features/TaskUpdate.feature

-3
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,11 @@ Integration tests for testing TaskUpdateEvents from TaskManager
1919

2020
@TaskDispatch_TaskUpdate
2121
Scenario: TaskUpdateEvent is published with status Accepted after receiving a valid TaskDispatchEvent
22-
Given I have a bucket in MinIO bucket1
2322
When A Task Dispatch event is published Task_Dispatch_Accepted
2423
Then A Task Update event with status Accepted is published with Task Dispatch details
2524

2625
@TaskDispatch_TaskUpdate
2726
Scenario Outline: TaskUpdateEvent is published with status Failed after receiving an invalid TaskDispatchEvent
28-
Given I have a bucket in MinIO bucket1
2927
When A Task Dispatch event is published <TaskDispatchEvent>
3028
Then A Task Update event with status Failed is published with Task Dispatch details
3129
Examples:
@@ -39,7 +37,6 @@ Scenario Outline: TaskUpdateEvent is published with status Failed after receivin
3937
@Ignore
4038
@TaskCallback_TaskUpdate
4139
Scenario Outline: TaskUpdateEvent is published with correct status upon receiving a valid TaskCallbackEvent
42-
Given I have a bucket in MinIO bucket1
4340
And I have Task Dispatch Info saved in Mongo Task_Dispatch_Basic_Clinical_Review
4441
When A Task Callback event is published <taskCallbackEvent>
4542
Then A Task Update event with status <status> is published with Task Callback details

tests/IntegrationTests/TaskManager.IntegrationTests/Hooks.cs

+17-6
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17+
using Microsoft.AspNetCore.Mvc.Testing;
1718
using Microsoft.Extensions.Configuration;
18-
using Microsoft.Extensions.Hosting;
1919
using Monai.Deploy.WorkflowManager.TaskManager.IntegrationTests.POCO;
2020
using Monai.Deploy.WorkflowManager.TaskManager.IntegrationTests.Support;
2121
using Polly;
@@ -42,12 +42,13 @@ public Hooks(IObjectContainer objectContainer)
4242
private static RabbitPublisher? TaskCallbackPublisher { get; set; }
4343
private static RabbitConsumer? TaskUpdateConsumer { get; set; }
4444
public static RabbitConsumer? ClinicalReviewConsumer { get; private set; }
45+
public static RabbitConsumer? EmailConsumer { get; private set; }
4546
private static MinioClientUtil? MinioClient { get; set; }
4647
private static MongoClientUtil? MongoClient { get; set; }
4748
public static AsyncRetryPolicy RetryPolicy { get; private set; }
4849
private IObjectContainer ObjectContainer { get; set; }
49-
private static IHost? Host { get; set; }
5050
private static HttpClient? HttpClient { get; set; }
51+
private static WebApplicationFactory<Program>? WebApplicationFactory { get; set; }
5152

5253
/// <summary>
5354
/// Runs before all tests to create static implementions of Rabbit and Mongo clients as well as starting the WorkflowManager using WebApplicationFactory.
@@ -70,6 +71,7 @@ public static void Init()
7071
TestExecutionConfig.RabbitConfig.TaskCallbackQueue = "md.tasks.callback";
7172
TestExecutionConfig.RabbitConfig.TaskUpdateQueue = "md.tasks.update";
7273
TestExecutionConfig.RabbitConfig.ClinicalReviewQueue = "aide.clinical_review.request";
74+
TestExecutionConfig.RabbitConfig.EmailQueue = "aide.notification_email.request";
7375
TestExecutionConfig.RabbitConfig.TaskCancellationQueue = "md.tasks.cancellation";
7476

7577
TestExecutionConfig.MongoConfig.ConnectionString = config.GetValue<string>("WorkloadManagerDatabase:ConnectionString");
@@ -87,11 +89,12 @@ public static void Init()
8789

8890
RabbitConnectionFactory.DeleteAllQueues();
8991

92+
WebApplicationFactory = WebAppFactory.GetWebApplicationFactory();
93+
HttpClient = WebApplicationFactory?.CreateClient();
94+
9095
RetryPolicy = Policy.Handle<Exception>().WaitAndRetryAsync(retryCount: 20, sleepDurationProvider: _ => TimeSpan.FromMilliseconds(500));
9196
MongoClient = new MongoClientUtil();
92-
HttpClient = new HttpClient();
9397
MinioClient = new MinioClientUtil();
94-
Host = TaskManagerStartup.StartTaskManager();
9598

9699
RabbitConnectionFactory.SetRabbitConnection();
97100
}
@@ -116,7 +119,7 @@ public static async Task CheckTaskManagerConsumersStarted()
116119
{
117120
await RetryPolicy.ExecuteAsync(async () =>
118121
{
119-
var response = await TaskManagerStartup.GetQueueStatus(HttpClient, TestExecutionConfig.RabbitConfig.VirtualHost, TestExecutionConfig.RabbitConfig.TaskDispatchQueue);
122+
var response = await WebAppFactory.GetQueueStatus(HttpClient, TestExecutionConfig.RabbitConfig.VirtualHost, TestExecutionConfig.RabbitConfig.TaskDispatchQueue);
120123
var content = response.Content.ReadAsStringAsync().Result;
121124

122125
if (content.Contains("error"))
@@ -133,6 +136,13 @@ await RetryPolicy.ExecuteAsync(async () =>
133136
TaskCallbackPublisher = new RabbitPublisher(TestExecutionConfig.RabbitConfig.Exchange, TestExecutionConfig.RabbitConfig.TaskCallbackQueue);
134137
TaskUpdateConsumer = new RabbitConsumer(TestExecutionConfig.RabbitConfig.Exchange, TestExecutionConfig.RabbitConfig.TaskUpdateQueue);
135138
ClinicalReviewConsumer = new RabbitConsumer(TestExecutionConfig.RabbitConfig.Exchange, TestExecutionConfig.RabbitConfig.ClinicalReviewQueue);
139+
EmailConsumer = new RabbitConsumer(TestExecutionConfig.RabbitConfig.Exchange, TestExecutionConfig.RabbitConfig.EmailQueue);
140+
}
141+
142+
[BeforeTestRun(Order = 3)]
143+
public static async Task CreateBucket()
144+
{
145+
await MinioClient.CreateBucket(TestExecutionConfig.MinioConfig.Bucket);
136146
}
137147

138148
/// <summary>
@@ -145,6 +155,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH
145155
ObjectContainer.RegisterInstanceAs(TaskCallbackPublisher, "TaskCallbackPublisher");
146156
ObjectContainer.RegisterInstanceAs(TaskUpdateConsumer, "TaskUpdateConsumer");
147157
ObjectContainer.RegisterInstanceAs(ClinicalReviewConsumer, "ClinicalReviewConsumer");
158+
ObjectContainer.RegisterInstanceAs(EmailConsumer, "EmailConsumer");
148159
ObjectContainer.RegisterInstanceAs(MinioClient);
149160
var dataHelper = new DataHelper(ObjectContainer);
150161
ObjectContainer.RegisterInstanceAs(dataHelper);
@@ -162,7 +173,7 @@ public void SetUp(ScenarioContext scenarioContext, ISpecFlowOutputHelper outputH
162173
public static void TearDownRabbit()
163174
{
164175
RabbitConnectionFactory.DeleteAllQueues();
165-
Host?.StopAsync();
176+
WebApplicationFactory?.Dispose();
166177
}
167178
}
168179
}

tests/IntegrationTests/TaskManager.IntegrationTests/POCO/TestExecutionConfig.cs

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public static class RabbitConfig
4646

4747
public static string ClinicalReviewQueue { get; set; }
4848

49+
public static string EmailQueue { get; set; }
50+
4951
public static object TaskCancellationQueue { get; set; }
5052
}
5153

0 commit comments

Comments
 (0)