package jnpf.elnController; import jnpf.base.ActionResult; import jnpf.database.util.NotTenantPluginHolder; import jnpf.elnEntity.template.ElnTemplateForms; import jnpf.elnEntity.template.ElnTemplateVos; import jnpf.elnService.template.ElnTemplateBindingService; import jnpf.elnService.template.TemplateAnnotationAuthorization; import jnpf.model.tenant.TenantVO; import jnpf.util.TenantHolder; import jnpf.util.context.SpringContext; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.aop.aspectj.annotation.AspectJProxyFactory; import org.springframework.context.support.StaticApplicationContext; import org.springframework.http.ResponseEntity; import java.lang.reflect.Constructor; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ElnNoDataSourceBindAspectTest { @BeforeClass public static void setUpSpringContext() { SpringContext.setApplicationContext(new StaticApplicationContext()); } @After public void clearThreadLocals() { TenantHolder.clearLocalTenantCache(); NotTenantPluginHolder.clearNotSwitchAlwaysFlag(); } @Test public void clearsTenantAtEntryAndMarksWholeTicketRequest() { setTenant("filter-tenant"); TrackingBindings bindings = new TrackingBindings(); ElnTemplateAnnotationController target = new ElnTemplateAnnotationController(ticket -> { assertNull(TenantHolder.getLocalTenantCache()); assertTrue(NotTenantPluginHolder.isNotSwitchAlways()); setTenant("ticket-tenant"); return authorization(); }, bindings); ElnTemplateAnnotationController proxy = proxy(target); proxy.context("Ticket opaque"); assertTrue(bindings.calledWithMarker); assertNull(TenantHolder.getLocalTenantCache()); assertFalse(NotTenantPluginHolder.isNotSwitchAlways()); } @Test public void clearsMarkerWhenTicketControllerThrows() { setTenant("filter-tenant"); ElnTemplateAnnotationController target = new ElnTemplateAnnotationController( ticket -> { setTenant("ticket-tenant"); return authorization(); }, new TrackingBindings()) { @Override protected ResponseEntity> success(T data) { throw new IllegalStateException("response failure"); } }; try { proxy(target).context("Ticket opaque"); fail("response wrapping should fail"); } catch (IllegalStateException expected) { assertTrue("response failure".equals(expected.getMessage())); } assertNull(TenantHolder.getLocalTenantCache()); assertFalse(NotTenantPluginHolder.isNotSwitchAlways()); } private static ElnTemplateAnnotationController proxy(ElnTemplateAnnotationController target) { AspectJProxyFactory factory = new AspectJProxyFactory(target); factory.setProxyTargetClass(true); factory.addAspect(ElnNoDataSourceBindAspect.class); return factory.getProxy(); } private static void setTenant(String tenantId) { TenantVO tenant = new TenantVO(); tenant.setEnCode(tenantId); TenantHolder.setLocalTenantCache(tenant); } private static TemplateAnnotationAuthorization authorization() { try { Constructor constructor = TemplateAnnotationAuthorization.class.getDeclaredConstructor( String.class, String.class, String.class, String.class); constructor.setAccessible(true); return constructor.newInstance( "ticket-tenant", "user-1", "template-1", "file-1"); } catch (ReflectiveOperationException e) { throw new AssertionError(e); } } private static class TrackingBindings implements ElnTemplateBindingService { private boolean calledWithMarker; @Override public ElnTemplateVos.AnnotationContext context(TemplateAnnotationAuthorization authorization) { calledWithMarker = NotTenantPluginHolder.isNotSwitchAlways() && "ticket-tenant".equals(TenantHolder.getLocalTenantCache().getEnCode()); return new ElnTemplateVos.AnnotationContext(); } @Override public ElnTemplateVos.Binding reservePrimary(TemplateAnnotationAuthorization a, ElnTemplateForms.ReserveBinding f) { return null; } @Override public ElnTemplateVos.Binding reserveReference(TemplateAnnotationAuthorization a, String id, String op) { return null; } @Override public ElnTemplateVos.Binding changeCheckboxGroup(TemplateAnnotationAuthorization a, String id, ElnTemplateForms.ChangeCheckboxGroup f) { return null; } @Override public ElnTemplateVos.Binding createPrivateFieldAndReserve(TemplateAnnotationAuthorization a, ElnTemplateForms.PrivateField f) { return null; } @Override public void activate(TemplateAnnotationAuthorization a, String id, String op) { } @Override public void cancel(TemplateAnnotationAuthorization a, String id, String op, String reason) { } @Override public ElnTemplateVos.RepairContext repairContext(TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmRepair(TemplateAnnotationAuthorization a, String id, ElnTemplateForms.RepairConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkUpgrade(TemplateAnnotationAuthorization a, String id, String target) { return null; } @Override public void confirmUpgrade(TemplateAnnotationAuthorization a, String id, ElnTemplateForms.UpgradeConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkRemove(TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmRemove(TemplateAnnotationAuthorization a, String id, ElnTemplateForms.RemoveConfirm f) { } @Override public void confirmRemoveMissing(String id, ElnTemplateForms.RemoveMissingConfirm f) { } @Override public ElnTemplateVos.ChangeCheck checkPromoteReference(TemplateAnnotationAuthorization a, String id) { return null; } @Override public void confirmPromoteReference(TemplateAnnotationAuthorization a, String id, ElnTemplateForms.PromoteConfirm f) { } @Override public void confirmVersionCopy(TemplateAnnotationAuthorization a, ElnTemplateForms.VersionCopyConfirm f) { } } }