package jnpf.limsService.impl; import jnpf.lims.api.model.TestWorkItemSnapshotActorRequest; import jnpf.lims.api.model.TestWorkItemSnapshotBatch; import jnpf.lims.api.model.TestWorkItemSnapshotRequest; import jnpf.limsService.LimsTestWorkItemSnapshotService; import org.junit.Test; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; public class LimsTestWorkItemActorSnapshotServiceImplTest { @Test public void switchesToActorTenantAndAlwaysClearsTheRoute() { AtomicReference switched = new AtomicReference<>(); AtomicReference resolvedTenant = new AtomicReference<>(); AtomicReference resolvedUser = new AtomicReference<>(); AtomicInteger cleared = new AtomicInteger(); TestWorkItemSnapshotBatch expected = new TestWorkItemSnapshotBatch(); LimsTestWorkItemSnapshotService snapshots = (request, tenantId, userId) -> { resolvedTenant.set(tenantId); resolvedUser.set(userId); return expected; }; LimsTestWorkItemActorSnapshotServiceImpl service = new LimsTestWorkItemActorSnapshotServiceImpl(snapshots, new LimsTestWorkItemActorSnapshotServiceImpl.TenantRoute() { @Override public void switchTo(String tenantId) { switched.set(tenantId); } @Override public void clear() { cleared.incrementAndGet(); } }); assertSame(expected, service.resolve(actor())); assertEquals("tenant-a", switched.get()); assertEquals("tenant-a", resolvedTenant.get()); assertEquals("user-a", resolvedUser.get()); assertEquals(1, cleared.get()); } @Test public void routeFailureFailsClosedAndStillClears() { AtomicInteger cleared = new AtomicInteger(); LimsTestWorkItemActorSnapshotServiceImpl service = new LimsTestWorkItemActorSnapshotServiceImpl( (request, tenantId, userId) -> new TestWorkItemSnapshotBatch(), new LimsTestWorkItemActorSnapshotServiceImpl.TenantRoute() { @Override public void switchTo(String tenantId) { throw new IllegalStateException("route failed"); } @Override public void clear() { cleared.incrementAndGet(); } }); try { service.resolve(actor()); fail("tenant switch failure must fail closed"); } catch (IllegalStateException expected) { assertEquals("route failed", expected.getMessage()); } assertEquals(1, cleared.get()); } private static TestWorkItemSnapshotActorRequest actor() { TestWorkItemSnapshotActorRequest actor = new TestWorkItemSnapshotActorRequest(); actor.setTenantId("tenant-a"); actor.setUserId("user-a"); actor.setRequest(new TestWorkItemSnapshotRequest()); return actor; } }