package jnpf.elnController;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import jnpf.base.ActionResult;
|
import jnpf.base.vo.PageListVO;
|
import jnpf.elnEntity.formula.ElnFormulaForms;
|
import jnpf.elnEntity.formula.ElnFormulaVos;
|
import jnpf.elnFormula.FormulaFunction;
|
import jnpf.elnService.formula.ElnFormulaCatalogService;
|
import jnpf.elnService.formula.FormulaPreviewService;
|
import jnpf.elnService.formula.FormulaValidationService;
|
import jnpf.util.context.SpringContext;
|
import org.junit.BeforeClass;
|
import org.junit.Test;
|
import org.springframework.context.support.StaticApplicationContext;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PutMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import java.lang.reflect.Method;
|
import java.util.Collections;
|
import java.util.List;
|
|
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertNotEquals;
|
import static org.junit.Assert.assertSame;
|
|
public class ElnFormulaCatalogControllerTest {
|
|
@BeforeClass
|
public static void setUpSpringContext() {
|
SpringContext.setApplicationContext(new StaticApplicationContext());
|
}
|
|
@Test
|
public void exposesAllFormulaCatalogRoutes() throws Exception {
|
assertEquals("/formulaCatalog",
|
ElnFormulaCatalogController.class.getAnnotation(RequestMapping.class).value()[0]);
|
assertGet("list", "", ElnFormulaForms.Query.class);
|
assertPost("create", "", ElnFormulaForms.Create.class);
|
assertPost("createDraft", "/drafts", ElnFormulaForms.CreateDraft.class);
|
assertGet("detail", "/{id}", String.class);
|
assertGet("templateReferences", "/{id}/templateReferences",
|
String.class, ElnFormulaForms.ReferenceQuery.class);
|
assertPut("updateDefinition", "/{id}", String.class, ElnFormulaForms.UpdateDefinition.class);
|
assertGet("functions", "/functions");
|
assertPost("validate", "/validate", ElnFormulaForms.Validate.class);
|
assertPost("preview", "/preview", ElnFormulaForms.Preview.class);
|
assertPost("createVersion", "/{id}/versions", String.class, ElnFormulaForms.CreateVersion.class);
|
assertPut("updateVersion", "/versions/{versionId}", String.class, ElnFormulaForms.UpdateVersion.class);
|
assertPost("preRelease", "/versions/{versionId}/preRelease", String.class);
|
assertPost("publish", "/versions/{versionId}/publish", String.class);
|
assertPost("cancel", "/versions/{versionId}/cancel", String.class, ElnFormulaForms.Reason.class);
|
assertPost("switchCurrent", "/{id}/currentVersion", String.class, ElnFormulaForms.SwitchCurrent.class);
|
assertPost("enable", "/{id}/enable", String.class, ElnFormulaForms.Reason.class);
|
assertPost("disable", "/{id}/disable", String.class, ElnFormulaForms.Reason.class);
|
}
|
|
@Test
|
public void wrapsPageAndForwardsTrimmedCatalogValues() {
|
StubCatalog catalog = new StubCatalog();
|
ElnFormulaVos.ListItem item = new ElnFormulaVos.ListItem();
|
item.setId("formula-1");
|
catalog.page = new Page<ElnFormulaVos.ListItem>(2, 10, 21)
|
.setRecords(Collections.singletonList(item));
|
StubPreview preview = new StubPreview();
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, preview);
|
ElnFormulaForms.Query query = new ElnFormulaForms.Query();
|
query.setCurrentPage(2);
|
query.setPageSize(10);
|
query.setKeyword(" 公式 ");
|
query.setBizEnabled(" enabled ");
|
ElnFormulaForms.Create create = new ElnFormulaForms.Create();
|
create.setGongshiMingcheng(" 公式 ");
|
create.setYewuYongtu(" 用途 ");
|
create.setBiaodashi(" amount + 1 ");
|
create.setJieguoLeixing(" DECIMAL ");
|
|
ActionResult<PageListVO<ElnFormulaVos.ListItem>> result = controller.list(query);
|
controller.create(create);
|
controller.detail(" formula-1 ");
|
|
assertEquals(Integer.valueOf(200), result.getCode());
|
assertEquals("formula-1", result.getData().getList().get(0).getId());
|
assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage());
|
assertEquals(Integer.valueOf(21), result.getData().getPagination().getTotal());
|
assertEquals("公式", catalog.query.getKeyword());
|
assertEquals("enabled", catalog.query.getBizEnabled());
|
assertEquals("公式", catalog.create.getGongshiMingcheng());
|
assertEquals("amount + 1", catalog.create.getBiaodashi());
|
assertEquals("DECIMAL", catalog.create.getJieguoLeixing());
|
assertEquals("formula-1", catalog.detailId);
|
}
|
|
@Test
|
public void wrapsTemplateReferencePageAndForwardsTrimmedQuery() {
|
StubCatalog catalog = new StubCatalog();
|
ElnFormulaVos.ReferenceSummary item = new ElnFormulaVos.ReferenceSummary();
|
item.setTemplateId("template-21");
|
catalog.referencePage = new Page<ElnFormulaVos.ReferenceSummary>(2, 20, 41)
|
.setRecords(Collections.singletonList(item));
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(
|
catalog, new StubPreview());
|
ElnFormulaForms.ReferenceQuery query = new ElnFormulaForms.ReferenceQuery();
|
query.setCurrentPage(2);
|
query.setPageSize(20);
|
query.setKeyword(" 模板 ");
|
|
ActionResult<PageListVO<ElnFormulaVos.ReferenceSummary>> result =
|
controller.templateReferences(" formula-1 ", query);
|
|
assertEquals(Integer.valueOf(200), result.getCode());
|
assertEquals("template-21", result.getData().getList().get(0).getTemplateId());
|
assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage());
|
assertEquals(Integer.valueOf(41), result.getData().getPagination().getTotal());
|
assertEquals("formula-1", catalog.referenceFormulaId);
|
assertEquals("模板", catalog.referenceQuery.getKeyword());
|
}
|
|
@Test
|
public void rejectsInvalidTemplateReferencePaginationBeforeCallingService() {
|
StubCatalog catalog = new StubCatalog();
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(
|
catalog, new StubPreview());
|
ElnFormulaForms.ReferenceQuery query = new ElnFormulaForms.ReferenceQuery();
|
query.setCurrentPage(0);
|
|
ActionResult<PageListVO<ElnFormulaVos.ReferenceSummary>> result =
|
controller.templateReferences("formula-1", query);
|
|
assertNotEquals(Integer.valueOf(200), result.getCode());
|
assertEquals(0, catalog.calls);
|
}
|
|
@Test
|
public void delegatesDraftCreationWithTrimmedDefinitionAndParameterValues() {
|
StubCatalog catalog = new StubCatalog();
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, new StubPreview());
|
ElnFormulaForms.CreateDraft draft = new ElnFormulaForms.CreateDraft();
|
draft.setGongshiMingcheng(" 草稿公式 ");
|
ElnFormulaForms.Parameter parameter = new ElnFormulaForms.Parameter();
|
parameter.setCanshuMingcheng(" 样品量 ");
|
parameter.setShujuLeixing(" DECIMAL ");
|
draft.setParameters(Collections.singletonList(parameter));
|
|
controller.createDraft(draft);
|
|
assertEquals("草稿公式", catalog.createDraft.getGongshiMingcheng());
|
assertEquals("样品量", catalog.createDraft.getParameters().get(0).getCanshuMingcheng());
|
assertEquals("DECIMAL", catalog.createDraft.getParameters().get(0).getShujuLeixing());
|
}
|
|
@Test
|
public void delegatesStatelessEndpointsAndTrimsSlotCodes() {
|
StubCatalog catalog = new StubCatalog();
|
StubPreview preview = new StubPreview();
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, preview);
|
ElnFormulaForms.Validate validate = new ElnFormulaForms.Validate();
|
validate.setBiaodashi(" amount ");
|
validate.setJieguoLeixing(" DECIMAL ");
|
ElnFormulaForms.Parameter slot = new ElnFormulaForms.Parameter();
|
slot.setCanshuBianma(" amount ");
|
slot.setCanshuMingcheng(" 金额 ");
|
slot.setShujuLeixing(" DECIMAL ");
|
validate.setParameters(Collections.singletonList(slot));
|
ElnFormulaForms.Preview previewForm = new ElnFormulaForms.Preview();
|
previewForm.setBiaodashi(" true ");
|
previewForm.setJieguoLeixing(" BOOLEAN ");
|
|
controller.functions();
|
controller.validate(validate);
|
controller.preview(previewForm);
|
|
assertEquals(1, preview.functionCalls);
|
assertSame(validate, preview.validationForm);
|
assertSame(previewForm, preview.previewForm);
|
assertEquals("amount", slot.getCanshuBianma());
|
assertEquals("金额", slot.getCanshuMingcheng());
|
assertEquals("DECIMAL", slot.getShujuLeixing());
|
assertEquals("amount", validate.getBiaodashi());
|
assertEquals("BOOLEAN", previewForm.getJieguoLeixing());
|
assertEquals(0, catalog.calls);
|
}
|
|
@Test
|
public void delegatesLifecycleWithoutDuplicatingServicePermissions() {
|
StubCatalog catalog = new StubCatalog();
|
ElnFormulaCatalogController controller = new ElnFormulaCatalogController(catalog, new StubPreview());
|
ElnFormulaForms.Reason reason = new ElnFormulaForms.Reason();
|
reason.setReason(" 变更 ");
|
ElnFormulaForms.SwitchCurrent current = new ElnFormulaForms.SwitchCurrent();
|
current.setVersionId(" version-2 ");
|
current.setReason(" 切换 ");
|
|
controller.preRelease(" version-1 ");
|
controller.publish(" version-1 ");
|
controller.cancel(" version-1 ", reason);
|
controller.switchCurrent(" formula-1 ", current);
|
controller.enable(" formula-1 ", reason);
|
controller.disable(" formula-1 ", reason);
|
|
assertEquals("version-1", catalog.preRelease);
|
assertEquals("version-1", catalog.publish);
|
assertEquals("version-1:变更", catalog.cancel);
|
assertEquals("formula-1:version-2:切换", catalog.current);
|
assertEquals("formula-1:变更", catalog.enable);
|
assertEquals("formula-1:变更", catalog.disable);
|
}
|
|
private static void assertGet(String name, String path, Class<?>... types) throws Exception {
|
Method method = ElnFormulaCatalogController.class.getMethod(name, types);
|
assertEquals(path, first(method.getAnnotation(GetMapping.class).value()));
|
}
|
|
private static void assertPost(String name, String path, Class<?>... types) throws Exception {
|
Method method = ElnFormulaCatalogController.class.getMethod(name, types);
|
assertEquals(path, first(method.getAnnotation(PostMapping.class).value()));
|
}
|
|
private static void assertPut(String name, String path, Class<?>... types) throws Exception {
|
Method method = ElnFormulaCatalogController.class.getMethod(name, types);
|
assertEquals(path, first(method.getAnnotation(PutMapping.class).value()));
|
}
|
|
private static String first(String[] paths) {
|
return paths.length == 0 ? "" : paths[0];
|
}
|
|
private static final class StubPreview implements FormulaPreviewService {
|
private int functionCalls;
|
private ElnFormulaForms.Validate validationForm;
|
private ElnFormulaForms.Preview previewForm;
|
|
@Override
|
public List<FormulaFunction> functions() {
|
functionCalls++;
|
return Collections.emptyList();
|
}
|
|
@Override
|
public FormulaValidationService.ValidationResult validate(ElnFormulaForms.Validate form) {
|
validationForm = form;
|
return new FormulaValidationService.ValidationResult(
|
Collections.emptyList(), "latex", null);
|
}
|
|
@Override
|
public ElnFormulaVos.Preview preview(ElnFormulaForms.Preview form) {
|
previewForm = form;
|
return new ElnFormulaVos.Preview();
|
}
|
}
|
|
private static final class StubCatalog implements ElnFormulaCatalogService {
|
private int calls;
|
private IPage<ElnFormulaVos.ListItem> page = new Page<>();
|
private IPage<ElnFormulaVos.ReferenceSummary> referencePage = new Page<>();
|
private ElnFormulaForms.Query query;
|
private ElnFormulaForms.ReferenceQuery referenceQuery;
|
private String referenceFormulaId;
|
private ElnFormulaForms.Create create;
|
private ElnFormulaForms.CreateDraft createDraft;
|
private String detailId;
|
private String preRelease;
|
private String publish;
|
private String cancel;
|
private String current;
|
private String enable;
|
private String disable;
|
|
@Override public ElnFormulaVos.Detail create(ElnFormulaForms.Create form) {
|
calls++; create = form; return new ElnFormulaVos.Detail();
|
}
|
@Override public ElnFormulaVos.Detail createDraft(ElnFormulaForms.CreateDraft form) {
|
calls++; createDraft = form; return new ElnFormulaVos.Detail();
|
}
|
@Override public ElnFormulaVos.Detail updateDefinition(String formulaId,
|
ElnFormulaForms.UpdateDefinition form) {
|
calls++; return new ElnFormulaVos.Detail();
|
}
|
@Override public IPage<ElnFormulaVos.ListItem> page(ElnFormulaForms.Query query) {
|
calls++; this.query = query; return page;
|
}
|
@Override public ElnFormulaVos.Detail detail(String formulaId) {
|
calls++; detailId = formulaId; return new ElnFormulaVos.Detail();
|
}
|
@Override public IPage<ElnFormulaVos.ReferenceSummary> pageTemplateReferences(
|
String formulaId, ElnFormulaForms.ReferenceQuery query) {
|
calls++;
|
referenceFormulaId = formulaId;
|
referenceQuery = query;
|
return referencePage;
|
}
|
@Override public ElnFormulaVos.Version createVersion(String formulaId,
|
ElnFormulaForms.CreateVersion form) {
|
calls++; return new ElnFormulaVos.Version();
|
}
|
@Override public ElnFormulaVos.Version updateDraft(String versionId,
|
ElnFormulaForms.UpdateVersion form) {
|
calls++; return new ElnFormulaVos.Version();
|
}
|
@Override public void preRelease(String versionId) { calls++; preRelease = versionId; }
|
@Override public void publish(String versionId) { calls++; publish = versionId; }
|
@Override public void cancel(String versionId, String reason) {
|
calls++; cancel = versionId + ":" + reason;
|
}
|
@Override public void switchCurrent(String formulaId, String versionId, String reason) {
|
calls++; current = formulaId + ":" + versionId + ":" + reason;
|
}
|
@Override public void enable(String formulaId, String reason) {
|
calls++; enable = formulaId + ":" + reason;
|
}
|
@Override public void disable(String formulaId, String reason) {
|
calls++; disable = formulaId + ":" + reason;
|
}
|
}
|
}
|