package jnpf.dmsService; import jnpf.exception.DataException; import jnpf.flowable.entity.TemplateNodeEntity; import org.junit.jupiter.api.Test; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; class DmsQianpiyeNodeOrderTest { @Test void followsConnectionsDespiteReversedCreationTimesIdsAndXmlTaskOrder() { List nodes = DmsQianpiyeFlowFixtures.steps("node"); Collections.rotate(nodes, 3); assertEquals(List.of("node0", "node1", "node2", "node3", "node4", "node5", "node6", "node7"), codes(DmsQianpiyeNodeOrder.order(DmsQianpiyeFlowFixtures.version("v", "node").getFlowXml(), nodes))); } @Test void ordersBothBranchesBeforeTheirJoinAndIncludesTheOptionalTrainingStepOnce() { List nodes = DmsQianpiyeFlowFixtures.steps("node").subList(0, 5); String xml = """ """; assertEquals(List.of("node0", "node1", "node2", "node3", "node4"), codes(DmsQianpiyeNodeOrder.order(xml, nodes))); } @Test void handlesEncodedXmlAndLoopsWithoutDuplicatingSteps() { String xml = DmsQianpiyeFlowFixtures.linearXml("node0", "node1", "node2") .replace("", ""); assertEquals(List.of("node0", "node1", "node2"), codes(DmsQianpiyeNodeOrder.order( URLEncoder.encode(xml, StandardCharsets.UTF_8), DmsQianpiyeFlowFixtures.steps("node").subList(0, 3)))); } @Test void rejectsMissingOrInvalidConnectionsInsteadOfAssigningArbitraryStepNumbers() { List nodes = DmsQianpiyeFlowFixtures.steps("node"); assertThrows(DataException.class, () -> DmsQianpiyeNodeOrder.order(null, nodes)); assertThrows(DataException.class, () -> DmsQianpiyeNodeOrder.order("", nodes)); assertThrows(DataException.class, () -> DmsQianpiyeNodeOrder.order( "]>" + DmsQianpiyeFlowFixtures.version("v", "node").getFlowXml(), nodes)); assertThrows(DataException.class, () -> DmsQianpiyeNodeOrder.order( DmsQianpiyeFlowFixtures.linearXml("node0", "node1"), nodes)); } @Test void preservesGlobalFormMetadataWithoutMakingItAnApprovalStep() { List nodes = new ArrayList<>(DmsQianpiyeFlowFixtures.steps("node")); TemplateNodeEntity global = new TemplateNodeEntity(); global.setNodeCode("global"); global.setNodeType("global"); global.setFormId("form-id"); nodes.add(0, global); List ordered = DmsQianpiyeNodeOrder.order( DmsQianpiyeFlowFixtures.version("v", "node").getFlowXml(), nodes); assertEquals(global, ordered.getLast()); assertEquals(9, ordered.size()); } private List codes(List nodes) { return nodes.stream().map(TemplateNodeEntity::getNodeCode).toList(); } }