package com.lordofthejars.nosqlunit.mongodb;
import com.lordofthejars.nosqlunit.core.AbstractNoSqlTestRule;
import com.lordofthejars.nosqlunit.core.DatabaseOperation;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import static com.lordofthejars.nosqlunit.mongodb.InMemoryMongoDbConfigurationBuilder.inMemoryMongoDb;
import static com.lordofthejars.nosqlunit.mongodb.MongoDbConfigurationBuilder.mongoDb;
public class MongoDbRule extends AbstractNoSqlTestRule {
private static final String EXTENSION = "json";
protected DatabaseOperation<MongoClient> databaseOperation;
public static class MongoDbRuleBuilder {
private MongoDbConfiguration mongoDbConfiguration;
private Object target;
private MongoDbRuleBuilder() {
}
public static MongoDbRuleBuilder newMongoDbRule() {
return new MongoDbRuleBuilder();
}
public MongoDbRuleBuilder configure(MongoDbConfiguration mongoDbConfiguration) {
this.mongoDbConfiguration = mongoDbConfiguration;
return this;
}
public MongoDbRuleBuilder unitInstance(Object target) {
this.target = target;
return this;
}
public MongoDbRule defaultEmbeddedMongoDb(String databaseName) {
return new MongoDbRule(inMemoryMongoDb().databaseName(databaseName).build());
}
/**
* We can use defaultEmbeddedMongoDb(String databaseName).
* @param databaseName
* @param target
* @return
*/
@Deprecated
public MongoDbRule defaultEmbeddedMongoDb(String databaseName, Object target) {
return new MongoDbRule(inMemoryMongoDb().databaseName(databaseName).build(), target);
}
public MongoDbRule defaultManagedMongoDb(String databaseName) {
return new MongoDbRule(mongoDb().databaseName(databaseName).build());
}
public MongoDbRule defaultManagedMongoDb(String databaseName, int port) {
return new MongoDbRule(mongoDb().databaseName(databaseName).port(port).build());
}
public MongoDbRule defaultSpringMongoDb(String databaseName) {
return new SpringMongoDbRule(mongoDb().databaseName(databaseName).build());
}
/**
* We can use defaultManagedMongoDb(String databaseName).
* @param databaseName
* @param target
* @return
*/
@Deprecated
public MongoDbRule defaultManagedMongoDb(String databaseName, Object target) {
return new MongoDbRule(mongoDb().databaseName(databaseName).build(), target);
}
public MongoDbRule build() {
if(this.mongoDbConfiguration == null) {
throw new IllegalArgumentException("Configuration object should be provided.");
}
return new MongoDbRule(mongoDbConfiguration, target);
}
}
public MongoDbRule(MongoDbConfiguration mongoDbConfiguration) {
super(mongoDbConfiguration.getConnectionIdentifier());
try {
databaseOperation = new MongoOperation(mongoDbConfiguration);
} catch (MongoException e) {
throw new IllegalArgumentException(e);
}
}
/*With JUnit 10 is impossible to get target from a Rule, it seems that future versions will support it. For now constructor is apporach is the only way.*/
public MongoDbRule(MongoDbConfiguration mongoDbConfiguration, Object target) {
super(mongoDbConfiguration.getConnectionIdentifier());
try {
setTarget(target);
databaseOperation = new MongoOperation(mongoDbConfiguration);
} catch (MongoException e) {
throw new IllegalArgumentException(e);
}
}
@Override
public DatabaseOperation<MongoClient> getDatabaseOperation() {
return this.databaseOperation;
}
@Override
public String getWorkingExtension() {
return EXTENSION;
}
@Override
public void close() {
this.databaseOperation.connectionManager().close();
}
}