From 513a94ea9c642ba12d7674c2601bf12d575e1307 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 7 Feb 2017 14:48:03 +0100 Subject: [PATCH] First complete approval test for Strings story. Tested also notifications. --- .../midpoint/model/test/DummyTransport.java | 12 +- .../itemApproval/TaskCompleteListener.java | 4 + .../itemApproval/TaskDeleteListener.java | 74 ++++++++ .../processes/ItemApproval.bpmn20.xml | 2 + testing/story/pom.xml | 10 + .../midpoint/testing/story/TestStrings.java | 177 +++++++++++++++++- .../resources/common/system-configuration.xml | 108 +---------- .../test/resources/ctx-story-test-main.xml | 1 + .../resources/strings/users/barkeeper.xml | 1 + .../src/test/resources/strings/users/bob.xml | 1 + .../test/resources/strings/users/carla.xml | 1 + .../test/resources/strings/users/cheese.xml | 1 + .../src/test/resources/strings/users/chef.xml | 1 + .../test/resources/strings/users/elaine.xml | 1 + .../test/resources/strings/users/guybrush.xml | 1 + .../test/resources/strings/users/lechuck.xml | 1 + 16 files changed, 289 insertions(+), 107 deletions(-) create mode 100644 model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskDeleteListener.java diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/DummyTransport.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/DummyTransport.java index 402ec470453..9746c71625b 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/DummyTransport.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/DummyTransport.java @@ -89,7 +89,7 @@ public void clearMessages() { @Override public String getDefaultRecipientAddress(UserType recipient) { - return "dummyAddress"; + return recipient.getEmailAddress() != null ? recipient.getEmailAddress() : "dummyAddress"; } @Override @@ -104,6 +104,14 @@ public String debugDump() { @Override public String debugDump(int indent) { - return DebugUtil.debugDump(messages, indent); + StringBuilder sb = new StringBuilder(); + DebugUtil.indentDebugDump(sb, indent); + sb.append("(\n"); + for (Map.Entry> entry : messages.entrySet()) { + DebugUtil.debugDumpWithLabelLn(sb, entry.getKey(), entry.getValue(), indent + 1); + } + DebugUtil.indentDebugDump(sb, indent); + sb.append(")"); + return sb.toString(); } } \ No newline at end of file diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskCompleteListener.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskCompleteListener.java index c68fee05165..8c2c7793d8b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskCompleteListener.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskCompleteListener.java @@ -47,6 +47,7 @@ public class TaskCompleteListener implements TaskListener { private static final Trace LOGGER = TraceManager.getTrace(TaskCompleteListener.class); + private static final long serialVersionUID = 1L; @Override public void notify(DelegateTask delegateTask) { @@ -57,6 +58,9 @@ public void notify(DelegateTask delegateTask) { Task wfTask = ActivitiUtil.getTask(execution, opResult); ApprovalLevelType level = ActivitiUtil.getAndVerifyCurrentStage(execution, wfTask, true, prismContext); +// System.out.println("%%% Task " + delegateTask + " has been completed."); +// LOGGER.info("%%% Task {} has been completed", delegateTask); + new MidPointTaskListener().notify(delegateTask); MidPointPrincipal user; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskDeleteListener.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskDeleteListener.java new file mode 100644 index 00000000000..24a56b47be5 --- /dev/null +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/TaskDeleteListener.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.wf.impl.processes.itemApproval; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.WfContextUtil; +import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.security.api.SecurityUtil; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.wf.impl.processes.common.ActivitiUtil; +import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; +import com.evolveum.midpoint.wf.impl.processes.common.MidPointTaskListener; +import com.evolveum.midpoint.wf.util.ApprovalUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; +import org.activiti.engine.delegate.DelegateExecution; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import static com.evolveum.midpoint.wf.impl.processes.common.SpringApplicationContextHolder.*; +import static com.evolveum.midpoint.wf.impl.processes.itemApproval.ProcessVariableNames.LOOP_APPROVERS_IN_LEVEL_STOP; + +/** + * @author mederly + */ +public class TaskDeleteListener implements TaskListener { + + private static final Trace LOGGER = TraceManager.getTrace(TaskDeleteListener.class); + + private static final long serialVersionUID = 1L; + + @Override + public void notify(DelegateTask delegateTask) { + + // We could send a "task deleted" notification, if needed. + // In order to do this, task completion listener could create "wasCompleted" task variable (so we could know which + // tasks were completed and which simply deleted - the former ones should not get 'delete' notification twice!). + // And we would call new MidPointTaskListener().notify(delegateTask), and amend it to send a notification for + // deleted non-completed tasks. + + +// DelegateExecution execution = delegateTask.getExecution(); +// PrismContext prismContext = getPrismContext(); +// OperationResult opResult = new OperationResult(TaskDeleteListener.class.getName() + ".notify"); +// Task wfTask = ActivitiUtil.getTask(execution, opResult); +// //ApprovalLevelType level = ActivitiUtil.getAndVerifyCurrentStage(execution, wfTask, true, prismContext); +// +// System.out.println("%%% Task " + delegateTask + " is being deleted."); +// LOGGER.info("%%% Task {} is being deleted", delegateTask); +// +// System.out.println("%%% Variables: " + delegateTask.getVariables()); + + } + +} diff --git a/model/workflow-impl/src/main/resources/processes/ItemApproval.bpmn20.xml b/model/workflow-impl/src/main/resources/processes/ItemApproval.bpmn20.xml index 91751b5f2ba..3b2467c3598 100644 --- a/model/workflow-impl/src/main/resources/processes/ItemApproval.bpmn20.xml +++ b/model/workflow-impl/src/main/resources/processes/ItemApproval.bpmn20.xml @@ -128,6 +128,7 @@ + @@ -138,6 +139,7 @@ + diff --git a/testing/story/pom.xml b/testing/story/pom.xml index b37230f89ea..167ba77c7bb 100644 --- a/testing/story/pom.xml +++ b/testing/story/pom.xml @@ -102,6 +102,16 @@ workflow-impl 3.6-SNAPSHOT + + com.evolveum.midpoint.model + notifications-api + 3.6-SNAPSHOT + + + com.evolveum.midpoint.model + notifications-impl + 3.6-SNAPSHOT + com.evolveum.midpoint.model model-test diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java index 1af043fe765..697f1d80f05 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestStrings.java @@ -17,6 +17,8 @@ package com.evolveum.midpoint.testing.story; import com.evolveum.midpoint.model.api.WorkflowService; +import com.evolveum.midpoint.model.test.DummyTransport; +import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReference; @@ -32,7 +34,11 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.commons.collections4.MultiValuedMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; @@ -45,8 +51,7 @@ import static com.evolveum.midpoint.prism.util.PrismAsserts.assertReferenceValues; import static com.evolveum.midpoint.test.IntegrationTestTools.display; -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.*; /** * @@ -54,11 +59,13 @@ * */ +@SuppressWarnings("FieldCanBeLocal") @ContextConfiguration(locations = {"classpath:ctx-story-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestStrings extends AbstractStoryTest { @Autowired private WorkflowService workflowService; + @Autowired private DummyTransport dummyTransport; private static final String TEST_DIR = "src/test/resources/strings"; private static final String ORG_DIR = TEST_DIR + "/orgs"; @@ -131,6 +138,8 @@ public class TestStrings extends AbstractStoryTest { public static final String NS_STRINGS_EXT = "http://midpoint.evolveum.com/xml/ns/strings"; + private static final String DUMMY_WORK_ITEMS = "dummy:workItems"; + private static final String DUMMY_PROCESSES = "dummy:processes"; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { @@ -226,6 +235,47 @@ public void test100SimpleAssignmentStart() throws Exception { assertApprovalLevel(schema, 3, "Role approvers (all)", "P5D", 2); assertStage(wfTask, 1, 3, "Line managers", null); assertAssignee(workItem, userLechuckOid, userLechuckOid); + + List workItemMessages = dummyTransport.getMessages(DUMMY_WORK_ITEMS); + List processMessages = dummyTransport.getMessages(DUMMY_PROCESSES); + display("work items notifications", workItemMessages); + display("processes notifications", processMessages); + dummyTransport.clearMessages(); + + assertEquals("Wrong # of work items messages", 1, workItemMessages.size()); + assertMessage(workItemMessages.get(0), "lechuck@evolveum.com", "A new work item has been created", "Stage: Line managers (1/3)", "Assignee: lechuck"); + + assertEquals("Wrong # of process messages", 1, processMessages.size()); + assertMessage(processMessages.get(0), "administrator@evolveum.com", "Workflow process instance has been started", + "Process instance name: Assigning a-test-1 to bob", "Stage: Line managers (1/3)"); + } + + private void assertMessage(Message message, String recipient, String subject, String... texts) { + assertNotNull("No message for " + recipient, message); + assertEquals("Wrong # of recipients", 1, message.getTo().size()); + assertEquals("Wrong recipient", recipient, message.getTo().get(0)); + assertEquals("Wrong subject", subject, message.getSubject()); + for (String text : texts) { + if (!message.getBody().contains(text)) { + fail("Message body doesn't contain '" + text + "': " + message.getBody()); + } + } + } + + private MultiValuedMap sortByRecipients(Collection messages) { + MultiValuedMap rv = new ArrayListValuedHashMap<>(); + messages.forEach(m -> + m.getTo().forEach( + to -> rv.put(to, m))); + return rv; + } + + private Map sortByRecipientsSingle(Collection messages) { + Map rv = new HashMap<>(); + messages.forEach(m -> + m.getTo().forEach( + to -> rv.put(to, m))); + return rv; } @Test @@ -254,7 +304,19 @@ public void test102SimpleAssignmentApproveByLechuck() throws Exception { assertStage(wfTask, 2, 3, "Security", null); assertTriggers(wfTask, 2); - // TODO check events + List workItemMessages = dummyTransport.getMessages(DUMMY_WORK_ITEMS); + List processMessages = dummyTransport.getMessages(DUMMY_PROCESSES); + display("work items notifications", workItemMessages); + display("processes notifications", processMessages); + dummyTransport.clearMessages(); + + assertEquals("Wrong # of work items messages", 3, workItemMessages.size()); + assertNull("process messages", processMessages); + + Map sorted = sortByRecipientsSingle(workItemMessages); + assertMessage(sorted.get("lechuck@evolveum.com"), "lechuck@evolveum.com", "Work item has been completed", "Work item: Approve assigning a-test-1 to bob", "Stage: Line managers (1/3)", "Assignee: lechuck", "Result: APPROVED"); + assertMessage(sorted.get("elaine@evolveum.com"), "elaine@evolveum.com", "A new work item has been created", "Work item: Approve assigning a-test-1 to bob", "Stage: Security (2/3)", "Assignee: elaine"); + assertMessage(sorted.get("barkeeper@evolveum.com"), "barkeeper@evolveum.com", "A new work item has been created", "Work item: Approve assigning a-test-1 to bob", "Stage: Security (2/3)", "Assignee: barkeeper"); } @Test @@ -280,9 +342,114 @@ public void test104SimpleAssignmentApproveByAdministrator() throws Exception { assertStage(wfTask, 3, 3, "Role approvers (all)", null); assertTriggers(wfTask, 2); - Map workItemsMap = createWorkItemsMap(workItems); + Map workItemsMap = sortByOriginalAssignee(workItems); assertNotNull("chef is not an approver", workItemsMap.get(userChefOid)); assertNotNull("cheese is not an approver", workItemsMap.get(userCheeseOid)); + + List workItemMessages = dummyTransport.getMessages(DUMMY_WORK_ITEMS); + List processMessages = dummyTransport.getMessages(DUMMY_PROCESSES); + display("work items notifications", workItemMessages); + display("processes notifications", processMessages); + dummyTransport.clearMessages(); + + assertEquals("Wrong # of work items messages", 3, workItemMessages.size()); + assertNull("process messages", processMessages); + + Map sorted = sortByRecipientsSingle(workItemMessages); + assertMessage(sorted.get("elaine@evolveum.com"), "elaine@evolveum.com", "Work item has been completed", "Work item: Approve assigning a-test-1 to bob", "Stage: Security (2/3)", "Assignee: elaine", "Result: APPROVED"); + assertMessage(sorted.get("cheese@evolveum.com"), "cheese@evolveum.com", "A new work item has been created", "Work item: Approve assigning a-test-1 to bob", "Role approvers (all) (3/3)", "Assignee: cheese"); + assertMessage(sorted.get("chef@evolveum.com"), "chef@evolveum.com", "A new work item has been created", "Work item: Approve assigning a-test-1 to bob", "Role approvers (all) (3/3)", "Assignee: chef"); + } + + @Test + public void test106SimpleAssignmentApproveByCheese() throws Exception { + final String TEST_NAME = "test106SimpleAssignmentApproveByCheese"; + TestUtil.displayTestTile(this, TEST_NAME); + Task task = createTask(TestStrings.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + // GIVEN + login(userAdministrator); + List workItems = getWorkItems(task, result); + Map workItemsMap = sortByOriginalAssignee(workItems); + + // WHEN + workflowService.completeWorkItem(workItemsMap.get(userCheeseOid).getWorkItemId(), true, "OK. Cheese.", null, result); + + // THEN + workItems = getWorkItems(task, result); + workItems.forEach(wi -> display("Work item after 3rd approval", wi)); + assertEquals("Wrong # of work items on level 3", 1, workItems.size()); + workItemsMap = sortByOriginalAssignee(workItems); + PrismObject wfTask = getTask(workItems.get(0).getTaskRef().getOid()); + display("wfTask after 3rd approval", wfTask); + + assertStage(wfTask, 3, 3, "Role approvers (all)", null); + assertTriggers(wfTask, 1); + + assertNotNull("chef is not an approver", workItemsMap.get(userChefOid)); + + List workItemMessages = dummyTransport.getMessages(DUMMY_WORK_ITEMS); + List processMessages = dummyTransport.getMessages(DUMMY_PROCESSES); + display("work items notifications", workItemMessages); + display("processes notifications", processMessages); + dummyTransport.clearMessages(); + + assertEquals("Wrong # of work items messages", 1, workItemMessages.size()); + assertNull("process messages", processMessages); + + Map sorted = sortByRecipientsSingle(workItemMessages); + assertMessage(sorted.get("cheese@evolveum.com"), "cheese@evolveum.com", "Work item has been completed", "Work item: Approve assigning a-test-1 to bob", "Role approvers (all) (3/3)", "Assignee: cheese", "Result: APPROVED"); + } + + @Test + public void test108SimpleAssignmentApproveByChef() throws Exception { + final String TEST_NAME = "test108SimpleAssignmentApproveByChef"; + TestUtil.displayTestTile(this, TEST_NAME); + Task task = createTask(TestStrings.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + // GIVEN + login(userAdministrator); + List workItems = getWorkItems(task, result); + String taskOid = workItems.get(0).getTaskRef().getOid(); + Map workItemsMap = sortByOriginalAssignee(workItems); + + // WHEN + login(getUser(userChefOid)); + workflowService.completeWorkItem(workItemsMap.get(userChefOid).getWorkItemId(), true, "OK. Chef.", null, result); + + // THEN + login(userAdministrator); + workItems = getWorkItems(task, result); + workItems.forEach(wi -> display("Work item after 4th approval", wi)); + assertEquals("Wrong # of work items on level 3", 0, workItems.size()); + PrismObject wfTask = getTask(taskOid); + display("wfTask after 4th approval", wfTask); + + Task parent = getParentTask(wfTask, result); + waitForTaskFinish(parent, true, 60000); + +// assertStage(wfTask, 3, 3, "Role approvers (all)", null); + assertTriggers(wfTask, 0); + + List workItemMessages = dummyTransport.getMessages(DUMMY_WORK_ITEMS); + List processMessages = dummyTransport.getMessages(DUMMY_PROCESSES); + display("work items notifications", workItemMessages); + display("processes notifications", processMessages); + dummyTransport.clearMessages(); + + assertEquals("Wrong # of work items messages", 1, workItemMessages.size()); + assertEquals("Wrong # of process messages", 1, processMessages.size()); + + Map sorted = sortByRecipientsSingle(workItemMessages); + assertMessage(sorted.get("chef@evolveum.com"), "chef@evolveum.com", "Work item has been completed", "Work item: Approve assigning a-test-1 to bob", "Role approvers (all) (3/3)", "Assignee: chef", "Result: APPROVED"); + assertMessage(processMessages.get(0), "administrator@evolveum.com", "Workflow process instance has finished", "Process instance name: Assigning a-test-1 to bob", "Result: APPROVED"); + } + + private Task getParentTask(PrismObject task, OperationResult result) + throws SchemaException, ObjectNotFoundException { + return taskManager.getTaskByIdentifier(task.asObjectable().getParent(), result); } private void assertTriggers(PrismObject wfTask, int count) { @@ -346,7 +513,7 @@ protected PrismReference ref(ObjectReferenceType ort) { return ref(Collections.singletonList(ort)); } - protected Map createWorkItemsMap(Collection workItems) { + protected Map sortByOriginalAssignee(Collection workItems) { Map rv = new HashMap<>(); workItems.forEach(wi -> rv.put(wi.getOriginalAssigneeRef().getOid(), wi)); return rv; diff --git a/testing/story/src/test/resources/common/system-configuration.xml b/testing/story/src/test/resources/common/system-configuration.xml index 735363256a3..da8026b88f1 100644 --- a/testing/story/src/test/resources/common/system-configuration.xml +++ b/testing/story/src/test/resources/common/system-configuration.xml @@ -37,107 +37,15 @@ - - - - - - - - - - - - - - - - - - recipient@evolveum.com - - dummy:accountPasswordNotifier - - - - - - recipient@evolveum.com - - dummy:userPasswordNotifier - - - - success - - - recipient@evolveum.com - - dummy:simpleAccountNotifier-SUCCESS - - - - failure - - - recipient@evolveum.com - - dummy:simpleAccountNotifier-FAILURE - - - - add - success - - - recipient@evolveum.com - - dummy:simpleAccountNotifier-ADD-SUCCESS - - - - delete - success - - - recipient@evolveum.com - - dummy:simpleAccountNotifier-DELETE-SUCCESS - - - - - - recipient@evolveum.com - - dummy:simpleUserNotifier - - - - - add - - - - - recipient@evolveum.com - - dummy:simpleUserNotifier-ADD - - - - - delete - - - - - recipient@evolveum.com - - dummy:simpleUserNotifier-DELETE - - + + workItemEvent + dummy:workItems + + + workflowProcessEvent + dummy:processes + target/mail-notifications.log diff --git a/testing/story/src/test/resources/ctx-story-test-main.xml b/testing/story/src/test/resources/ctx-story-test-main.xml index c5c505a7fb8..6b553c21363 100644 --- a/testing/story/src/test/resources/ctx-story-test-main.xml +++ b/testing/story/src/test/resources/ctx-story-test-main.xml @@ -38,6 +38,7 @@ + diff --git a/testing/story/src/test/resources/strings/users/barkeeper.xml b/testing/story/src/test/resources/strings/users/barkeeper.xml index 222c0a7040c..cd7a8407605 100644 --- a/testing/story/src/test/resources/strings/users/barkeeper.xml +++ b/testing/story/src/test/resources/strings/users/barkeeper.xml @@ -44,6 +44,7 @@ Horridly Scarred Barkeep Barkeeper Scumm + barkeeper@evolveum.com a123456 diff --git a/testing/story/src/test/resources/strings/users/bob.xml b/testing/story/src/test/resources/strings/users/bob.xml index 3fdf210beb3..672ce981cf1 100644 --- a/testing/story/src/test/resources/strings/users/bob.xml +++ b/testing/story/src/test/resources/strings/users/bob.xml @@ -25,4 +25,5 @@ Ghost Pirate Bob Bob + bob@evolveum.com diff --git a/testing/story/src/test/resources/strings/users/carla.xml b/testing/story/src/test/resources/strings/users/carla.xml index 68cf1a1c4b2..23f6b7a12c0 100644 --- a/testing/story/src/test/resources/strings/users/carla.xml +++ b/testing/story/src/test/resources/strings/users/carla.xml @@ -33,4 +33,5 @@ Carla the Swordmaster Carla + carla@evolveum.com diff --git a/testing/story/src/test/resources/strings/users/cheese.xml b/testing/story/src/test/resources/strings/users/cheese.xml index 0bcf8722212..aaf9b883544 100644 --- a/testing/story/src/test/resources/strings/users/cheese.xml +++ b/testing/story/src/test/resources/strings/users/cheese.xml @@ -81,6 +81,7 @@ Ignatius Cheese Ignatius Cheese + cheese@evolveum.com a123456 diff --git a/testing/story/src/test/resources/strings/users/chef.xml b/testing/story/src/test/resources/strings/users/chef.xml index 16a86cc313e..537c313e83e 100644 --- a/testing/story/src/test/resources/strings/users/chef.xml +++ b/testing/story/src/test/resources/strings/users/chef.xml @@ -54,6 +54,7 @@ Scumm Bar Chef Chef Scumm + chef@evolveum.com a123456 diff --git a/testing/story/src/test/resources/strings/users/elaine.xml b/testing/story/src/test/resources/strings/users/elaine.xml index fb96bd01450..af35894341d 100644 --- a/testing/story/src/test/resources/strings/users/elaine.xml +++ b/testing/story/src/test/resources/strings/users/elaine.xml @@ -69,6 +69,7 @@ Elaine Marley Governor + elaine@evolveum.com a123456 diff --git a/testing/story/src/test/resources/strings/users/guybrush.xml b/testing/story/src/test/resources/strings/users/guybrush.xml index 338846e5604..13ab1ed32a1 100644 --- a/testing/story/src/test/resources/strings/users/guybrush.xml +++ b/testing/story/src/test/resources/strings/users/guybrush.xml @@ -32,4 +32,5 @@ Guybrush Threepwood Guybrush Threepwood + guybrush@evolveum.com diff --git a/testing/story/src/test/resources/strings/users/lechuck.xml b/testing/story/src/test/resources/strings/users/lechuck.xml index 4a87d518177..1a8c79ea822 100644 --- a/testing/story/src/test/resources/strings/users/lechuck.xml +++ b/testing/story/src/test/resources/strings/users/lechuck.xml @@ -27,4 +27,5 @@ Captain LeChuck LeChuck + lechuck@evolveum.com