package com.lordofthejars.nosqlunit.mongodb.integration; import static com.lordofthejars.nosqlunit.mongodb.ManagedMongoDb.MongoServerRuleBuilder.newManagedMongoDbRule; import static com.lordofthejars.nosqlunit.mongodb.MongoDbConfigurationBuilder.mongoDb; import com.mongodb.MongoClient; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import java.lang.reflect.Method; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.Description; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import com.lordofthejars.nosqlunit.mongodb.integration.UsingDataSetAnnotationTest; import com.lordofthejars.nosqlunit.mongodb.integration.ShouldMatchDataSetAnnotationTest; import com.lordofthejars.nosqlunit.annotation.ShouldMatchDataSet; import com.lordofthejars.nosqlunit.annotation.UsingDataSet; import com.lordofthejars.nosqlunit.core.LoadStrategyEnum; import com.lordofthejars.nosqlunit.core.NoSqlAssertionError; import com.lordofthejars.nosqlunit.mongodb.ManagedMongoDb; import com.lordofthejars.nosqlunit.mongodb.MongoDbConfiguration; import com.lordofthejars.nosqlunit.mongodb.MongoDbRule; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; public class WhenMongoDbRuleIsRegistered { @ClassRule public static ManagedMongoDb managedMongoDb = newManagedMongoDbRule().mongodPath("/opt/mongo").build(); @Test(expected = NoSqlAssertionError.class) public void should_fail_if_expected_data_is_non_strict_equal() throws Throwable { MongoDbConfiguration mongoDbConfiguration = mongoDb().databaseName("test").build(); MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDbConfiguration); Statement noStatement = new Statement() { @Override public void evaluate() throws Throwable { } }; FrameworkMethod frameworkMethod = frameworkMethod(MyTestClass.class, "my_wrong_test"); Statement mongodbStatement = remoteMongoDbRule.apply(noStatement, frameworkMethod, new MyTestClass()); mongodbStatement.evaluate(); } @Test public void should_assert_if_expected_data_is_strict_equal() throws Throwable { MongoDbConfiguration mongoDbConfiguration = mongoDb().databaseName("test").build(); MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDbConfiguration); Statement noStatement = new Statement() { @Override public void evaluate() throws Throwable { } }; FrameworkMethod frameworkMethod = frameworkMethod(MyTestClass.class, "my_equal_test"); Statement mongodbStatement = remoteMongoDbRule.apply(noStatement, frameworkMethod, new MyTestClass()); mongodbStatement.evaluate(); } @Test public void should_clean_dataset_with_delete_all_strategy() throws Throwable { MongoDbConfiguration mongoDbConfiguration = mongoDb().databaseName("test").build(); MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDbConfiguration); Statement noStatement = new Statement() { @Override public void evaluate() throws Throwable { } }; FrameworkMethod frameworkMethod = frameworkMethod(MyTestClass.class, "my_delete_test"); Statement mongodbStatement = remoteMongoDbRule.apply(noStatement, frameworkMethod, new MyTestClass()); mongodbStatement.evaluate(); DBObject currentData = findOneDBOjectByParameter("collection1", "id", 1); assertThat(currentData, nullValue()); } @Test public void should_insert_new_dataset_with_insert_strategy() throws Throwable { MongoDbConfiguration mongoDbConfiguration = mongoDb().databaseName("test").build(); MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDbConfiguration); Statement noStatement = new Statement() { @Override public void evaluate() throws Throwable { } }; FrameworkMethod frameworkMethod = frameworkMethod(MyTestClass.class, "my_insert_test_1"); MyTestClass testObject = new MyTestClass(); Statement mongodbStatement = remoteMongoDbRule.apply(noStatement, frameworkMethod, testObject); mongodbStatement.evaluate(); DBObject currentData = findOneDBOjectByParameter("collection1", "id", 1); assertThat((String) currentData.get("code"), is("JSON dataset")); FrameworkMethod frameworkMethod2 = frameworkMethod(MyTestClass.class, "my_insert_test_2"); Statement mongodbStatement2 = remoteMongoDbRule.apply(noStatement, frameworkMethod2, testObject); mongodbStatement2.evaluate(); DBObject previousData = findOneDBOjectByParameter("collection1", "id", 1); assertThat((String) previousData.get("code"), is("JSON dataset")); DBObject data = findOneDBOjectByParameter("collection3", "id", 6); assertThat((String) data.get("code"), is("Another row")); } @Test public void should_clean_previous_data_and_insert_new_dataset_with_clean_insert_strategy() throws Throwable { MongoDbConfiguration mongoDbConfiguration = mongoDb().databaseName("test").build(); MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDbConfiguration); Statement noStatement = new Statement() { @Override public void evaluate() throws Throwable { } }; FrameworkMethod frameworkMethod = frameworkMethod(MyTestClass.class, "my_equal_test"); MyTestClass testObject = new MyTestClass(); Statement mongodbStatement = remoteMongoDbRule.apply(noStatement, frameworkMethod, testObject); mongodbStatement.evaluate(); DBObject currentData = findOneDBOjectByParameter("collection1", "id", 1); assertThat((String) currentData.get("code"), is("JSON dataset")); FrameworkMethod frameworkMethod2 = frameworkMethod(MyTestClass.class, "my_equal_test_2"); Statement mongodbStatement2 = remoteMongoDbRule.apply(noStatement, frameworkMethod2, testObject); mongodbStatement2.evaluate(); DBObject previousData = findOneDBOjectByParameter("collection1", "id", 1); assertThat(previousData, nullValue()); DBObject data = findOneDBOjectByParameter("collection3", "id", 6); assertThat((String) data.get("code"), is("Another row")); } private int countDBObjectsByParameter(String collectionName, String parameterName, Object value) throws UnknownHostException, MongoException { MongoClient mongo = new MongoClient("localhost"); DB mongodb = mongo.getDB("test"); DBCollection collection = mongodb.getCollection(collectionName); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put(parameterName, value); BasicDBObject basicDBObject = new BasicDBObject(parameters); DBCursor cursor = collection.find(basicDBObject); return cursor.count(); } private DBObject findOneDBOjectByParameter(String collectionName, String parameterName, Object value) throws UnknownHostException { MongoClient mongo = new MongoClient("localhost"); DB mongodb = mongo.getDB("test"); DBCollection collection = mongodb.getCollection(collectionName); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put(parameterName, value); BasicDBObject basicDBObject = new BasicDBObject(parameters); DBObject data = collection.findOne(basicDBObject); return data; } private FrameworkMethod frameworkMethod(Class<?> testClass, String methodName) { try { Method method = testClass.getMethod(methodName); return new FrameworkMethod(method); } catch (SecurityException e) { throw new IllegalArgumentException(e); } catch (NoSuchMethodException e) { throw new IllegalArgumentException(e); } } } class MyTestClass { @Test @UsingDataSet(locations = "json.test", loadStrategy = LoadStrategyEnum.CLEAN_INSERT) @ShouldMatchDataSet(location = "json3.test") public void my_wrong_test() { } @Test @UsingDataSet(locations = "json.test", loadStrategy = LoadStrategyEnum.CLEAN_INSERT) @ShouldMatchDataSet(location = "json.test") public void my_equal_test() { } @Test @UsingDataSet(locations = "json2.test", loadStrategy = LoadStrategyEnum.CLEAN_INSERT) public void my_equal_test_2() { } @Test @UsingDataSet(locations = "json.test", loadStrategy = LoadStrategyEnum.DELETE_ALL) public void my_delete_test() { } @Test @UsingDataSet(locations = "json.test", loadStrategy = LoadStrategyEnum.INSERT) public void my_insert_test_1() { } @Test @UsingDataSet(locations = "json2.test", loadStrategy = LoadStrategyEnum.INSERT) public void my_insert_test_2() { } }