package jnpf.elnController; import cn.dev33.satoken.annotation.SaCheckPermission; 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.template.ElnTemplateForms; import jnpf.elnEntity.template.ElnTemplateVos; import jnpf.elnService.template.ElnTemplateBindingService; import jnpf.elnService.template.ElnTemplateCatalogService; import jnpf.elnService.template.ElnTemplateHealthService; import jnpf.elnService.template.ElnTemplateStepService; import jnpf.util.NoDataSourceBind; 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 static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; public class ElnTemplateCatalogControllerTest { @BeforeClass public static void setUpSpringContext() { SpringContext.setApplicationContext(new StaticApplicationContext()); } @Test public void exposesLoginRoutesWithoutDisablingDataSourceBinding() throws Exception { assertEquals("/templateCatalog", ElnTemplateCatalogController.class.getAnnotation(RequestMapping.class).value()[0]); assertFalse(ElnTemplateCatalogController.class.isAnnotationPresent(NoDataSourceBind.class)); assertGet("list", "", ElnTemplateForms.Query.class); assertGet("directory", "/directory", ElnTemplateForms.Query.class); assertGet("detail", "/{templateId}", String.class); assertPost("createVersion", "/{sourceTemplateId}/versions", String.class, ElnTemplateForms.CreateVersion.class); assertGet("health", "/{templateId}/health", String.class); assertGet("steps", "/{templateId}/steps", String.class); assertPut("saveSteps", "/{templateId}/steps", String.class, ElnTemplateForms.SaveStepConfiguration.class); assertPost("publish", "/{templateId}/publish", String.class, ElnTemplateForms.Reason.class); assertPost("enable", "/{templateId}/enable", String.class, ElnTemplateForms.Reason.class); assertPost("disable", "/{templateId}/disable", String.class, ElnTemplateForms.Reason.class); assertPost("switchCurrent", "/currentVersion", ElnTemplateForms.SwitchCurrent.class); assertPost("confirmRemoveMissing", "/bindings/{bindingId}/confirmRemoveMissing", String.class, ElnTemplateForms.RemoveMissingConfirm.class); } @Test public void requiresTemplateMenuPermissionForAllLoginRoutes() { SaCheckPermission permission = ElnTemplateCatalogController.class.getAnnotation(SaCheckPermission.class); assertNotNull(permission); assertEquals(1, permission.value().length); assertEquals("dianziJiluMubanGuanli", permission.value()[0]); } @Test public void reliesOnClassLevelMenuPermissionForEveryWriteRoute() throws Exception { assertNoMethodPermission("createVersion", String.class, ElnTemplateForms.CreateVersion.class); assertNoMethodPermission("publish", String.class, ElnTemplateForms.Reason.class); assertNoMethodPermission("enable", String.class, ElnTemplateForms.Reason.class); assertNoMethodPermission("disable", String.class, ElnTemplateForms.Reason.class); assertNoMethodPermission("switchCurrent", ElnTemplateForms.SwitchCurrent.class); assertNoMethodPermission("confirmRemoveMissing", String.class, ElnTemplateForms.RemoveMissingConfirm.class); } @Test public void wrapsCatalogResultsAndForwardsOriginalForms() { StubCatalog catalog = new StubCatalog(); ElnTemplateVos.ListItem item = new ElnTemplateVos.ListItem(); item.setId("template-1"); catalog.page = new Page(2, 10, 21) .setRecords(Collections.singletonList(item)); ElnTemplateVos.CatalogItem directoryItem = new ElnTemplateVos.CatalogItem(); directoryItem.setMubanBianhao("TPL-001"); catalog.directory = new Page(2, 10, 11) .setRecords(Collections.singletonList(directoryItem)); StubHealth health = new StubHealth(); StubBindings bindings = new StubBindings(); StubSteps steps = new StubSteps(); ElnTemplateCatalogController controller = new ElnTemplateCatalogController( catalog, health, bindings, steps); ElnTemplateForms.Query query = new ElnTemplateForms.Query(); query.setCurrentPage(2); query.setPageSize(10); ElnTemplateForms.CreateVersion create = new ElnTemplateForms.CreateVersion(); ElnTemplateForms.RemoveMissingConfirm remove = new ElnTemplateForms.RemoveMissingConfirm(); ActionResult> result = controller.list(query); ActionResult> directory = controller.directory(query); controller.detail("template-1"); controller.createVersion("source-1", create); controller.health("template-1"); controller.steps("template-1"); ElnTemplateForms.SaveStepConfiguration stepForm = new ElnTemplateForms.SaveStepConfiguration(); controller.saveSteps("template-1", stepForm); controller.confirmRemoveMissing("binding-1", remove); assertEquals(Integer.valueOf(200), result.getCode()); assertEquals("template-1", result.getData().getList().get(0).getId()); assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage()); assertEquals(Integer.valueOf(21), result.getData().getPagination().getTotal()); assertEquals("TPL-001", directory.getData().getList().get(0).getMubanBianhao()); assertEquals(Long.valueOf(2), directory.getData().getPagination().getCurrentPage()); assertEquals(Integer.valueOf(11), directory.getData().getPagination().getTotal()); assertSame(query, catalog.query); assertSame(query, catalog.directoryQuery); assertSame(create, catalog.createVersion); assertSame(remove, bindings.removeMissing); assertEquals("binding-1", bindings.bindingId); assertEquals("template-1", steps.templateId); assertSame(stepForm, steps.form); } @Test public void forwardsReasonsAndCurrentVersionWithoutOwningTransactions() { StubCatalog catalog = new StubCatalog(); ElnTemplateCatalogController controller = new ElnTemplateCatalogController( catalog, new StubHealth(), new StubBindings(), new StubSteps()); ElnTemplateForms.Reason reason = new ElnTemplateForms.Reason(); reason.setReason(" change "); ElnTemplateForms.SwitchCurrent current = new ElnTemplateForms.SwitchCurrent(); current.setTemplateCode("T-1"); current.setTemplateId("template-2"); current.setReason("switch"); controller.publish("template-1", reason); controller.enable("template-1", reason); controller.disable("template-1", reason); controller.switchCurrent(current); assertEquals("template-1:change", catalog.publish); assertEquals("template-1:change", catalog.enable); assertEquals("template-1:change", catalog.disable); assertEquals("T-1:template-2:switch", catalog.current); } private static void assertGet(String name, String path, Class... types) throws Exception { Method method = ElnTemplateCatalogController.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 = ElnTemplateCatalogController.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 = ElnTemplateCatalogController.class.getMethod(name, types); assertEquals(path, first(method.getAnnotation(PutMapping.class).value())); } private static void assertNoMethodPermission(String name, Class... types) throws Exception { SaCheckPermission permission = ElnTemplateCatalogController.class .getMethod(name, types).getAnnotation(SaCheckPermission.class); assertNull(name + " 不应再声明按钮权限", permission); } private static String first(String[] paths) { return paths.length == 0 ? "" : paths[0]; } private static final class StubCatalog implements ElnTemplateCatalogService { private IPage page = new Page<>(); private IPage directory = new Page<>(); private ElnTemplateForms.Query query; private ElnTemplateForms.Query directoryQuery; private ElnTemplateForms.CreateVersion createVersion; private String publish; private String enable; private String disable; private String current; @Override public IPage page(ElnTemplateForms.Query query) { this.query = query; return page; } @Override public IPage directory(ElnTemplateForms.Query query) { this.directoryQuery = query; return directory; } @Override public ElnTemplateVos.Detail detail(String templateId) { return new ElnTemplateVos.Detail(); } @Override public ElnTemplateVos.Detail createVersion(String sourceTemplateId, ElnTemplateForms.CreateVersion form) { this.createVersion = form; return new ElnTemplateVos.Detail(); } @Override public void publish(String templateId, String reason) { publish = templateId + ":" + reason; } @Override public void enable(String templateId, String reason) { enable = templateId + ":" + reason; } @Override public void disable(String templateId, String reason) { disable = templateId + ":" + reason; } @Override public void switchCurrent(String templateCode, String templateId, String reason) { current = templateCode + ":" + templateId + ":" + reason; } } private static final class StubHealth implements ElnTemplateHealthService { @Override public HealthReport inspect(String templateId) { return new HealthReport(); } } private static final class StubSteps implements ElnTemplateStepService { @Override public ElnTemplateVos.StepFillStructure fillStructure( String tenantId, String templateId) { return null; } private String templateId; private ElnTemplateForms.SaveStepConfiguration form; @Override public ElnTemplateVos.StepConfiguration configuration(String templateId) { this.templateId = templateId; return new ElnTemplateVos.StepConfiguration(); } @Override public ElnTemplateVos.StepConfiguration save(String templateId, ElnTemplateForms.SaveStepConfiguration form) { this.templateId = templateId; this.form = form; return new ElnTemplateVos.StepConfiguration(); } @Override public void copyForVersion(String tenantId, String sourceTemplateId, String targetTemplateId) { } @Override public String resolveAssignment(String tenantId, String templateId, String requestedStepId) { return requestedStepId; } @Override public java.util.List validate( String tenantId, String templateId) { return Collections.emptyList(); } } private static final class StubBindings implements ElnTemplateBindingService { private String bindingId; private ElnTemplateForms.RemoveMissingConfirm removeMissing; @Override public void confirmRemoveMissing(String bindingId, ElnTemplateForms.RemoveMissingConfirm form) { this.bindingId = bindingId; this.removeMissing = form; } @Override public ElnTemplateVos.AnnotationContext context(jnpf.elnService.template.TemplateAnnotationAuthorization a) { return null; } @Override public ElnTemplateVos.Binding reservePrimary(jnpf.elnService.template.TemplateAnnotationAuthorization a, ElnTemplateForms.ReserveBinding f) { return null; } @Override public ElnTemplateVos.Binding reserveReference(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, String op) { return null; } @Override public ElnTemplateVos.Binding changeCheckboxGroup(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, ElnTemplateForms.ChangeCheckboxGroup f) { return null; } @Override public ElnTemplateVos.Binding createPrivateFieldAndReserve(jnpf.elnService.template.TemplateAnnotationAuthorization a, ElnTemplateForms.PrivateField f) { return null; } @Override public void activate(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, String op) { } @Override public void cancel(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, String op, String reason) { } @Override public ElnTemplateVos.RepairContext repairContext(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmRepair(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, ElnTemplateForms.RepairConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkUpgrade(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, String target) { return null; } @Override public void confirmUpgrade(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, ElnTemplateForms.UpgradeConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkRemove(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmRemove(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, ElnTemplateForms.RemoveConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkPromoteReference(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmPromoteReference(jnpf.elnService.template.TemplateAnnotationAuthorization a, String id, ElnTemplateForms.PromoteConfirm f) { } @Override public void confirmVersionCopy(jnpf.elnService.template.TemplateAnnotationAuthorization a, ElnTemplateForms.VersionCopyConfirm f) { } } }