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<ElnFieldVos.ListItem>(2, 10, 21)
|
.setRecords(Collections.singletonList(item));
|
ElnFieldCatalogController controller = controller(service);
|
ElnFieldForms.Query query = new ElnFieldForms.Query();
|
query.setCurrentPage(2);
|
query.setPageSize(10);
|
|
ActionResult<PageListVO<ElnFieldVos.ListItem>> 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<Property> 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<ElnFieldForms.Query> query = new AtomicReference<>();
|
private final AtomicReference<String> detailId = new AtomicReference<>();
|
private IPage<ElnFieldVos.ListItem> 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<ElnFieldVos.ListItem> 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++;
|
}
|
}
|
}
|