package jnpf.elnController;
|
|
import jnpf.base.ActionResult;
|
import jnpf.eln.TemplateEditabilityApi;
|
import jnpf.elnService.template.ElnTemplateAnnotationAccessService;
|
import jnpf.elnService.template.ElnTemplateEditabilityService;
|
import jnpf.util.NoDataSourceBind;
|
import jnpf.util.context.SpringContext;
|
import org.junit.BeforeClass;
|
import org.junit.Test;
|
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.context.support.StaticApplicationContext;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
import java.lang.reflect.Method;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.fail;
|
|
public class ElnTemplateEditabilityControllerTest {
|
|
@BeforeClass
|
public static void setUpSpringContext() {
|
SpringContext.setApplicationContext(new StaticApplicationContext());
|
}
|
|
@Test
|
public void sameTokenCheckRunsBeforeService() {
|
List<String> calls = new ArrayList<>();
|
ElnTemplateEditabilityService service = (tenantId, templateId, fileId) -> {
|
calls.add("service");
|
return true;
|
};
|
ElnTemplateEditabilityController controller = new ElnTemplateEditabilityController(
|
() -> calls.add("same-token"), service, (tenantId, userId, templateId, fileId) -> false);
|
|
ActionResult<Boolean> result = controller.editable("tenant-a", "template-1", "file-1");
|
|
assertEquals(Arrays.asList("same-token", "service"), calls);
|
assertEquals(Boolean.TRUE, result.getData());
|
}
|
|
@Test
|
public void failedSameTokenCheckPreventsServiceInvocation() {
|
AtomicInteger serviceCalls = new AtomicInteger();
|
ElnTemplateEditabilityController controller = new ElnTemplateEditabilityController(
|
() -> { throw new SecurityException("invalid same token"); },
|
(tenantId, templateId, fileId) -> {
|
serviceCalls.incrementAndGet();
|
return true;
|
}, (tenantId, userId, templateId, fileId) -> false);
|
|
try {
|
controller.editable("tenant-a", "template-1", "file-1");
|
fail("invalid SAME-TOKEN should be rejected");
|
} catch (SecurityException expected) {
|
assertEquals("invalid same token", expected.getMessage());
|
}
|
assertEquals(0, serviceCalls.get());
|
}
|
|
@Test
|
public void controllerAndFeignShareInternalPostContract() throws Exception {
|
Method controllerMethod = ElnTemplateEditabilityController.class.getMethod(
|
"editable", String.class, String.class, String.class);
|
assertNotNull(controllerMethod.getAnnotation(NoDataSourceBind.class));
|
assertEquals("/editability", controllerMethod.getAnnotation(PostMapping.class).value()[0]);
|
|
FeignClient feign = TemplateEditabilityApi.class.getAnnotation(FeignClient.class);
|
assertEquals("jnpf-eln", feign.name());
|
assertEquals("/Internal/eln/template", feign.path());
|
Method feignMethod = TemplateEditabilityApi.class.getMethod(
|
"editable", String.class, String.class, String.class);
|
assertEquals("/editability", feignMethod.getAnnotation(PostMapping.class).value()[0]);
|
Arrays.stream(feignMethod.getParameters()).forEach(parameter ->
|
assertTrue(parameter.isAnnotationPresent(RequestParam.class)));
|
|
Method annotationControllerMethod = ElnTemplateEditabilityController.class.getMethod(
|
"canAnnotate", String.class, String.class, String.class, String.class);
|
assertNotNull(annotationControllerMethod.getAnnotation(NoDataSourceBind.class));
|
assertEquals("/annotationAccess",
|
annotationControllerMethod.getAnnotation(PostMapping.class).value()[0]);
|
Method annotationFeignMethod = TemplateEditabilityApi.class.getMethod(
|
"canAnnotate", String.class, String.class, String.class, String.class);
|
assertEquals("/annotationAccess",
|
annotationFeignMethod.getAnnotation(PostMapping.class).value()[0]);
|
Arrays.stream(annotationFeignMethod.getParameters()).forEach(parameter ->
|
assertTrue(parameter.isAnnotationPresent(RequestParam.class)));
|
}
|
|
@Test
|
public void sameTokenCheckRunsBeforeAnnotationAccessService() {
|
List<String> calls = new ArrayList<>();
|
ElnTemplateAnnotationAccessService annotationAccess = (tenantId, userId, templateId, fileId) -> {
|
calls.add("annotation-access");
|
return true;
|
};
|
ElnTemplateEditabilityController controller = new ElnTemplateEditabilityController(
|
() -> calls.add("same-token"),
|
(tenantId, templateId, fileId) -> false,
|
annotationAccess);
|
|
ActionResult<Boolean> result = controller.canAnnotate(
|
"tenant-a", "user-1", "template-1", "file-1");
|
|
assertEquals(Arrays.asList("same-token", "annotation-access"), calls);
|
assertEquals(Boolean.TRUE, result.getData());
|
}
|
}
|