10
10
import java .lang .reflect .Constructor ;
11
11
import java .lang .reflect .InvocationTargetException ;
12
12
import java .lang .reflect .Method ;
13
- import java .lang .reflect .Modifier ;
14
13
import java .util .ArrayList ;
15
- import java .util .Arrays ;
16
- import java .util .HashMap ;
17
14
import java .util .List ;
18
15
import java .util .Map ;
19
16
import java .util .Optional ;
20
- import java .util .function .BiConsumer ;
21
17
import java .util .function .Predicate ;
22
18
import java .util .stream .Collectors ;
23
19
@@ -58,7 +54,8 @@ public static void loadResources()
58
54
ProcessPluginDefinition definition = new TutorialProcessPluginDefinition ();
59
55
ProcessPluginImpl processPlugin = TestProcessPluginGenerator .generate (definition , false ,
60
56
BpmnAndUserTaskListenerTest .class );
61
- boolean initialized = processPlugin .initializeAndValidateResources (ConstantsTutorial .TUTORIAL_DIC_ORGANIZATION_IDENTIFIER );
57
+ boolean initialized = processPlugin
58
+ .initializeAndValidateResources (ConstantsTutorial .TUTORIAL_DIC_ORGANIZATION_IDENTIFIER );
62
59
63
60
assertEquals (true , initialized );
64
61
}
@@ -70,8 +67,8 @@ public void testVoteBpmnFile()
70
67
String processId = "dsfdev_vote" ;
71
68
String questionnaireUrl = "http://dsf.dev/fhir/Questionnaire/user-vote|#{version}" ;
72
69
73
- BpmnModelInstance model = Bpmn . readModelFromStream (
74
- this .getClass ().getClassLoader ().getResourceAsStream (filename ));
70
+ BpmnModelInstance model = Bpmn
71
+ . readModelFromStream ( this .getClass ().getClassLoader ().getResourceAsStream (filename ));
75
72
assertNotNull (model );
76
73
77
74
List <Process > processes = model .getModelElementsByType (Process .class ).stream ()
@@ -84,54 +81,73 @@ public void testVoteBpmnFile()
84
81
int userTaskCount = process .getChildElementsByType (UserTask .class ).size ();
85
82
assertTrue (errorMissingUserTask , userTaskCount > 0 );
86
83
87
- String errorMissingCorrectUserTask = "Process '" + processId + "' in file '" + filename + " is missing User Task with incoming flow from exclusive gateway with name 'User Vote?' and outgoing flow to service task with name 'Save User Vote'" ;
84
+ String errorMissingCorrectUserTask = "Process '" + processId + "' in file '" + filename
85
+ + " is missing User Task with incoming flow from exclusive gateway with name 'User Vote?' and outgoing flow to service task with name 'Save User Vote'" ;
88
86
Optional <UserTask > optUserTask = process .getChildElementsByType (UserTask .class ).stream ()
89
- .filter (userTask -> userTask .getIncoming ().stream ().anyMatch (isFlowConnectingUserTaskAndExclusiveGateway (userTask )))
90
- .filter (userTask -> userTask .getOutgoing ().stream ().anyMatch (isFlowConnectingUserTaskAndSaveUserVoteServer (userTask ))).findFirst ();
87
+ .filter (userTask -> userTask .getIncoming ().stream ()
88
+ .anyMatch (isFlowConnectingUserTaskAndExclusiveGateway (userTask )))
89
+ .filter (userTask -> userTask .getOutgoing ().stream ()
90
+ .anyMatch (isFlowConnectingUserTaskAndSaveUserVoteServer (userTask )))
91
+ .findFirst ();
91
92
assertTrue (errorMissingCorrectUserTask , optUserTask .isPresent ());
92
93
UserTask userTask = optUserTask .get ();
93
94
94
- String errorUserTaskIncomingFlowMissingCondition =
95
- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
96
- + " is missing condition expression '${userVote}' on incoming flow from exclusive gateway with name 'User Vote?'" ;
95
+ String errorUserTaskIncomingFlowMissingCondition = "User Task in process '" + processId + "' in file '"
96
+ + filename + " with name " + userTask .getOutgoing ()
97
+ + " is missing condition expression '${userVote}' on incoming flow from exclusive gateway with name 'User Vote?'" ;
97
98
assertTrue (errorUserTaskIncomingFlowMissingCondition ,
98
- userTask .getIncoming ().stream ().filter (isFlowConnectingUserTaskAndExclusiveGateway (userTask )).allMatch (hasCorrectConditionExpression ()));
99
+ userTask .getIncoming ().stream ().filter (isFlowConnectingUserTaskAndExclusiveGateway (userTask ))
100
+ .allMatch (hasCorrectConditionExpression ()));
99
101
100
- String errorUserTaskIsMissingCorrectFormKey =
101
- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
102
- + " is missing Form Key with value " + questionnaireUrl ;
102
+ String errorUserTaskIsMissingCorrectFormKey = "User Task in process '" + processId + "' in file '" + filename
103
+ + " with name " + userTask .getOutgoing () + " is missing Form Key with value " + questionnaireUrl ;
103
104
assertEquals (errorUserTaskIsMissingCorrectFormKey , userTask .getCamundaFormKey (), questionnaireUrl );
104
105
105
106
String packageName = "dev.dsf.process.tutorial.listener" ;
106
- String errorNoUserTaskListenerFound =
107
- "No class extending DefaultUserTaskListener found in package '" + packageName + "'. Unable to verify if User Task has correct Task Listener set." ;
107
+ String errorNoUserTaskListenerFound = "No class extending DefaultUserTaskListener found in package '"
108
+ + packageName + "'. Unable to verify if User Task has correct Task Listener set." ;
108
109
List <Class <? extends DefaultUserTaskListener >> userTaskListeners = Utils .getUserTaskListeners (packageName );
109
110
assertTrue (errorNoUserTaskListenerFound , !userTaskListeners .isEmpty ());
110
111
111
- String errorUserTaskIsMissingTaskListener =
112
- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
113
- + " is missing at least one Task Listener which extends DefaultUserTaskListener. Found classes to add which extend DefaultUserTaskListener: " + userTaskListeners .stream ().map (Class ::getSimpleName ).reduce ("" , (i , next ) -> i + next + " " );
114
- List <CamundaTaskListener > camundaTaskListeners = userTask .getExtensionElements ().getElements ().stream ()
115
- .filter (extensionElement -> extensionElement instanceof CamundaTaskListener )
112
+ String errorUserTaskIsMissingTaskListener = "User Task in process '" + processId + "' in file '" + filename
113
+ + " with name " + userTask .getOutgoing ()
114
+ + " is missing at least one Task Listener which extends DefaultUserTaskListener. Found classes to add which extend DefaultUserTaskListener: "
115
+ + userTaskListeners .stream ().map (Class ::getSimpleName ).reduce ("" , (i , next ) -> i + next + " " );
116
+ List <CamundaTaskListener > camundaTaskListeners = userTask
117
+ .getExtensionElements ().getElements ().stream ().filter (
118
+ extensionElement -> extensionElement instanceof CamundaTaskListener )
116
119
.map (extensionElement -> (CamundaTaskListener ) extensionElement )
117
- .filter (camundaTaskListener -> userTaskListeners .stream ().anyMatch (userTaskListener -> userTaskListener .getName ().equals (camundaTaskListener .getAttributeValue ("class" ))))
120
+ .filter (camundaTaskListener -> userTaskListeners .stream ().anyMatch (userTaskListener -> userTaskListener
121
+ .getName ().equals (camundaTaskListener .getAttributeValue ("class" ))))
118
122
.toList ();
119
123
assertTrue (errorUserTaskIsMissingTaskListener , !camundaTaskListeners .isEmpty ());
120
124
121
- List <Class <? extends DefaultUserTaskListener >> userTaskListenersInUserTask = userTaskListeners .stream ().filter (userTaskListener -> camundaTaskListeners .stream ().anyMatch (camundaTaskListener -> camundaTaskListener .getAttributeValue ("class" ).equals (userTaskListener .getName ()))).toList ();
122
- userTaskListenersInUserTask .forEach (userTaskListener -> assertEquals (Utils .errorMessageBeanMethod (userTaskListener ), 1 , Utils .countBeanMethods (userTaskListener )));
123
-
124
- Map <Class <? extends DefaultUserTaskListener >, List <String >> userTaskListenersWithErrors = userTaskListenersInUserTask .stream ().collect (Collectors .toMap (userTaskListener -> userTaskListener , this ::validateUserTaskListener ));
125
-
126
- String errorNoTaskListenerInUserTaskIsValid = "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing () + " is missing at least one valid UserTaskListener. Errors are: \n " ;
127
- errorNoTaskListenerInUserTaskIsValid += userTaskListenersWithErrors .keySet ().stream ().map (key -> formatErrors (key , userTaskListenersWithErrors .get (key ))).collect (Collectors .joining ());
128
-
129
- assertTrue (errorNoTaskListenerInUserTaskIsValid , userTaskListenersWithErrors .keySet ().stream ().anyMatch (userTaskListener -> userTaskListenersWithErrors .get (userTaskListener ).isEmpty ()));
125
+ List <Class <? extends DefaultUserTaskListener >> userTaskListenersInUserTask = userTaskListeners .stream ().filter (
126
+ userTaskListener -> camundaTaskListeners .stream ().anyMatch (camundaTaskListener -> camundaTaskListener
127
+ .getAttributeValue ("class" ).equals (userTaskListener .getName ())))
128
+ .toList ();
129
+ userTaskListenersInUserTask
130
+ .forEach (userTaskListener -> assertEquals (Utils .errorMessageBeanMethod (userTaskListener ), 1 ,
131
+ Utils .countBeanMethods (userTaskListener )));
132
+
133
+ Map <Class <? extends DefaultUserTaskListener >, List <String >> userTaskListenersWithErrors = userTaskListenersInUserTask
134
+ .stream ()
135
+ .collect (Collectors .toMap (userTaskListener -> userTaskListener , this ::validateUserTaskListener ));
136
+
137
+ String errorNoTaskListenerInUserTaskIsValid = "User Task in process '" + processId + "' in file '" + filename
138
+ + " with name " + userTask .getOutgoing ()
139
+ + " is missing at least one valid UserTaskListener. Errors are: \n " ;
140
+ errorNoTaskListenerInUserTaskIsValid += userTaskListenersWithErrors .keySet ().stream ()
141
+ .map (key -> formatErrors (key , userTaskListenersWithErrors .get (key ))).collect (Collectors .joining ());
142
+
143
+ assertTrue (errorNoTaskListenerInUserTaskIsValid , userTaskListenersWithErrors .keySet ().stream ()
144
+ .anyMatch (userTaskListener -> userTaskListenersWithErrors .get (userTaskListener ).isEmpty ()));
130
145
}
131
146
132
147
private Predicate <SequenceFlow > isFlowConnectingUserTaskAndExclusiveGateway (UserTask userTask )
133
148
{
134
- return flow -> flow .getTarget ().equals (userTask ) && flow .getSource () instanceof ExclusiveGateway && flow .getSource ().getName ().equals ("User Vote?" );
149
+ return flow -> flow .getTarget ().equals (userTask ) && flow .getSource () instanceof ExclusiveGateway
150
+ && flow .getSource ().getName ().equals ("User Vote?" );
135
151
}
136
152
137
153
private Predicate <SequenceFlow > hasCorrectConditionExpression ()
@@ -141,15 +157,16 @@ private Predicate<SequenceFlow> hasCorrectConditionExpression()
141
157
142
158
private Predicate <SequenceFlow > isFlowConnectingUserTaskAndSaveUserVoteServer (UserTask userTask )
143
159
{
144
- return flow -> flow .getSource ().equals (userTask ) && flow .getTarget () instanceof ServiceTask && flow .getTarget ().getName ().equals ("Save User Vote" );
160
+ return flow -> flow .getSource ().equals (userTask ) && flow .getTarget () instanceof ServiceTask
161
+ && flow .getTarget ().getName ().equals ("Save User Vote" );
145
162
}
146
163
147
164
private String formatErrors (Class <? extends DefaultUserTaskListener > userTaskListener , List <String > errors )
148
165
{
149
166
String formatted = "" ;
150
167
151
168
formatted += "Class: " + userTaskListener .getSimpleName () + "\n " ;
152
- formatted += " Errors:\n " + errors .stream ().reduce ("" , (i , next ) -> i + " " + next + "\n " );
169
+ formatted += " Errors:\n " + errors .stream ().reduce ("" , (i , next ) -> i + " " + next + "\n " );
153
170
154
171
return formatted ;
155
172
}
@@ -162,24 +179,26 @@ private List<String> validateUserTaskListener(Class<? extends DefaultUserTaskLis
162
179
List <String > errors = new ArrayList <>();
163
180
try
164
181
{
165
- Constructor <? extends DefaultUserTaskListener > constructor = userTaskListenerClass . getConstructor (
166
- ProcessPluginApi .class );
182
+ Constructor <? extends DefaultUserTaskListener > constructor = userTaskListenerClass
183
+ . getConstructor ( ProcessPluginApi .class );
167
184
168
185
ProcessPluginApi apiMock = Mockito .mock (ProcessPluginApi .class );
169
186
TaskHelper taskHelperMock = Mockito .mock (TaskHelper .class );
170
187
DelegateTask taskMock = Mockito .mock (DelegateTask .class );
171
188
QuestionnaireResponse questionnaireResponseMock = Mockito .mock (QuestionnaireResponse .class );
172
189
Variables variablesMock = Mockito .mock (Variables .class );
173
190
Task startTaskMock = Mockito .mock (Task .class );
174
- QuestionnaireResponse .QuestionnaireResponseItemComponent itemMock = Mockito .mock (QuestionnaireResponse .QuestionnaireResponseItemComponent .class );
191
+ QuestionnaireResponse .QuestionnaireResponseItemComponent itemMock = Mockito
192
+ .mock (QuestionnaireResponse .QuestionnaireResponseItemComponent .class );
175
193
176
194
String binaryQuestion = "test?" ;
177
195
178
196
Mockito .lenient ().when (apiMock .getVariables (any ())).thenReturn (variablesMock );
179
197
Mockito .lenient ().when (apiMock .getTaskHelper ()).thenReturn (taskHelperMock );
180
198
Mockito .lenient ().when (variablesMock .getStartTask ()).thenReturn (startTaskMock );
181
- Mockito .lenient ().when (taskHelperMock .getFirstInputParameterStringValue (startTaskMock , CODESYSTEM_VOTING_PROCESS ,
182
- CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION )).thenReturn (Optional .of (binaryQuestion ));
199
+ Mockito .lenient ().when (taskHelperMock .getFirstInputParameterStringValue (startTaskMock ,
200
+ CODESYSTEM_VOTING_PROCESS , CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
201
+ .thenReturn (Optional .of (binaryQuestion ));
183
202
Mockito .lenient ().when (questionnaireResponseMock .getItem ()).thenReturn (List .of (itemMock ));
184
203
Mockito .lenient ().when (itemMock .getLinkId ()).thenReturn (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION );
185
204
Mockito .lenient ().when (itemMock .getText ()).thenReturn ("foo" );
@@ -195,15 +214,21 @@ private List<String> validateUserTaskListener(Class<? extends DefaultUserTaskLis
195
214
.filter (invocation -> invocation .getMethod ().getName ().equals ("getFirstInputParameterStringValue" ))
196
215
.filter (invocation -> invocation .getArguments ()[0 ].equals (startTaskMock ))
197
216
.filter (invocation -> invocation .getArguments ()[1 ].equals (CODESYSTEM_VOTING_PROCESS ))
198
- .filter (invocation -> invocation .getArguments ()[2 ].equals (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
217
+ .filter (invocation -> invocation .getArguments ()[2 ]
218
+ .equals (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
199
219
.findFirst ();
200
- if (optionalInvocation .isEmpty ()) errors .add ("Expected one call to TaskHelper#getFirstInputParameterStringValue for Start Task and CodeSystem '" + CODESYSTEM_VOTING_PROCESS + "' and Code '" + CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION + "'" );
220
+ if (optionalInvocation .isEmpty ())
221
+ errors .add (
222
+ "Expected one call to TaskHelper#getFirstInputParameterStringValue for Start Task and CodeSystem '"
223
+ + CODESYSTEM_VOTING_PROCESS + "' and Code '"
224
+ + CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION + "'" );
201
225
202
226
optionalInvocation = Mockito .mockingDetails (itemMock ).getInvocations ().stream ()
203
227
.filter (invocation -> invocation .getMethod ().getName ().equals ("setText" ))
204
- .filter (invocation -> invocation .getArguments ()[0 ].equals (binaryQuestion ))
205
- .findFirst ();
206
- if (optionalInvocation .isEmpty ()) errors .add ("Expected one call to QuestionnaireResponseItemComponent#setText for the QuestionnaireResponseItemComponent with linkId 'binary-question'" );
228
+ .filter (invocation -> invocation .getArguments ()[0 ].equals (binaryQuestion )).findFirst ();
229
+ if (optionalInvocation .isEmpty ())
230
+ errors .add (
231
+ "Expected one call to QuestionnaireResponseItemComponent#setText for the QuestionnaireResponseItemComponent with linkId 'binary-question'" );
207
232
}
208
233
catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | InstantiationException e )
209
234
{
0 commit comments