Skip to content

Commit a9162be

Browse files
committed
Add integration test for duplicate
1 parent a2d82c3 commit a9162be

2 files changed

Lines changed: 73 additions & 8 deletions

File tree

Kitodo/src/main/java/org/kitodo/production/forms/WorkflowForm.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,15 @@ public class WorkflowForm extends BaseForm {
8383
private Integer roleId;
8484
private boolean migration;
8585
private static final String MIGRATION_FORM_PATH = MessageFormat.format(REDIRECT_PATH,"system");
86+
private ExternalContext externalContext;
8687

8788
/**
8889
* Constructor.
8990
*/
9091
public WorkflowForm() {
9192
super.setLazyDTOModel(new LazyDTOModel(ServiceManager.getWorkflowService()));
93+
this.externalContext = FacesContext.getCurrentInstance() != null
94+
? FacesContext.getCurrentInstance().getExternalContext() : null;
9295
}
9396

9497
/**
@@ -118,6 +121,10 @@ public void setWorkflowStatus(WorkflowStatus workflowStatus) {
118121
this.workflowStatus = workflowStatus;
119122
}
120123

124+
public void setExternalContext(ExternalContext externalContext) {
125+
this.externalContext = externalContext; // Allow test injection
126+
}
127+
121128
/**
122129
* Read XML for file chosen out of the select list.
123130
*/
@@ -420,10 +427,9 @@ public String duplicate(Integer itemId) {
420427
this.svgDiagram = IOUtils.toString(svgInputStream, StandardCharsets.UTF_8);
421428
}
422429
// Store duplicated workflow in Flash scope
423-
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
424-
externalContext.getFlash().put("duplicatedWorkflow", this.workflow);
425-
externalContext.getFlash().put("xmlDiagram", this.xmlDiagram);
426-
externalContext.getFlash().put("svgDiagram", this.svgDiagram);
430+
storeInFlashScope("duplicatedWorkflow", this.workflow);
431+
storeInFlashScope("xmlDiagram", this.xmlDiagram);
432+
storeInFlashScope("svgDiagram", this.svgDiagram);
427433

428434
return workflowEditPath + "&id=0";
429435

@@ -492,6 +498,12 @@ public void load(int id) {
492498
}
493499
}
494500

501+
private void storeInFlashScope(String key, Object value) {
502+
if (externalContext != null) {
503+
externalContext.getFlash().put(key, value);
504+
}
505+
}
506+
495507
/**
496508
* Get role id.
497509
*

Kitodo/src/test/java/org/kitodo/production/forms/WorkflowFormIT.java

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@
1111

1212
package org.kitodo.production.forms;
1313

14-
import static org.junit.jupiter.api.Assertions.assertEquals;
15-
import static org.junit.jupiter.api.Assertions.assertFalse;
16-
import static org.junit.jupiter.api.Assertions.assertTrue;
17-
14+
import java.io.File;
1815
import java.io.IOException;
16+
import java.net.URI;
17+
import java.nio.charset.StandardCharsets;
1918
import java.util.Arrays;
2019
import java.util.List;
2120

21+
import org.apache.commons.io.FileUtils;
2222
import org.junit.jupiter.api.AfterAll;
2323
import org.junit.jupiter.api.BeforeAll;
2424
import org.junit.jupiter.api.Test;
2525
import org.kitodo.MockDatabase;
26+
import org.kitodo.config.ConfigCore;
2627
import org.kitodo.data.database.beans.DataEditorSetting;
2728
import org.kitodo.data.database.beans.Task;
2829
import org.kitodo.data.database.beans.Template;
@@ -35,12 +36,25 @@
3536
import org.kitodo.production.services.ServiceManager;
3637
import org.kitodo.production.services.data.DataEditorSettingService;
3738
import org.kitodo.production.services.data.TaskService;
39+
import org.mockito.ArgumentCaptor;
40+
41+
import javax.faces.context.ExternalContext;
42+
import javax.faces.context.FacesContext;
43+
import javax.faces.context.Flash;
44+
45+
import static org.mockito.Mockito.*;
46+
import static org.junit.jupiter.api.Assertions.assertEquals;
47+
import static org.junit.jupiter.api.Assertions.assertFalse;
48+
import static org.junit.jupiter.api.Assertions.assertNotNull;
49+
import static org.junit.jupiter.api.Assertions.assertTrue;
3850

3951
public class WorkflowFormIT {
4052

4153
private WorkflowForm currentWorkflowForm = new WorkflowForm();
4254
private static final TaskService taskService = ServiceManager.getTaskService();
4355
private static final DataEditorSettingService dataEditorSettingService = ServiceManager.getDataEditorSettingService();
56+
private ExternalContext mockExternalContext;
57+
private Flash mockFlash;
4458

4559
/**
4660
* Setup Database and start elasticsearch.
@@ -122,6 +136,45 @@ public void shouldUpdateTemplateTasksAndDeleteOnlyAffectedDataEditorSettings() t
122136
assertEquals(0.6f, dataEditorSettingForTaskOfSecondTemplate.get(0).getGalleryWidth(), 0);
123137
}
124138

139+
@Test
140+
public void shouldDuplicateWorkflowAndStoreInFlash() throws Exception {
141+
// Arrange: Mock ExternalContext and Flash
142+
mockExternalContext = mock(ExternalContext.class);
143+
mockFlash = mock(Flash.class);
144+
currentWorkflowForm.setExternalContext(mockExternalContext);
145+
146+
when(mockExternalContext.getFlash()).thenReturn(mockFlash); // Ensure Flash scope is returned
147+
148+
// Act: Call the duplicate method
149+
String resultUrl = currentWorkflowForm.duplicate(1);
150+
151+
//Assert: Ensure redirection to the edit page
152+
assertTrue(resultUrl.contains("&id=0"));
153+
154+
//Capture arguments that were passed to Flash
155+
ArgumentCaptor<Workflow> workflowCaptor = ArgumentCaptor.forClass(Workflow.class);
156+
ArgumentCaptor<String> xmlCaptor = ArgumentCaptor.forClass(String.class);
157+
ArgumentCaptor<String> svgCaptor = ArgumentCaptor.forClass(String.class);
158+
159+
// ✅ Verify and capture actual method calls
160+
verify(mockFlash, times(1)).put(eq("duplicatedWorkflow"), workflowCaptor.capture());
161+
verify(mockFlash, times(1)).put(eq("xmlDiagram"), xmlCaptor.capture());
162+
verify(mockFlash, times(1)).put(eq("svgDiagram"), svgCaptor.capture());
163+
164+
// ✅ Assert the captured workflow is not null and has expected values
165+
Workflow duplicatedWorkflow = workflowCaptor.getValue();
166+
String xmlWorkflow = xmlCaptor.getValue();
167+
assertNotNull(duplicatedWorkflow, "Duplicated workflow should not be null");
168+
assertEquals("gateway-test1", duplicatedWorkflow.getTitle().replaceFirst("_[^_]*$", ""),
169+
"Expected duplicated workflow title");
170+
171+
String diagramPath = ConfigCore.getKitodoDiagramDirectory() + "gateway-test1" + ".bpmn20.xml";
172+
String data = FileUtils.readFileToString(new File(diagramPath), StandardCharsets.UTF_8);
173+
assertEquals(data, xmlWorkflow, "Expected duplicated workflow title");
174+
assertNotNull(xmlCaptor.getValue(), "XML Diagram should be stored");
175+
assertNotNull(svgCaptor.getValue(), "SVG Diagram should be stored");
176+
}
177+
125178
private Task createAndSaveTemplateTask(TaskStatus taskStatus, int ordering, Template template) throws DataException {
126179
Task task = new Task();
127180
task.setProcessingStatus(taskStatus);

0 commit comments

Comments
 (0)