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 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 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 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 result = controller.canAnnotate( "tenant-a", "user-1", "template-1", "file-1"); assertEquals(Arrays.asList("same-token", "annotation-access"), calls); assertEquals(Boolean.TRUE, result.getData()); } }