package org.jooby.cassandra;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.jooby.Deferred;
import org.jooby.Request;
import org.jooby.test.MockUnit;
import org.jooby.test.MockUnit.Block;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.mapping.Result;
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@RunWith(PowerMockRunner.class)
@PrepareForTest({CassandraMapper.class, Futures.class })
public class CassandraMapperTest {
@SuppressWarnings("unchecked")
private Block futureCallback = unit -> {
unit.mockStatic(Futures.class);
Futures.addCallback(eq(unit.get(ListenableFuture.class)),
unit.capture(FutureCallback.class));
};
@Test
public void name() {
assertEquals("cassandra", new CassandraMapper().name());
}
@SuppressWarnings("unchecked")
@Test
public void resultSet() throws Exception {
new MockUnit(Request.class, ResultSet.class, Row.class)
.expect(unit -> {
ResultSet rs = unit.get(ResultSet.class);
expect(rs.all()).andReturn(ImmutableList.of(unit.get(Row.class)));
})
.run(unit -> {
List<ResultSet> rs = (List<ResultSet>) new CassandraMapper()
.map(unit.get(ResultSet.class));
assertEquals(ImmutableList.of(unit.get(Row.class)), rs);
});
}
@SuppressWarnings({"unchecked", "rawtypes" })
@Test
public void result() throws Exception {
new MockUnit(Request.class, Result.class, Row.class)
.expect(unit -> {
Result rs = unit.get(Result.class);
expect(rs.all()).andReturn(ImmutableList.of(unit.get(Row.class)));
})
.run(unit -> {
List<ResultSet> rs = (List<ResultSet>) new CassandraMapper()
.map(unit.get(Result.class));
assertEquals(ImmutableList.of(unit.get(Row.class)), rs);
});
}
@Test
public void ignored() throws Exception {
Object value = new Object();
new MockUnit(Request.class, Result.class, Row.class)
.run(unit -> {
Object result = new CassandraMapper()
.map(value);
assertEquals(value, result);
});
}
@SuppressWarnings("unchecked")
@Test
public void listeneableFutureSuccess() throws Exception {
Object value = new Object();
CountDownLatch latch = new CountDownLatch(1);
new MockUnit(Request.class, ListenableFuture.class)
.expect(futureCallback)
.run(unit -> {
Deferred deferred = (Deferred) new CassandraMapper()
.map(unit.get(ListenableFuture.class));
deferred.handler(unit.get(Request.class), (result, x) -> {
assertEquals(value, result.get());
latch.countDown();
});
}, unit -> {
unit.captured(FutureCallback.class).iterator().next().onSuccess(value);
});
latch.await();
}
@SuppressWarnings("unchecked")
@Test
public void listeneableFutureResultSet() throws Exception {
CountDownLatch latch = new CountDownLatch(1);
new MockUnit(Request.class, ListenableFuture.class, ResultSet.class, Row.class)
.expect(futureCallback)
.expect(unit -> {
ResultSet rs = unit.get(ResultSet.class);
expect(rs.all()).andReturn(ImmutableList.of(unit.get(Row.class)));
})
.run(unit -> {
Deferred deferred = (Deferred) new CassandraMapper()
.map(unit.get(ListenableFuture.class));
deferred.handler(unit.get(Request.class), (result, x) -> {
assertEquals(ImmutableList.of(unit.get(Row.class)), result.get());
latch.countDown();
});
}, unit -> {
unit.captured(FutureCallback.class).iterator().next()
.onSuccess(unit.get(ResultSet.class));
});
latch.await();
}
@SuppressWarnings({"unchecked", "rawtypes" })
@Test
public void listeneableFutureResult() throws Exception {
CountDownLatch latch = new CountDownLatch(1);
new MockUnit(Request.class, ListenableFuture.class, Result.class, Row.class)
.expect(futureCallback)
.expect(unit -> {
Result rs = unit.get(Result.class);
expect(rs.all()).andReturn(ImmutableList.of(unit.get(Row.class)));
})
.run(unit -> {
Deferred deferred = (Deferred) new CassandraMapper()
.map(unit.get(ListenableFuture.class));
deferred.handler(unit.get(Request.class), (result, x) -> {
assertEquals(ImmutableList.of(unit.get(Row.class)), result.get());
latch.countDown();
});
}, unit -> {
unit.captured(FutureCallback.class).iterator().next()
.onSuccess(unit.get(Result.class));
});
latch.await();
}
@Test
public void listeneableFutureError() throws Exception {
Throwable value = new Throwable();
CountDownLatch latch = new CountDownLatch(1);
new MockUnit(Request.class, ListenableFuture.class)
.expect(futureCallback)
.run(unit -> {
Deferred deferred = (Deferred) new CassandraMapper()
.map(unit.get(ListenableFuture.class));
deferred.handler(unit.get(Request.class), (result, x) -> {
assertEquals(value, x);
latch.countDown();
});
}, unit -> {
unit.captured(FutureCallback.class).iterator().next().onFailure(value);
});
latch.await();
}
}