package com.hokolinks.tests;
import com.hokolinks.BuildConfig;
import com.hokolinks.deeplinking.Handling;
import com.hokolinks.model.Deeplink;
import com.hokolinks.model.DeeplinkCallback;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
import static org.fest.assertions.api.Assertions.assertThat;
@RunWith(HokoGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class HandlingTest {
/** Countdown latch */
private CountDownLatch lock;
private Deeplink deeplink;
private Date timestamp;
@Before
public void setUp() {
deeplink = null;
timestamp = null;
lock = null;
}
@Test
public void testAnnonymousHandling() throws Exception{
lock = new CountDownLatch(1);
Handling handling = new Handling();
handling.addHandler(new DeeplinkCallback() {
@Override
public void deeplinkOpened(Deeplink deeplink) {
HandlingTest.this.deeplink = deeplink;
lock.countDown();
}
});
handling.handle(Deeplink.deeplink("product/:product_id", new HashMap<String, String>() {
{
put("product_id", "1234");
}
}, new HashMap<String, String>() {
{
put("query", "param");
}
}, null));
lock.await();
HashMap<String, String> expectedRouteParameters = new HashMap<String, String>() {
{
put("product_id", "1234");
}
};
HashMap<String, String> expectedQueryParameters = new HashMap<String, String>() {
{
put("query", "param");
}
};
assertThat(deeplink.getRoute()).isEqualTo("product/:product_id");
assertThat(deeplink.getRouteParameters()).isEqualTo(expectedRouteParameters);
assertThat(deeplink.getQueryParameters()).isEqualTo(expectedQueryParameters);
}
public void testInterfaceImplementationHandling() throws Exception{
lock = new CountDownLatch(1);
Handling handling = new Handling();
TestHandler handler = new TestHandler(lock);
handling.addHandler(handler);
handling.handle(Deeplink.deeplink("product/:product_id", new HashMap<String, String>() {
{
put("product_id", "1234");
}
}, new HashMap<String, String>() {
{
put("query", "param");
}
}, null));
lock.await();
HashMap<String, String> expectedRouteParameters = new HashMap<String, String>() {
{
put("product_id", "1234");
}
};
HashMap<String, String> expectedQueryParameters = new HashMap<String, String>() {
{
put("query", "param");
}
};
assertThat(handler.deeplink.getRoute()).isEqualTo("product/:product_id");
assertThat(handler.deeplink.getRouteParameters()).isEqualTo(expectedRouteParameters);
assertThat(handler.deeplink.getQueryParameters()).isEqualTo(expectedQueryParameters);
}
public void testMultipleHandling() throws Exception{
lock = new CountDownLatch(2);
Handling handling = new Handling();
TestHandler handler = new TestHandler(lock);
handling.addHandler(handler);
handling.addHandler(new DeeplinkCallback() {
@Override
public void deeplinkOpened(Deeplink deeplink) {
HandlingTest.this.deeplink = deeplink;
lock.countDown();
}
});
handling.handle(Deeplink.deeplink("product/:product_id", new HashMap<String, String>() {
{
put("product_id", "1234");
}
}, new HashMap<String, String>() {
{
put("query", "param");
}
}, null));
lock.await();
HashMap<String, String> expectedRouteParameters = new HashMap<String, String>() {
{
put("product_id", "1234");
}
};
HashMap<String, String> expectedQueryParameters = new HashMap<String, String>() {
{
put("query", "param");
}
};
assertThat(handler.deeplink.getRoute()).isEqualTo("product/:product_id");
assertThat(handler.deeplink.getRouteParameters()).isEqualTo(expectedRouteParameters);
assertThat(handler.deeplink.getQueryParameters()).isEqualTo(expectedQueryParameters);
assertThat(deeplink.getRoute()).isEqualTo("product/:product_id");
assertThat(deeplink.getRouteParameters()).isEqualTo(expectedRouteParameters);
assertThat(deeplink.getQueryParameters()).isEqualTo(expectedQueryParameters);
}
public void testHandlingOrder() throws Exception{
lock = new CountDownLatch(2);
Handling handling = new Handling();
TestHandler handler = new TestHandler(lock);
handling.addHandler(handler);
handling.addHandler(new DeeplinkCallback() {
@Override
public void deeplinkOpened(Deeplink deeplink) {
HandlingTest.this.deeplink = deeplink;
HandlingTest.this.timestamp = new Date();
lock.countDown();
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
});
handling.handle(Deeplink.deeplink("product/:product_id", new HashMap<String, String>() {
{
put("product_id", "1234");
}
}, new HashMap<String, String>() {
{
put("query", "param");
}
}, null));
lock.await();
assertThat(timestamp).isAfter(handler.timestamp);
}
private class TestHandler implements DeeplinkCallback {
public Date timestamp;
public Deeplink deeplink;
private CountDownLatch lock;
public TestHandler(CountDownLatch lock) {
this.lock = lock;
}
@Override
public void deeplinkOpened(Deeplink deeplink) {
this.deeplink = deeplink;
this.timestamp = new Date();
this.lock.countDown();
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}