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.field.ElnFieldForms; import jnpf.elnEntity.field.ElnFieldVos; import jnpf.elnEntity.template.ElnTemplateForms; import jnpf.elnService.ElnFieldCatalogService; import jnpf.elnService.ElnFieldProviderCatalog; import jnpf.elnService.template.ElnTemplateCodeAssistService; 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.concurrent.atomic.AtomicReference; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; public class ElnFieldCatalogControllerTest { @BeforeClass public static void setUpSpringContext() { SpringContext.setApplicationContext(new StaticApplicationContext()); } @Test public void exposesFieldCatalogRoutes() throws Exception { assertEquals("/fieldCatalog", ElnFieldCatalogController.class.getAnnotation(RequestMapping.class).value()[0]); assertGet("list", "", ElnFieldForms.Query.class); assertPost("create", "", ElnFieldForms.Create.class); assertGet("detail", "/{id}", String.class); assertGet("providerProperties", "/providerProperties", String.class); assertPost("suggestCode", "/codeSuggestions", ElnTemplateForms.CodeSuggestion.class); assertPost("createVersion", "/{id}/versions", String.class, ElnFieldForms.VersionCreate.class); assertPut("updateVersion", "/versions/{versionId}", String.class, ElnFieldForms.VersionUpdate.class); assertPost("preRelease", "/versions/{versionId}/preRelease", String.class); assertPost("publish", "/versions/{versionId}/publish", String.class); assertPost("cancel", "/versions/{versionId}/cancel", String.class, ElnFieldForms.Reason.class); assertPost("switchCurrent", "/{id}/currentVersion", String.class, ElnFieldForms.SwitchCurrent.class); assertPost("promoteGlobal", "/{id}/promoteGlobal", String.class, ElnFieldForms.Reason.class); assertPost("enable", "/{id}/enable", String.class, ElnFieldForms.Reason.class); assertPost("disable", "/{id}/disable", String.class, ElnFieldForms.Reason.class); } @Test public void wrapsPageAndPassesTrimmedValues() { StubService service = new StubService(); ElnFieldVos.ListItem item = new ElnFieldVos.ListItem(); item.setId("field-1"); service.page = new Page(2, 10, 21) .setRecords(Collections.singletonList(item)); ElnFieldCatalogController controller = controller(service); ElnFieldForms.Query query = new ElnFieldForms.Query(); query.setCurrentPage(2); query.setPageSize(10); ActionResult> result = controller.list(query); controller.detail(" field-1 "); assertEquals(Integer.valueOf(200), result.getCode()); assertEquals("field-1", result.getData().getList().get(0).getId()); assertEquals(Long.valueOf(2), result.getData().getPagination().getCurrentPage()); assertEquals(Long.valueOf(10), result.getData().getPagination().getPageSize()); assertEquals(Integer.valueOf(21), result.getData().getPagination().getTotal()); assertEquals("field-1", service.detailId.get()); assertSame(query, service.query.get()); } @Test public void exposesOnlyExternalProviderProperties() { ElnFieldCatalogController controller = controller(new StubService()); assertEquals(Integer.valueOf(200), controller.providerProperties(" LIMS_TASK ").getCode()); assertEquals(Integer.valueOf(400), controller.providerProperties(null).getCode()); assertEquals(Integer.valueOf(400), controller.providerProperties("NONE").getCode()); assertEquals(Integer.valueOf(400), controller.providerProperties("UNKNOWN").getCode()); } @Test public void rejectsInvalidIdsReasonsAndPageWithoutCallingService() { StubService service = new StubService(); ElnFieldCatalogController controller = controller(service); ElnFieldForms.Query invalidPage = new ElnFieldForms.Query(); invalidPage.setCurrentPage(0); ElnFieldForms.Reason missingReason = new ElnFieldForms.Reason(); ElnFieldForms.SwitchCurrent missingVersion = new ElnFieldForms.SwitchCurrent(); missingVersion.setReason("切换"); assertEquals(Integer.valueOf(400), controller.list(invalidPage).getCode()); assertEquals(Integer.valueOf(400), controller.detail(" ").getCode()); assertEquals(Integer.valueOf(400), controller.cancel("v1", missingReason).getCode()); assertEquals(Integer.valueOf(400), controller.switchCurrent("f1", missingVersion).getCode()); assertEquals(0, service.calls); } private static ElnFieldCatalogController controller(StubService service) { ElnFieldProviderCatalog providers = new ElnFieldProviderCatalog() { @Override public java.util.List list(String source) { return Collections.singletonList( new Property(source, "test.basis", "检验依据", "TEXT", true)); } @Override public boolean contains(String source, String property) { return true; } }; return new ElnFieldCatalogController(service, providers, new ElnTemplateCodeAssistService()); } private static void assertGet(String methodName, String path, Class... parameterTypes) throws Exception { Method method = ElnFieldCatalogController.class.getMethod(methodName, parameterTypes); assertEquals(path, firstPath(method.getAnnotation(GetMapping.class).value())); } private static void assertPost(String methodName, String path, Class... parameterTypes) throws Exception { Method method = ElnFieldCatalogController.class.getMethod(methodName, parameterTypes); assertEquals(path, firstPath(method.getAnnotation(PostMapping.class).value())); } private static void assertPut(String methodName, String path, Class... parameterTypes) throws Exception { Method method = ElnFieldCatalogController.class.getMethod(methodName, parameterTypes); assertEquals(path, firstPath(method.getAnnotation(PutMapping.class).value())); } private static String firstPath(String[] paths) { return paths.length == 0 ? "" : paths[0]; } private static final class StubService implements ElnFieldCatalogService { private final AtomicReference query = new AtomicReference<>(); private final AtomicReference detailId = new AtomicReference<>(); private IPage page = new Page<>(); private int calls; @Override public void ensureTestSubmissionFields() { } @Override public ElnFieldVos.Detail create(ElnFieldForms.Create form) { calls++; return new ElnFieldVos.Detail(); } @Override public ElnFieldVos.Detail createTemplateFieldAndPreRelease( ElnFieldForms.TemplateFieldCreate command) { throw new AssertionError("内部命令不应由 Controller 暴露"); } @Override public ElnFieldVos.Detail detail(String id) { calls++; detailId.set(id); return new ElnFieldVos.Detail(); } @Override public IPage page(ElnFieldForms.Query query) { calls++; this.query.set(query); return page; } @Override public ElnFieldVos.Version createVersion(String fieldId, ElnFieldForms.VersionCreate form) { calls++; return new ElnFieldVos.Version(); } @Override public ElnFieldVos.Version updateDraft(String versionId, ElnFieldForms.VersionUpdate form) { calls++; return new ElnFieldVos.Version(); } @Override public void preRelease(String versionId) { calls++; } @Override public void publish(String versionId) { calls++; } @Override public void cancel(String versionId, String reason) { calls++; } @Override public void switchCurrent(String fieldId, String versionId, String reason) { calls++; } @Override public void promoteToGlobal(String fieldId, String reason) { calls++; } @Override public void enable(String fieldId, String reason) { calls++; } @Override public void disable(String fieldId, String reason) { calls++; } } }