package jnpf.dmsService; import jnpf.base.entity.VisualdevEntity; import jnpf.flowable.WorkFlowApi; import jnpf.flowable.entity.TemplateJsonEntity; import jnpf.flowable.entity.TemplateNodeEntity; import jnpf.onlinedev.VisualdevOnlineApi; import org.junit.jupiter.api.Test; import java.util.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class DmsQianpiyeCatalogServiceTest { @Test void alignsNewAndRevisionStepsByConnectionOrderInsteadOfDatabaseOrder() { WorkFlowApi workflow = mock(WorkFlowApi.class); VisualdevOnlineApi forms = mock(VisualdevOnlineApi.class); DmsQianpiyeProperties properties = new DmsQianpiyeProperties(); properties.setFlows(List.of(flow("new", "new-template"), flow("revision", "revision-template"))); when(workflow.getFlowIdsByTemplate("new-template")).thenReturn( List.of(DmsQianpiyeFlowFixtures.version("new-version", "new"))); when(workflow.getFlowIdsByTemplate("revision-template")).thenReturn( List.of(DmsQianpiyeFlowFixtures.version("revision-version", "revision"))); List newNodes = DmsQianpiyeFlowFixtures.steps("new"); List revisionNodes = DmsQianpiyeFlowFixtures.steps("revision"); Collections.rotate(newNodes, 3); Collections.reverse(revisionNodes); when(workflow.getNodesByFlowId("new-version")).thenReturn(newNodes); when(workflow.getNodesByFlowId("revision-version")).thenReturn(revisionNodes); List> steps = (List>) catalog(properties, workflow, forms) .load().get("workflowSteps"); assertEquals(DmsQianpiyeFlowFixtures.STEP_NAMES, steps.stream().map(step -> step.get("label")).toList()); assertEquals(List.of("start", "approve-1", "approve-2", "approve-3", "approve-4", "approve-5", "approve-6", "approve-7"), steps.stream().map(step -> step.get("key")).toList()); } @Test void onlyReturnsTextFieldsSharedByTheNewAndRevisionFlowVersions() { WorkFlowApi workflow = mock(WorkFlowApi.class); VisualdevOnlineApi forms = mock(VisualdevOnlineApi.class); DmsQianpiyeProperties properties = new DmsQianpiyeProperties(); properties.setFlows(List.of(flow("new", "new-template"), flow("revision", "revision-template"), flow("additional", "additional-template"))); when(workflow.getFlowIdsByTemplate("new-template")).thenReturn(List.of(version("new-version", "1.0"))); when(workflow.getFlowIdsByTemplate("revision-template")).thenReturn(List.of(version("revision-version", "1.0"))); when(workflow.getFlowIdsByTemplate("additional-template")).thenReturn(List.of(version("additional-version", "1.0"))); when(workflow.getNodesByFlowId("new-version")).thenReturn(List.of(node("new-form"))); when(workflow.getNodesByFlowId("revision-version")).thenReturn(List.of(node("revision-form"))); when(workflow.getNodesByFlowId("additional-version")).thenReturn(List.of(node("additional-form"))); when(forms.getFormConfig("new-form")).thenReturn(form("{\"fields\":[" + "{\"__vModel__\":\"documentName\",\"__config__\":{\"label\":\"文件名称\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"newOnly\",\"__config__\":{\"label\":\"新增专属\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"file\",\"__config__\":{\"label\":\"附件\",\"jnpfKey\":\"uploadFile\"}}," + "{\"__vModel__\":\"details\",\"__config__\":{\"label\":\"明细\",\"jnpfKey\":\"table\",\"children\":[" + "{\"__vModel__\":\"name\",\"__config__\":{\"label\":\"名称\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"quantity\",\"__config__\":{\"label\":\"数量\",\"jnpfKey\":\"input\"}}]}}]}")); when(forms.getFormConfig("revision-form")).thenReturn(form("{\"fields\":[" + "{\"__vModel__\":\"documentName\",\"__config__\":{\"label\":\"文件名称\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"revisionOnly\",\"__config__\":{\"label\":\"修订专属\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"image\",\"__config__\":{\"label\":\"图片\",\"jnpfKey\":\"uploadImg\"}}," + "{\"__vModel__\":\"details\",\"__config__\":{\"label\":\"明细\",\"jnpfKey\":\"table\",\"children\":[" + "{\"__vModel__\":\"name\",\"__config__\":{\"label\":\"名称\",\"jnpfKey\":\"input\"}}," + "{\"__vModel__\":\"quantity\",\"__config__\":{\"label\":\"数量\",\"jnpfKey\":\"input\"}}]}}]}")); Map result = catalog(properties, workflow, forms).load(); List> fields = (List>) result.get("formFields"); assertEquals(3, fields.size()); assertEquals(Set.of("documentName", "details.name", "details.quantity"), fields.stream().map(field -> field.get("key")).collect(java.util.stream.Collectors.toSet())); assertTrue(fields.stream().allMatch(field -> String.valueOf(field.get("tag")).startsWith("dms.qianpiye.form."))); assertTrue(fields.stream().allMatch(field -> "common".equals(field.get("formId")))); assertTrue(fields.stream().noneMatch(field -> field.containsKey("source") || field.containsKey("reason") || field.containsKey("supported"))); Map rowField = fields.stream().filter(field -> "details.name".equals(field.get("key"))) .findFirst().orElseThrow(); assertEquals("details", rowField.get("table")); assertEquals("name", rowField.get("column")); } @Test void excludesFieldsWhoseDefinitionsDoNotMatchAcrossTheTwoFlows() { WorkFlowApi workflow = mock(WorkFlowApi.class); VisualdevOnlineApi forms = mock(VisualdevOnlineApi.class); DmsQianpiyeProperties properties = new DmsQianpiyeProperties(); properties.setFlows(List.of(flow("new", "new-template"), flow("revision", "revision-template"))); when(workflow.getFlowIdsByTemplate("new-template")).thenReturn(List.of(version("new-version", "1.0"))); when(workflow.getFlowIdsByTemplate("revision-template")).thenReturn(List.of(version("revision-version", "1.0"))); when(workflow.getNodesByFlowId("new-version")).thenReturn(List.of(node("new-form"))); when(workflow.getNodesByFlowId("revision-version")).thenReturn(List.of(node("revision-form"))); when(forms.getFormConfig("new-form")).thenReturn(form("{\"fields\":[{\"__vModel__\":\"status\",\"__config__\":{\"label\":\"状态\",\"jnpfKey\":\"input\"}}]}")); when(forms.getFormConfig("revision-form")).thenReturn(form("{\"fields\":[{\"__vModel__\":\"status\",\"__config__\":{\"label\":\"状态\",\"jnpfKey\":\"select\",\"options\":[{\"id\":\"1\"}]}}]}")); List> fields = (List>) catalog(properties, workflow, forms) .load().get("formFields"); assertTrue(fields.isEmpty()); } @Test void returnsTheCurrentPublishedVersionsForTheNewAndRevisionFlows() { WorkFlowApi workflow = mock(WorkFlowApi.class); VisualdevOnlineApi forms = mock(VisualdevOnlineApi.class); DmsQianpiyeProperties properties = new DmsQianpiyeProperties(); DmsQianpiyeProperties.Flow newFlow = flow("new", "new-template"); DmsQianpiyeProperties.Flow revisionFlow = flow("revision", "revision-template"); properties.setFlows(List.of(newFlow, revisionFlow)); when(workflow.getFlowIdsByTemplate("new-template")).thenReturn(List.of(version("new-version", "2.0"))); when(workflow.getFlowIdsByTemplate("revision-template")).thenReturn(List.of(version("revision-version", "3.0"))); when(workflow.getNodesByFlowId(anyString())).thenReturn(Collections.emptyList()); Map catalog = catalog(properties, workflow, forms).load(); assertEquals("new-version", catalog.get("newFlowVersionId")); assertEquals("revision-version", catalog.get("revisionFlowVersionId")); } @Test void usesTheVersionsSavedInTheQianpiyeDocxUnlessTheUserRefreshes() { WorkFlowApi workflow = mock(WorkFlowApi.class); VisualdevOnlineApi forms = mock(VisualdevOnlineApi.class); DmsQianpiyeDocxPropertiesReader reader = mock(DmsQianpiyeDocxPropertiesReader.class); DmsQianpiyeProperties properties = new DmsQianpiyeProperties(); properties.setFlows(List.of(flow("new", "new-template"), flow("revision", "revision-template"))); TemplateJsonEntity oldNew = version("new-old", "1.0"); oldNew.setState(0); TemplateJsonEntity currentNew = version("new-current", "2.0"); TemplateJsonEntity oldRevision = version("revision-old", "1.0"); oldRevision.setState(0); TemplateJsonEntity currentRevision = version("revision-current", "2.0"); when(workflow.getFlowIdsByTemplate("new-template")).thenReturn(List.of(oldNew, currentNew)); when(workflow.getFlowIdsByTemplate("revision-template")).thenReturn(List.of(oldRevision, currentRevision)); when(workflow.getNodesByFlowId(anyString())).thenReturn(Collections.emptyList()); when(reader.read("annex", "page.docx")).thenReturn(Map.of( "DMS_NEW_FLOW_VERSION_ID", "new-old", "DMS_EDIT_FLOW_VERSION_ID", "revision-old")); DmsQianpiyeCatalogService catalog = new DmsQianpiyeCatalogService(properties, workflow, forms, reader); Map saved = catalog.loadForDocument("annex", "page.docx", false); Map refreshed = catalog.loadForDocument("annex", "page.docx", true); assertEquals("new-old", saved.get("newFlowVersionId")); assertEquals("revision-old", saved.get("revisionFlowVersionId")); assertEquals("new-current", refreshed.get("newFlowVersionId")); assertEquals("revision-current", refreshed.get("revisionFlowVersionId")); verify(reader).read("annex", "page.docx"); } private DmsQianpiyeProperties.Flow flow(String key, String templateId) { DmsQianpiyeProperties.Flow result = new DmsQianpiyeProperties.Flow(); result.setKey(key); result.setLabel(key); result.setTemplateId(templateId); return result; } private TemplateJsonEntity version(String id, String number) { TemplateJsonEntity result = new TemplateJsonEntity(); result.setId(id); result.setState(1); result.setVersion(number); return result; } private TemplateNodeEntity node(String formId) { TemplateNodeEntity result = new TemplateNodeEntity(); result.setId(formId + "-node"); result.setNodeType("custom"); result.setFormId(formId); return result; } private VisualdevEntity form(String formData) { VisualdevEntity result = new VisualdevEntity(); result.setFormData(formData); return result; } private DmsQianpiyeCatalogService catalog(DmsQianpiyeProperties properties, WorkFlowApi workflow, VisualdevOnlineApi forms) { return new DmsQianpiyeCatalogService(properties, workflow, forms, mock(DmsQianpiyeDocxPropertiesReader.class)); } }