package com.codecademy.eventhub.index;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.inject.Injector;
import com.codecademy.eventhub.integration.GuiceTestCase;
import com.codecademy.eventhub.model.Event;
import com.codecademy.eventhub.model.User;
import org.junit.Assert;
import org.junit.Test;
import javax.inject.Provider;
import java.util.List;
import java.util.Properties;
public class PropertiesIndexTest extends GuiceTestCase {
@Test
public void testAll() throws Exception {
final String USER_ID = "foo";
final String DATE = "20140101";
Provider<PropertiesIndex> propertiesIndexProvider = getPropertiesIndexProvider();
PropertiesIndex propertiesIndex = propertiesIndexProvider.get();
List<Event> events = Lists.newArrayList(
new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("experiment", "foo1", "treatment", "bar1")).build(),
new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("experiment", "foo1", "treatment", "bar2")).build(),
new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("hello", "world")).build(),
new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("", "")).build(),
new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("experiment", "foo2", "treatment", "bar3")).build(),
new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("experiment", "foo2", "treatment", "bar3")).build(),
new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("x", "y")).build()
);
for (Event event : events) {
propertiesIndex.addEvent(event);
}
propertiesIndex.addUser(new User.Builder("user_id1", ImmutableMap.of("foo1", "bar1")).build());
propertiesIndex.addUser(new User.Builder("user_id2", ImmutableMap.of("foo1", "bar2", "foo2", "bar3")).build());
Assert.assertEquals(Lists.newArrayList("experiment", "hello", "treatment"), propertiesIndex.getEventKeys("signup"));
Assert.assertEquals(Lists.newArrayList("foo1"), propertiesIndex.getEventValues("signup", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("experiment", "treatment", "x"), propertiesIndex.getEventKeys("submission"));
Assert.assertEquals(Lists.newArrayList("foo2"), propertiesIndex.getEventValues("submission", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getEventValues("submission", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar"));
Assert.assertEquals(Lists.newArrayList("bar1"), propertiesIndex.getEventValues("signup", "treatment", "bar1"));
Assert.assertEquals(Lists.newArrayList("bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar2"));
Assert.assertEquals(Lists.newArrayList("foo1", "foo2"), propertiesIndex.getUserKeys());
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getUserValues("foo1", "b"));
Assert.assertTrue(propertiesIndex.getUserValues("foo1", "c").isEmpty());
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getUserValues("foo2", ""));
propertiesIndex.close();
propertiesIndex = propertiesIndexProvider.get();
Assert.assertEquals(Lists.newArrayList("experiment", "hello", "treatment"), propertiesIndex.getEventKeys("signup"));
Assert.assertEquals(Lists.newArrayList("foo1"), propertiesIndex.getEventValues("signup", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("experiment", "treatment", "x"), propertiesIndex.getEventKeys("submission"));
Assert.assertEquals(Lists.newArrayList("foo2"), propertiesIndex.getEventValues("submission", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getEventValues("submission", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar"));
Assert.assertEquals(Lists.newArrayList("bar1"), propertiesIndex.getEventValues("signup", "treatment", "bar1"));
Assert.assertEquals(Lists.newArrayList("bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar2"));
Assert.assertEquals(Lists.newArrayList("foo1", "foo2"), propertiesIndex.getUserKeys());
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getUserValues("foo1", "b"));
Assert.assertTrue(propertiesIndex.getUserValues("foo1", "c").isEmpty());
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getUserValues("foo2", ""));
}
private Provider<PropertiesIndex> getPropertiesIndexProvider() {
Properties prop = new Properties();
prop.put("eventhub.directory", getTempDirectory());
Injector injector = createInjectorFor(prop, new PropertiesIndexModule());
return injector.getProvider(PropertiesIndex.class);
}
}