Skip to content

Commit 467c618

Browse files
authored
Add the MailDaemon implementation to fix issue #12 (#18)
* Add the MailDaemon implementation to fix issue #12. * Add factory testing for mail daemon implementation.
1 parent 43cd9e3 commit 467c618

File tree

18 files changed

+466
-105
lines changed

18 files changed

+466
-105
lines changed

bpmn-process/src/main/java/com/jongsoft/finance/bpmn/delegate/PropertyConversionDelegate.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@
33
import jakarta.inject.Singleton;
44
import org.camunda.bpm.engine.delegate.DelegateExecution;
55
import org.camunda.bpm.engine.delegate.JavaDelegate;
6+
import org.slf4j.Logger;
67

78
import java.util.Properties;
89

10+
import static org.slf4j.LoggerFactory.getLogger;
11+
912
@Singleton
1013
public class PropertyConversionDelegate implements JavaDelegate {
1114

15+
private static final Logger log = getLogger(PropertyConversionDelegate.class);
16+
1217
@Override
1318
public void execute(DelegateExecution execution) {
14-
Properties converted = new Properties();
19+
log.debug("{}: Converting the provided local properties into a PropertyMap.",
20+
execution.getCurrentActivityName());
21+
22+
var converted = new Properties();
1523

1624
execution.getVariableNamesLocal()
1725
.stream()
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.jongsoft.finance.bpmn.delegate.user;
2+
3+
import com.jongsoft.finance.providers.UserProvider;
4+
import jakarta.inject.Singleton;
5+
import org.camunda.bpm.engine.delegate.DelegateExecution;
6+
import org.camunda.bpm.engine.delegate.JavaDelegate;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
@Singleton
11+
public class UsernameAvailableDelegate implements JavaDelegate {
12+
13+
private static final String USERNAME = "username";
14+
private static final Logger log = LoggerFactory.getLogger(UsernameAvailableDelegate.class);
15+
16+
private final UserProvider userProvider;
17+
18+
public UsernameAvailableDelegate(UserProvider userProvider) {
19+
this.userProvider = userProvider;
20+
}
21+
22+
@Override
23+
public void execute(DelegateExecution execution) throws Exception {
24+
log.debug("{}: Validating if the username is still available {}",
25+
execution.getCurrentActivityName(),
26+
execution.getVariableLocal(USERNAME));
27+
28+
execution.setVariableLocal("usernameAvailable",
29+
userProvider.available((String) execution.getVariableLocal(USERNAME)));
30+
}
31+
}
Lines changed: 68 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_11iudjt" targetNamespace="http://jong-soft.org/fintrack/user/register" exporter="Camunda Modeler" exporterVersion="3.7.3">
3-
<bpmn:process id="RegisterUserAccount" name="Register User Account" isExecutable="true" camunda:versionTag="1.0.0" camunda:historyTimeToLive="P1D">
2+
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_11iudjt" targetNamespace="http://jong-soft.org/fintrack/user/register" exporter="Camunda Modeler" exporterVersion="5.17.0">
3+
<bpmn:process id="RegisterUserAccount" name="Register User Account" isExecutable="true" camunda:versionTag="1.1.0" camunda:historyTimeToLive="P1D">
44
<bpmn:startEvent id="se_register_account">
55
<bpmn:outgoing>sf_locate_account</bpmn:outgoing>
66
</bpmn:startEvent>
@@ -15,11 +15,11 @@
1515
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${usernameAvailable}</bpmn:conditionExpression>
1616
</bpmn:sequenceFlow>
1717
<bpmn:sequenceFlow id="sf_wait_for_mail" sourceRef="st_create_account" targetRef="st_create_reconcile_account" />
18-
<bpmn:sendTask id="st_send_welcome_mail" name="Send welcome mail" camunda:asyncBefore="true" camunda:expression="${mailDaemon.send(username, &#39;user-registered&#39;, mailProperties)}">
18+
<bpmn:sendTask id="st_send_welcome_mail" name="Send welcome mail" camunda:expression="${mailDaemon.send(username, &#39;user-registered&#39;, mailProperties)}">
1919
<bpmn:incoming>SequenceFlow_1q5pqa4</bpmn:incoming>
2020
<bpmn:outgoing>SequenceFlow_102zsei</bpmn:outgoing>
2121
</bpmn:sendTask>
22-
<bpmn:serviceTask id="st_create_account" name="Create account" camunda:asyncBefore="true" camunda:delegateExpression="${createUserDelegate}">
22+
<bpmn:serviceTask id="st_create_account" name="Create account" camunda:delegateExpression="${createUserDelegate}">
2323
<bpmn:extensionElements>
2424
<camunda:inputOutput>
2525
<camunda:inputParameter name="username">${username}</camunda:inputParameter>
@@ -30,40 +30,37 @@
3030
<bpmn:incoming>sf_account_free</bpmn:incoming>
3131
<bpmn:outgoing>sf_wait_for_mail</bpmn:outgoing>
3232
</bpmn:serviceTask>
33-
<bpmn:serviceTask id="tk_locate_account" name="Locate existing by username" camunda:expression="${userProvider.available(username)}" camunda:resultVariable="usernameAvailable">
33+
<bpmn:serviceTask id="tk_locate_account" name="Locate existing by username" camunda:delegateExpression="${usernameAvailableDelegate}">
34+
<bpmn:extensionElements>
35+
<camunda:inputOutput>
36+
<camunda:inputParameter name="username">${username}</camunda:inputParameter>
37+
<camunda:outputParameter name="usernameAvailable">${usernameAvailable}</camunda:outputParameter>
38+
</camunda:inputOutput>
39+
</bpmn:extensionElements>
3440
<bpmn:incoming>sf_locate_account</bpmn:incoming>
3541
<bpmn:outgoing>sf_decide_exists</bpmn:outgoing>
3642
</bpmn:serviceTask>
37-
<bpmn:sequenceFlow id="SequenceFlow_191lcjy" sourceRef="te_mail_delay" targetRef="st_convert_mail_properties" />
38-
<bpmn:intermediateCatchEvent id="te_mail_delay" name="Delay timer" camunda:asyncBefore="true">
39-
<bpmn:incoming>Flow_0nf51zz</bpmn:incoming>
40-
<bpmn:outgoing>SequenceFlow_191lcjy</bpmn:outgoing>
41-
<bpmn:timerEventDefinition>
42-
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">PT5S</bpmn:timeDuration>
43-
</bpmn:timerEventDefinition>
44-
</bpmn:intermediateCatchEvent>
45-
<bpmn:endEvent id="EndEvent_08ovygi" name="Cannot register">
43+
<bpmn:endEvent id="register_failed" name="Cannot register">
4644
<bpmn:incoming>sf_account_taken</bpmn:incoming>
4745
<bpmn:errorEventDefinition errorRef="Error_1kt8lal" />
4846
</bpmn:endEvent>
49-
<bpmn:sequenceFlow id="sf_account_taken" name="no" sourceRef="eg_account_exists" targetRef="EndEvent_08ovygi" />
47+
<bpmn:sequenceFlow id="sf_account_taken" name="no" sourceRef="eg_account_exists" targetRef="register_failed" />
5048
<bpmn:endEvent id="ee_register_complete" name="Finished">
5149
<bpmn:incoming>SequenceFlow_102zsei</bpmn:incoming>
5250
</bpmn:endEvent>
5351
<bpmn:sequenceFlow id="SequenceFlow_102zsei" sourceRef="st_send_welcome_mail" targetRef="ee_register_complete" />
5452
<bpmn:sequenceFlow id="SequenceFlow_1q5pqa4" sourceRef="st_convert_mail_properties" targetRef="st_send_welcome_mail" />
55-
<bpmn:serviceTask id="st_convert_mail_properties" name="Prepare mail contents" camunda:asyncBefore="true" camunda:delegateExpression="${propertyConversionDelegate}">
53+
<bpmn:serviceTask id="st_convert_mail_properties" name="Prepare mail contents" camunda:delegateExpression="${propertyConversionDelegate}">
5654
<bpmn:extensionElements>
5755
<camunda:inputOutput>
58-
<camunda:inputParameter name="user">${currentUserProvider.currentUser()}</camunda:inputParameter>
56+
<camunda:inputParameter name="user">${username}</camunda:inputParameter>
5957
<camunda:outputParameter name="mailProperties">${propertyConversionResult}</camunda:outputParameter>
6058
</camunda:inputOutput>
61-
<camunda:executionListener delegateExpression="${startProcessListener}" event="start" />
6259
</bpmn:extensionElements>
63-
<bpmn:incoming>SequenceFlow_191lcjy</bpmn:incoming>
60+
<bpmn:incoming>Flow_0nf51zz</bpmn:incoming>
6461
<bpmn:outgoing>SequenceFlow_1q5pqa4</bpmn:outgoing>
6562
</bpmn:serviceTask>
66-
<bpmn:serviceTask id="st_create_reconcile_account" name="Create Reconcile account" camunda:asyncBefore="true" camunda:delegateExpression="${processAccountCreationDelegate}">
63+
<bpmn:serviceTask id="st_create_reconcile_account" name="Create Reconcile account" camunda:delegateExpression="${processAccountCreationDelegate}">
6764
<bpmn:extensionElements>
6865
<camunda:inputOutput>
6966
<camunda:inputParameter name="account">${accountJson}</camunda:inputParameter>
@@ -73,55 +70,11 @@
7370
<bpmn:incoming>sf_wait_for_mail</bpmn:incoming>
7471
<bpmn:outgoing>Flow_0nf51zz</bpmn:outgoing>
7572
</bpmn:serviceTask>
76-
<bpmn:sequenceFlow id="Flow_0nf51zz" sourceRef="st_create_reconcile_account" targetRef="te_mail_delay" />
73+
<bpmn:sequenceFlow id="Flow_0nf51zz" sourceRef="st_create_reconcile_account" targetRef="st_convert_mail_properties" />
7774
</bpmn:process>
7875
<bpmn:error id="Error_1kt8lal" name="DuplicateAccountException" errorCode="400" />
7976
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
8077
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="RegisterUserAccount">
81-
<bpmndi:BPMNEdge id="SequenceFlow_1ai6in3_di" bpmnElement="sf_account_taken">
82-
<di:waypoint x="505" y="249" />
83-
<di:waypoint x="505" y="336" />
84-
<di:waypoint x="650" y="336" />
85-
<bpmndi:BPMNLabel>
86-
<dc:Bounds x="514" y="290" width="13" height="14" />
87-
</bpmndi:BPMNLabel>
88-
</bpmndi:BPMNEdge>
89-
<bpmndi:BPMNEdge id="SequenceFlow_1if5hip_di" bpmnElement="sf_wait_for_mail">
90-
<di:waypoint x="700" y="113" />
91-
<di:waypoint x="770" y="113" />
92-
</bpmndi:BPMNEdge>
93-
<bpmndi:BPMNEdge id="SequenceFlow_1mnsywe_di" bpmnElement="sf_account_free">
94-
<di:waypoint x="505" y="199" />
95-
<di:waypoint x="505" y="113" />
96-
<di:waypoint x="600" y="113" />
97-
<bpmndi:BPMNLabel>
98-
<dc:Bounds x="512" y="153" width="17" height="14" />
99-
</bpmndi:BPMNLabel>
100-
</bpmndi:BPMNEdge>
101-
<bpmndi:BPMNEdge id="SequenceFlow_182ji34_di" bpmnElement="sf_decide_exists">
102-
<di:waypoint x="401" y="224" />
103-
<di:waypoint x="480" y="224" />
104-
</bpmndi:BPMNEdge>
105-
<bpmndi:BPMNEdge id="SequenceFlow_0bv6skg_di" bpmnElement="sf_locate_account">
106-
<di:waypoint x="217" y="224" />
107-
<di:waypoint x="301" y="224" />
108-
</bpmndi:BPMNEdge>
109-
<bpmndi:BPMNEdge id="SequenceFlow_1q5pqa4_di" bpmnElement="SequenceFlow_1q5pqa4">
110-
<di:waypoint x="1124" y="113" />
111-
<di:waypoint x="1197" y="113" />
112-
</bpmndi:BPMNEdge>
113-
<bpmndi:BPMNEdge id="SequenceFlow_102zsei_di" bpmnElement="SequenceFlow_102zsei">
114-
<di:waypoint x="1297" y="113" />
115-
<di:waypoint x="1358" y="113" />
116-
</bpmndi:BPMNEdge>
117-
<bpmndi:BPMNEdge id="SequenceFlow_191lcjy_di" bpmnElement="SequenceFlow_191lcjy">
118-
<di:waypoint x="965" y="113" />
119-
<di:waypoint x="1024" y="113" />
120-
</bpmndi:BPMNEdge>
121-
<bpmndi:BPMNEdge id="Flow_0nf51zz_di" bpmnElement="Flow_0nf51zz">
122-
<di:waypoint x="870" y="113" />
123-
<di:waypoint x="929" y="113" />
124-
</bpmndi:BPMNEdge>
12578
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="se_register_account">
12679
<dc:Bounds x="181" y="206" width="36" height="36" />
12780
</bpmndi:BPMNShape>
@@ -131,39 +84,73 @@
13184
<dc:Bounds x="528" y="206" width="73" height="14" />
13285
</bpmndi:BPMNLabel>
13386
</bpmndi:BPMNShape>
87+
<bpmndi:BPMNShape id="SendTask_00cdvq2_di" bpmnElement="st_send_welcome_mail">
88+
<dc:Bounds x="1113" y="73" width="100" height="80" />
89+
</bpmndi:BPMNShape>
90+
<bpmndi:BPMNShape id="ServiceTask_0wbbt3m_di" bpmnElement="st_create_account">
91+
<dc:Bounds x="600" y="73" width="100" height="80" />
92+
</bpmndi:BPMNShape>
13493
<bpmndi:BPMNShape id="ServiceTask_01rat76_di" bpmnElement="tk_locate_account">
13594
<dc:Bounds x="301" y="184" width="100" height="80" />
13695
</bpmndi:BPMNShape>
137-
<bpmndi:BPMNShape id="EndEvent_0maa9fz_di" bpmnElement="EndEvent_08ovygi">
96+
<bpmndi:BPMNShape id="EndEvent_0maa9fz_di" bpmnElement="register_failed">
13897
<dc:Bounds x="650" y="318" width="36" height="36" />
13998
<bpmndi:BPMNLabel>
14099
<dc:Bounds x="630" y="361" width="77" height="14" />
141100
</bpmndi:BPMNLabel>
142101
</bpmndi:BPMNShape>
143-
<bpmndi:BPMNShape id="SendTask_00cdvq2_di" bpmnElement="st_send_welcome_mail">
144-
<dc:Bounds x="1197" y="73" width="100" height="80" />
145-
</bpmndi:BPMNShape>
146-
<bpmndi:BPMNShape id="IntermediateCatchEvent_16rxar0_di" bpmnElement="te_mail_delay">
147-
<dc:Bounds x="929" y="95" width="36" height="36" />
148-
<bpmndi:BPMNLabel>
149-
<dc:Bounds x="919" y="138" width="57" height="14" />
150-
</bpmndi:BPMNLabel>
151-
</bpmndi:BPMNShape>
152102
<bpmndi:BPMNShape id="EndEvent_0v11pke_di" bpmnElement="ee_register_complete">
153-
<dc:Bounds x="1358" y="95" width="36" height="36" />
103+
<dc:Bounds x="1274" y="95" width="36" height="36" />
154104
<bpmndi:BPMNLabel>
155-
<dc:Bounds x="1355" y="138" width="42" height="14" />
105+
<dc:Bounds x="1271" y="138" width="42" height="14" />
156106
</bpmndi:BPMNLabel>
157107
</bpmndi:BPMNShape>
158108
<bpmndi:BPMNShape id="ServiceTask_0qfxdyj_di" bpmnElement="st_convert_mail_properties">
159-
<dc:Bounds x="1024" y="73" width="100" height="80" />
109+
<dc:Bounds x="940" y="73" width="100" height="80" />
160110
</bpmndi:BPMNShape>
161111
<bpmndi:BPMNShape id="Activity_0wg14v9_di" bpmnElement="st_create_reconcile_account">
162112
<dc:Bounds x="770" y="73" width="100" height="80" />
163113
</bpmndi:BPMNShape>
164-
<bpmndi:BPMNShape id="ServiceTask_0wbbt3m_di" bpmnElement="st_create_account">
165-
<dc:Bounds x="600" y="73" width="100" height="80" />
166-
</bpmndi:BPMNShape>
114+
<bpmndi:BPMNEdge id="SequenceFlow_0bv6skg_di" bpmnElement="sf_locate_account">
115+
<di:waypoint x="217" y="224" />
116+
<di:waypoint x="301" y="224" />
117+
</bpmndi:BPMNEdge>
118+
<bpmndi:BPMNEdge id="SequenceFlow_182ji34_di" bpmnElement="sf_decide_exists">
119+
<di:waypoint x="401" y="224" />
120+
<di:waypoint x="480" y="224" />
121+
</bpmndi:BPMNEdge>
122+
<bpmndi:BPMNEdge id="SequenceFlow_1mnsywe_di" bpmnElement="sf_account_free">
123+
<di:waypoint x="505" y="199" />
124+
<di:waypoint x="505" y="113" />
125+
<di:waypoint x="600" y="113" />
126+
<bpmndi:BPMNLabel>
127+
<dc:Bounds x="512" y="153" width="17" height="14" />
128+
</bpmndi:BPMNLabel>
129+
</bpmndi:BPMNEdge>
130+
<bpmndi:BPMNEdge id="SequenceFlow_1if5hip_di" bpmnElement="sf_wait_for_mail">
131+
<di:waypoint x="700" y="113" />
132+
<di:waypoint x="770" y="113" />
133+
</bpmndi:BPMNEdge>
134+
<bpmndi:BPMNEdge id="SequenceFlow_1ai6in3_di" bpmnElement="sf_account_taken">
135+
<di:waypoint x="505" y="249" />
136+
<di:waypoint x="505" y="336" />
137+
<di:waypoint x="650" y="336" />
138+
<bpmndi:BPMNLabel>
139+
<dc:Bounds x="514" y="290" width="13" height="14" />
140+
</bpmndi:BPMNLabel>
141+
</bpmndi:BPMNEdge>
142+
<bpmndi:BPMNEdge id="SequenceFlow_102zsei_di" bpmnElement="SequenceFlow_102zsei">
143+
<di:waypoint x="1213" y="113" />
144+
<di:waypoint x="1274" y="113" />
145+
</bpmndi:BPMNEdge>
146+
<bpmndi:BPMNEdge id="SequenceFlow_1q5pqa4_di" bpmnElement="SequenceFlow_1q5pqa4">
147+
<di:waypoint x="1040" y="113" />
148+
<di:waypoint x="1113" y="113" />
149+
</bpmndi:BPMNEdge>
150+
<bpmndi:BPMNEdge id="Flow_0nf51zz_di" bpmnElement="Flow_0nf51zz">
151+
<di:waypoint x="870" y="113" />
152+
<di:waypoint x="940" y="113" />
153+
</bpmndi:BPMNEdge>
167154
</bpmndi:BPMNPlane>
168155
</bpmndi:BPMNDiagram>
169156
</bpmn:definitions>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.jongsoft.finance.bpmn;
2+
3+
import com.jongsoft.finance.bpmn.process.ProcessExtension;
4+
import com.jongsoft.finance.bpmn.process.RuntimeContext;
5+
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
6+
import org.assertj.core.api.Assertions;
7+
import org.camunda.bpm.engine.variable.Variables;
8+
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.api.Test;
10+
11+
@MicronautTest
12+
@ProcessExtension
13+
@DisplayName("Account registration feature")
14+
public class AccountRegistrationIT {
15+
16+
@Test
17+
@DisplayName("Register with already known username")
18+
void registerAlreadyKnown(RuntimeContext runtimeContext) {
19+
runtimeContext
20+
.execute(
21+
"RegisterUserAccount",
22+
Variables.createVariables()
23+
.putValue("username", "test-user"))
24+
.verifyCompleted()
25+
.verifyErrorCompletion();
26+
}
27+
28+
@Test
29+
@DisplayName("Register with new username")
30+
void registerNewUser(RuntimeContext runtimeContext) {
31+
runtimeContext
32+
.withoutUser()
33+
.execute(
34+
"RegisterUserAccount",
35+
Variables.createVariables()
36+
.putValue("username", "new-user@local")
37+
.putValue("passwordHash", "password-hash"))
38+
.verifyCompleted()
39+
.verifySuccess();
40+
41+
runtimeContext.verifyMailSent("new-user@local", "user-registered", assertion ->
42+
assertion.hasSize(1)
43+
.anySatisfy((key, value) -> {
44+
Assertions.assertThat(key).isEqualTo("user");
45+
Assertions.assertThat(value).isEqualTo("new-user@local");
46+
}));
47+
}
48+
}

bpmn-process/src/test/java/com/jongsoft/finance/bpmn/BudgetAnalysisIT.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@ void budgetWithoutDeviation(RuntimeContext context) {
5353
context.execute("budget_analysis", Variables.createVariables()
5454
.putValue("id", 1L)
5555
.putValue("scheduled", "2019-01-01"))
56-
.verifyCompleted()
5756
.<Boolean>yankVariables("deviates", value ->
5857
value.hasSize(2)
59-
.allMatch(a-> !a));
60-
58+
.allMatch(a-> !a))
59+
.verifyCompleted();
6160
}
6261

6362
@Test

bpmn-process/src/test/java/com/jongsoft/finance/bpmn/process/HistoricProcessExecution.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,34 @@ public <Y> HistoricProcessExecution yankVariable(String variableName, Consumer<Y
4848
return this;
4949
}
5050

51+
public HistoricProcessExecution verifySuccess() {
52+
var successEndEvent = processEngine.getHistoryService()
53+
.createHistoricActivityInstanceQuery()
54+
.processInstanceId(processInstance.getId())
55+
.activityType("noneEndEvent")
56+
.singleResult();
57+
58+
Assertions.assertThat(successEndEvent)
59+
.as("Process '%s' not completed successfully", processInstance.getProcessDefinitionKey())
60+
.isNotNull();
61+
62+
return this;
63+
}
64+
65+
public HistoricProcessExecution verifyErrorCompletion() {
66+
var successEndEvent = processEngine.getHistoryService()
67+
.createHistoricActivityInstanceQuery()
68+
.processInstanceId(processInstance.getId())
69+
.activityType("errorEndEvent")
70+
.singleResult();
71+
72+
Assertions.assertThat(successEndEvent)
73+
.as("Process '%s' not completed with error", processInstance.getProcessDefinitionKey())
74+
.isNotNull();
75+
76+
return this;
77+
}
78+
5179
@Override
5280
public HistoricProcessExecution verifyCompleted() {
5381
Assertions.assertThat(processInstance.getEndTime())

0 commit comments

Comments
 (0)