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(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> 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(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> 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> 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 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 page = new Page<>(); private IPage 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 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 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; } } }