package uk.co.panaxiom.playjongo;
import static org.fest.assertions.Assertions.assertThat;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import play.Configuration;
import static uk.co.panaxiom.playjongo.PlayJongoTest.MapBuilder.*;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import com.typesafe.config.ConfigFactory;
public class PlayJongoTest {
@Test
public void testMongoUriConfig() throws Exception {
Map<String, String> config = mapBuilder("playjongo.uri", "mongodb://localhost:27017/foo").get();
final PlayJongo cut = playJongo(config, false);
assertMongoProperties(cut, "localhost", 27017, "foo");
}
@Test
public void testMongoTestUriConfig() throws Exception {
Map<String, String> config = mapBuilder("playjongo.test-uri", "mongodb://localhost:27017/bar").get();
final PlayJongo cut = playJongo(config, true);
assertMongoProperties(cut, "localhost", 27017, "bar");
}
@Test
public void testMongoWriteConcern() throws Exception {
Map<String, String> config = mapBuilder("playjongo.uri", "mongodb://localhost:27017/foo")
.with("playjongo.defaultWriteConcern", "REPLICAS_SAFE").get();
final PlayJongo cut = playJongo(config, false);
assertThat(cut.jongo.getDatabase().getWriteConcern()).isEqualTo(WriteConcern.SAFE);
}
@Test
public void testMongoClientFactory() throws Exception {
Map<String, String> config = mapBuilder("playjongo.test-uri", "mongodb://example.com:27018/bar")
.with("playjongo.mongoClientFactory", TestMongoClientFactory.class.getName()).get();
final PlayJongo cut = playJongo(config, false);
// TestMongoClientFactory overrides getDBName, so using this to test we constructed with our
// specified factory class
assertThat(cut.jongo.getDatabase().getName()).isEqualTo("testMongoClientFactory");
}
private void assertMongoProperties(final PlayJongo cut, String host, int port, String dbName) {
assertThat(cut.mongo.getServerAddressList().size()).isEqualTo(1);
final ServerAddress server0 = cut.mongo.getServerAddressList().get(0);
assertThat(server0.getHost()).isEqualTo(host);
assertThat(server0.getPort()).isEqualTo(port);
assertThat(cut.jongo.getDatabase().getName()).isEqualTo(dbName);
}
private static PlayJongo playJongo(Map<String, ? extends Object> config, boolean isTest) throws Exception {
return new PlayJongo(new Configuration(ConfigFactory.parseMap(config)), classLoader(), isTest);
}
private static ClassLoader classLoader() {
return Thread.currentThread().getContextClassLoader();
}
static class MapBuilder<K, V> {
private final Map<K, V> m = new HashMap<K, V>();
public MapBuilder(K key, V value) {
m.put(key, value);
}
public static <K, V> MapBuilder<K, V> mapBuilder(K key, V value) {
return new MapBuilder<K, V>(key, value);
}
public MapBuilder<K, V> with(K key, V value) {
m.put(key, value);
return this;
}
public Map<K, V> get() {
return m;
}
}
}