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<TemplateNodeEntity> newNodes = DmsQianpiyeFlowFixtures.steps("new");
|
List<TemplateNodeEntity> 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<Map<String, String>> steps = (List<Map<String, String>>) 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<String, Object> result = catalog(properties, workflow, forms).load();
|
List<Map<String, Object>> fields = (List<Map<String, Object>>) 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<String, Object> 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<Map<String, Object>> fields = (List<Map<String, Object>>) 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<String, Object> 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<String, Object> saved = catalog.loadForDocument("annex", "page.docx", false);
|
Map<String, Object> 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));
|
}
|
}
|