package com.segment.analytics; import static com.segment.analytics.TestUtils.grantPermission; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.MockitoAnnotations.initMocks; import android.Manifest; import com.google.common.util.concurrent.MoreExecutors; import com.segment.analytics.Analytics.Builder; import com.segment.analytics.integrations.BasePayload; import com.segment.analytics.integrations.ScreenPayload; import com.segment.analytics.integrations.TrackPayload; import java.util.concurrent.atomic.AtomicReference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class MiddlewareTest { Analytics.Builder builder; @Before public void setUp() { initMocks(this); Analytics.INSTANCES.clear(); grantPermission(RuntimeEnvironment.application, Manifest.permission.INTERNET); builder = new Builder(RuntimeEnvironment.application, "write_key") .executor(MoreExecutors.newDirectExecutorService()); } @Test public void middlewareCanShortCircuit() throws Exception { final AtomicReference<TrackPayload> payloadRef = new AtomicReference<>(); Analytics analytics = builder.middleware(new Middleware() { @Override public void intercept(Chain chain) { payloadRef.set((TrackPayload) chain.payload()); } }).middleware(new Middleware() { @Override public void intercept(Chain chain) { throw new AssertionError("should not be invoked"); } }).build(); analytics.track("foo"); assertThat(payloadRef.get().event()).isEqualTo("foo"); } @Test public void middlewareCanProceed() throws Exception { final AtomicReference<ScreenPayload> payloadRef = new AtomicReference<>(); Analytics analytics = builder.middleware(new Middleware() { @Override public void intercept(Chain chain) { chain.proceed(chain.payload()); } }).middleware(new Middleware() { @Override public void intercept(Chain chain) { BasePayload payload = chain.payload(); payloadRef.set((ScreenPayload) payload); chain.proceed(payload); } }).build(); analytics.screen("foo"); assertThat(payloadRef.get().name()).isEqualTo("foo"); } @Test public void middlewareCanTransform() throws Exception { final AtomicReference<BasePayload> payloadRef = new AtomicReference<>(); Analytics analytics = builder.middleware(new Middleware() { @Override public void intercept(Chain chain) { chain.proceed(chain.payload().toBuilder().messageId("override").build()); } }).middleware(new Middleware() { @Override public void intercept(Chain chain) { BasePayload payload = chain.payload(); payloadRef.set(payload); chain.proceed(payload); } }).build(); analytics.identify("prateek"); assertThat(payloadRef.get().messageId()).isEqualTo("override"); } }