You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2014/04/04 21:59:56 UTC

[1/2] git commit: METAMODEL-45: Externalized CouchDB connection info

Repository: incubator-metamodel
Updated Branches:
  refs/heads/master 7e4d0b984 -> 6b0f5f1a3


METAMODEL-45: Externalized CouchDB connection info

Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/f18d40d4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/f18d40d4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/f18d40d4

Branch: refs/heads/master
Commit: f18d40d431fa130f7a7692288a50c59ff3193655
Parents: 7e4d0b9
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Apr 4 21:44:41 2014 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Apr 4 21:44:41 2014 +0200

----------------------------------------------------------------------
 .../couchdb/CouchDbDataContextTest.java         | 115 +++++++++----------
 .../metamodel/couchdb/CouchDbTestCase.java      |  80 +++++++++++++
 2 files changed, 135 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/f18d40d4/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
index 9124717..5f8c7b7 100644
--- a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
+++ b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbDataContextTest.java
@@ -25,13 +25,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import junit.framework.TestCase;
-
-import org.ektorp.CouchDbConnector;
-import org.ektorp.DbAccessException;
-import org.ektorp.http.HttpClient;
-import org.ektorp.http.StdHttpClient;
-import org.ektorp.impl.StdCouchDbInstance;
 import org.apache.metamodel.UpdateCallback;
 import org.apache.metamodel.UpdateScript;
 import org.apache.metamodel.data.DataSet;
@@ -43,12 +36,12 @@ import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.util.SimpleTableDef;
+import org.ektorp.CouchDbConnector;
+import org.ektorp.http.HttpClient;
+import org.ektorp.http.StdHttpClient;
+import org.ektorp.impl.StdCouchDbInstance;
 
-public class CouchDbDataContextTest extends TestCase {
-
-    private static final String TEST_DATABASE_NAME = "eobjects_metamodel_test";
-
-    private boolean serverAvailable;
+public class CouchDbDataContextTest extends CouchDbTestCase {
 
     private HttpClient httpClient;
     private StdCouchDbInstance couchDbInstance;
@@ -58,27 +51,24 @@ public class CouchDbDataContextTest extends TestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        httpClient = new StdHttpClient.Builder().host("localhost").build();
 
-        // set up a simple database
-        couchDbInstance = new StdCouchDbInstance(httpClient);
+        if (isConfigured()) {
+            httpClient = new StdHttpClient.Builder().host(getHostname()).build();
 
-        try {
-            if (couchDbInstance.getAllDatabases().contains(TEST_DATABASE_NAME)) {
-                throw new IllegalStateException("Couch DB instance already has a database called " + TEST_DATABASE_NAME);
+            // set up a simple database
+            couchDbInstance = new StdCouchDbInstance(httpClient);
+
+            final String databaseName = getDatabaseName();
+            if (couchDbInstance.getAllDatabases().contains(databaseName)) {
+                throw new IllegalStateException("Couch DB instance already has a database called " + databaseName);
             }
-            connector = couchDbInstance.createConnector(TEST_DATABASE_NAME, true);
-            System.out.println("Running CouchDB integration tests");
-            serverAvailable = true;
-        } catch (DbAccessException e) {
-            System.err.println("!!! WARNING: Skipping CouchDB tests because local server is not available");
-            e.printStackTrace();
-            serverAvailable = false;
+            connector = couchDbInstance.createConnector(databaseName, true);
+
+            final String[] columnNames = new String[] { "name", "gender", "age" };
+            final ColumnType[] columnTypes = new ColumnType[] { ColumnType.VARCHAR, ColumnType.CHAR, ColumnType.INTEGER };
+            predefinedTableDef = new SimpleTableDef(databaseName, columnNames, columnTypes);
         }
 
-        final String[] columnNames = new String[] { "name", "gender", "age" };
-        final ColumnType[] columnTypes = new ColumnType[] { ColumnType.VARCHAR, ColumnType.CHAR, ColumnType.INTEGER };
-        predefinedTableDef = new SimpleTableDef(TEST_DATABASE_NAME, columnNames, columnTypes);
     }
 
     @Override
@@ -87,15 +77,16 @@ public class CouchDbDataContextTest extends TestCase {
 
         connector = null;
 
-        if (serverAvailable) {
-            couchDbInstance.deleteDatabase(TEST_DATABASE_NAME);
-        }
+        if (isConfigured()) {
+            couchDbInstance.deleteDatabase(getDatabaseName());
 
-        httpClient.shutdown();
+            httpClient.shutdown();
+        }
     }
 
     public void testWorkingWithMapsAndLists() throws Exception {
-        if (!serverAvailable) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
             return;
         }
 
@@ -139,7 +130,8 @@ public class CouchDbDataContextTest extends TestCase {
     }
 
     public void testCreateUpdateDeleteScenario() throws Exception {
-        if (!serverAvailable) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
             return;
         }
 
@@ -149,16 +141,16 @@ public class CouchDbDataContextTest extends TestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                callback.dropTable(TEST_DATABASE_NAME).execute();
+                callback.dropTable(getDatabaseName()).execute();
             }
         });
 
-        assertNull(dc.getDefaultSchema().getTableByName(TEST_DATABASE_NAME));
+        assertNull(dc.getDefaultSchema().getTableByName(getDatabaseName()));
 
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                Table table = callback.createTable(dc.getDefaultSchema(), TEST_DATABASE_NAME).withColumn("foo")
+                Table table = callback.createTable(dc.getDefaultSchema(), getDatabaseName()).withColumn("foo")
                         .ofType(ColumnType.VARCHAR).withColumn("greeting").ofType(ColumnType.VARCHAR).execute();
                 assertEquals("[_id, _rev, foo, greeting]", Arrays.toString(table.getColumnNames()));
             }
@@ -167,12 +159,12 @@ public class CouchDbDataContextTest extends TestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                callback.insertInto(TEST_DATABASE_NAME).value("foo", "bar").value("greeting", "hello").execute();
-                callback.insertInto(TEST_DATABASE_NAME).value("foo", "baz").value("greeting", "hi").execute();
+                callback.insertInto(getDatabaseName()).value("foo", "bar").value("greeting", "hello").execute();
+                callback.insertInto(getDatabaseName()).value("foo", "baz").value("greeting", "hi").execute();
             }
         });
 
-        DataSet ds = dc.query().from(TEST_DATABASE_NAME).select("_id", "foo", "greeting").execute();
+        DataSet ds = dc.query().from(getDatabaseName()).select("_id", "foo", "greeting").execute();
         assertTrue(ds.next());
         assertNotNull(ds.getRow().getValue(0));
         assertEquals("bar", ds.getRow().getValue(1));
@@ -187,13 +179,13 @@ public class CouchDbDataContextTest extends TestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                callback.update(TEST_DATABASE_NAME).value("greeting", "howdy").where("foo").isEquals("baz").execute();
+                callback.update(getDatabaseName()).value("greeting", "howdy").where("foo").isEquals("baz").execute();
 
-                callback.update(TEST_DATABASE_NAME).value("foo", "foo").where("foo").isEquals("bar").execute();
+                callback.update(getDatabaseName()).value("foo", "foo").where("foo").isEquals("bar").execute();
             }
         });
 
-        ds = dc.query().from(TEST_DATABASE_NAME).select("_id", "foo", "greeting").execute();
+        ds = dc.query().from(getDatabaseName()).select("_id", "foo", "greeting").execute();
         assertTrue(ds.next());
         assertNotNull(ds.getRow().getValue(0));
         assertEquals("foo", ds.getRow().getValue(1));
@@ -207,7 +199,8 @@ public class CouchDbDataContextTest extends TestCase {
     }
 
     public void testBasicQuery() throws Exception {
-        if (!serverAvailable) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
             return;
         }
 
@@ -232,21 +225,21 @@ public class CouchDbDataContextTest extends TestCase {
 
         // verify schema and execute query
         Schema schema = dc.getMainSchema();
-        assertEquals("[eobjects_metamodel_test]", Arrays.toString(schema.getTableNames()));
+        assertEquals("[" + getDatabaseName() + "]", Arrays.toString(schema.getTableNames()));
 
         assertEquals("[_id, _rev, age, gender, name]",
-                Arrays.toString(schema.getTableByName(TEST_DATABASE_NAME).getColumnNames()));
-        Column idColumn = schema.getTableByName(TEST_DATABASE_NAME).getColumnByName("_id");
+                Arrays.toString(schema.getTableByName(getDatabaseName()).getColumnNames()));
+        Column idColumn = schema.getTableByName(getDatabaseName()).getColumnByName("_id");
         assertEquals("Column[name=_id,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]",
                 idColumn.toString());
         assertTrue(idColumn.isPrimaryKey());
 
         assertEquals("Column[name=_rev,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]",
-                schema.getTableByName(TEST_DATABASE_NAME).getColumnByName("_rev").toString());
+                schema.getTableByName(getDatabaseName()).getColumnByName("_rev").toString());
 
         DataSet ds;
 
-        ds = dc.query().from(TEST_DATABASE_NAME).select("name").and("age").execute();
+        ds = dc.query().from(getDatabaseName()).select("name").and("age").execute();
         assertTrue(ds.next());
         assertEquals("Row[values=[John Doe, 30]]", ds.getRow().toString());
         assertTrue(ds.next());
@@ -254,7 +247,7 @@ public class CouchDbDataContextTest extends TestCase {
         assertFalse(ds.next());
         ds.close();
 
-        ds = dc.query().from(TEST_DATABASE_NAME).select("name").and("gender").where("age").isNull().execute();
+        ds = dc.query().from(getDatabaseName()).select("name").and("gender").where("age").isNull().execute();
         assertTrue(ds.next());
         assertEquals("Row[values=[Jane Doe, F]]", ds.getRow().toString());
         assertFalse(ds.next());
@@ -262,7 +255,8 @@ public class CouchDbDataContextTest extends TestCase {
     }
 
     public void testFirstRowAndLastRow() throws Exception {
-        if (!serverAvailable) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
             return;
         }
 
@@ -285,8 +279,8 @@ public class CouchDbDataContextTest extends TestCase {
         SimpleTableDef tableDef = CouchDbDataContext.detectTable(connector);
         CouchDbDataContext dc = new CouchDbDataContext(couchDbInstance, tableDef);
 
-        DataSet ds1 = dc.query().from(TEST_DATABASE_NAME).select("name").and("age").firstRow(2).execute();
-        DataSet ds2 = dc.query().from(TEST_DATABASE_NAME).select("name").and("age").maxRows(1).execute();
+        DataSet ds1 = dc.query().from(getDatabaseName()).select("name").and("age").firstRow(2).execute();
+        DataSet ds2 = dc.query().from(getDatabaseName()).select("name").and("age").maxRows(1).execute();
 
         assertTrue("Class: " + ds1.getClass().getName(), ds1 instanceof CouchDbDataSet);
         assertTrue("Class: " + ds2.getClass().getName(), ds2 instanceof CouchDbDataSet);
@@ -308,13 +302,14 @@ public class CouchDbDataContextTest extends TestCase {
     }
 
     public void testInsert() throws Exception {
-        if (!serverAvailable) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
             return;
         }
 
         // create datacontext using predefined table def
         CouchDbDataContext dc = new CouchDbDataContext(httpClient, predefinedTableDef);
-        Table table = dc.getTableByQualifiedLabel(TEST_DATABASE_NAME);
+        Table table = dc.getTableByQualifiedLabel(getDatabaseName());
         assertNotNull(table);
 
         assertEquals("[_id, _rev, name, gender, age]", Arrays.toString(table.getColumnNames()));
@@ -322,7 +317,7 @@ public class CouchDbDataContextTest extends TestCase {
         DataSet ds;
 
         // assert not rows in DB
-        ds = dc.query().from(TEST_DATABASE_NAME).selectCount().execute();
+        ds = dc.query().from(getDatabaseName()).selectCount().execute();
         assertTrue(ds.next());
         assertEquals(0, ((Number) ds.getRow().getValue(0)).intValue());
         assertFalse(ds.next());
@@ -331,19 +326,19 @@ public class CouchDbDataContextTest extends TestCase {
         dc.executeUpdate(new UpdateScript() {
             @Override
             public void run(UpdateCallback callback) {
-                callback.insertInto(TEST_DATABASE_NAME).value("name", "foo").value("gender", 'M').execute();
-                callback.insertInto(TEST_DATABASE_NAME).value("name", "bar").value("age", 32).execute();
+                callback.insertInto(getDatabaseName()).value("name", "foo").value("gender", 'M').execute();
+                callback.insertInto(getDatabaseName()).value("name", "bar").value("age", 32).execute();
             }
         });
 
         // now count should be 2
-        ds = dc.query().from(TEST_DATABASE_NAME).selectCount().execute();
+        ds = dc.query().from(getDatabaseName()).selectCount().execute();
         assertTrue(ds.next());
         assertEquals(2, ((Number) ds.getRow().getValue(0)).intValue());
         assertFalse(ds.next());
         ds.close();
 
-        ds = dc.query().from(TEST_DATABASE_NAME).select("name", "gender", "age").execute();
+        ds = dc.query().from(getDatabaseName()).select("name", "gender", "age").execute();
         assertTrue(ds.next());
         assertEquals("Row[values=[foo, M, null]]", ds.getRow().toString());
         assertTrue(ds.next());

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/f18d40d4/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbTestCase.java
----------------------------------------------------------------------
diff --git a/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbTestCase.java b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbTestCase.java
new file mode 100644
index 0000000..bfcc24a
--- /dev/null
+++ b/couchdb/src/test/java/org/apache/metamodel/couchdb/CouchDbTestCase.java
@@ -0,0 +1,80 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.couchdb;
+
+import java.io.File;
+import java.io.FileReader;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+public abstract class CouchDbTestCase extends TestCase {
+    
+    private static final String DEFAULT_TEST_DATABASE_NAME = "eobjects_metamodel_test";
+
+    private String _hostname;
+    private boolean _configured;
+    private String _databaseName;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        Properties properties = new Properties();
+        File file = new File(getPropertyFilePath());
+        if (file.exists()) {
+            properties.load(new FileReader(file));
+            _hostname = properties.getProperty("couchdb.hostname");
+            _databaseName = properties.getProperty("couchdb.databaseName");
+            if (_databaseName == null || _databaseName.isEmpty()) {
+                _databaseName = DEFAULT_TEST_DATABASE_NAME;
+            }
+            
+            _configured = (_hostname != null && !_hostname.isEmpty());
+            
+            if (_configured) {
+                System.out.println("Loaded CouchDB configuration. Hostname=" + _hostname + ", Database=" + _databaseName);
+            }
+        } else {
+            _configured = false;
+        }
+    }
+
+    private String getPropertyFilePath() {
+        String userHome = System.getProperty("user.home");
+        return userHome + "/metamodel-integrationtest-configuration.properties";
+    }
+
+    protected String getInvalidConfigurationMessage() {
+        return "!!! WARN !!! CouchDB module ignored\r\n" + "Please configure couchdb connection locally ("
+                + getPropertyFilePath() + "), to run integration tests";
+    }
+
+    public boolean isConfigured() {
+        return _configured;
+    }
+    
+    public String getHostname() {
+        return _hostname;
+    }
+
+    public String getDatabaseName() {
+        return _databaseName;
+    }
+}


[2/2] git commit: Externalized MongoDB integration test connection information.

Posted by ka...@apache.org.
Externalized MongoDB integration test connection information.

Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/6b0f5f1a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/6b0f5f1a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/6b0f5f1a

Branch: refs/heads/master
Commit: 6b0f5f1a35cb368763f7e75b307986e604513cd8
Parents: f18d40d
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Apr 4 21:59:34 2014 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Apr 4 21:59:34 2014 +0200

----------------------------------------------------------------------
 ...del-integrationtest-configuration.properties |  15 +
 .../mongodb/MongoDbDataContextTest.java         | 586 +++++++++----------
 .../metamodel/mongodb/MongoDbTestCase.java      |  94 +++
 3 files changed, 395 insertions(+), 300 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/6b0f5f1a/example-metamodel-integrationtest-configuration.properties
----------------------------------------------------------------------
diff --git a/example-metamodel-integrationtest-configuration.properties b/example-metamodel-integrationtest-configuration.properties
index 6311be9..40d0346 100644
--- a/example-metamodel-integrationtest-configuration.properties
+++ b/example-metamodel-integrationtest-configuration.properties
@@ -7,6 +7,21 @@
 # -----------
 # To use this file, copy it into your user home directory and uncomment the lines of relevance to you
 
+# --------------------------
+# CouchDB module properties:
+# --------------------------
+
+#couchdb.hostname=localhost
+#couchdb.databaseName=metamodel_test_database
+
+# --------------------------
+# MongoDB module properties:
+# --------------------------
+
+#mongodb.hostname=localhost
+#mongodb.databaseName=metamodel_test
+#mongodb.collectionName=my_collection
+
 # ------------------------
 # HBase module properties:
 # ------------------------

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/6b0f5f1a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
----------------------------------------------------------------------
diff --git a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
index 92d54f6..b539160 100644
--- a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
+++ b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbDataContextTest.java
@@ -24,8 +24,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import junit.framework.TestCase;
-
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.UpdateCallback;
 import org.apache.metamodel.UpdateScript;
@@ -43,365 +41,353 @@ import com.mongodb.DB;
 import com.mongodb.DBCollection;
 import com.mongodb.Mongo;
 
-public class MongoDbDataContextTest extends TestCase {
-
-    private static final boolean SKIP_TEST_WHEN_NO_CONNECTION = true;
+public class MongoDbDataContextTest extends MongoDbTestCase {
 
     private DB db;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        Mongo mongo = new Mongo();
-        db = mongo.getDB("metamodel_test");
+        if (isConfigured()) {
+            Mongo mongo = new Mongo(getHostname());
+            db = mongo.getDB(getDatabaseName());
+        }
     }
 
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
-        if (proceedWithUnitTest()) {
+        if (isConfigured()) {
             db.dropDatabase();
         }
     }
 
-    private boolean proceedWithUnitTest() {
-        try {
-            // this will invoke a call over the connection
-            db.getCollectionNames();
-            System.out.println("MongoDB connection is open!");
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-
-            if (SKIP_TEST_WHEN_NO_CONNECTION) {
-                System.out.println("WARNING!!! Skipping test because mongo server is not running!");
-            }
-
-            return !SKIP_TEST_WHEN_NO_CONNECTION;
-        }
-    }
-
     public void testFirstRowAndMaxRows() throws Exception {
-        if (proceedWithUnitTest()) {
-            DBCollection col = db.createCollection("my_collection", null);
-
-            // delete if already exists
-            {
-                col.drop();
-                col = db.createCollection("my_collection", null);
-            }
-
-            // create 3 records
-            for (int i = 0; i < 3; i++) {
-                BasicDBObject dbRow = new BasicDBObject();
-                dbRow.put("id", i + 1);
-                col.insert(dbRow);
-            }
-
-            final MongoDbDataContext dc = new MongoDbDataContext(db);
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
+            return;
+        }
 
-            DataSet ds;
+        DBCollection col = db.createCollection(getCollectionName(), null);
 
-            ds = dc.query().from("my_collection").select("id").firstRow(2).execute();
-            assertTrue(ds instanceof MongoDbDataSet);
-            assertTrue(ds.next());
-            assertEquals("Row[values=[2]]", ds.getRow().toString());
-            assertTrue(ds.next());
-            assertEquals("Row[values=[3]]", ds.getRow().toString());
-            assertFalse(ds.next());
-            ds.close();
-
-            ds = dc.query().from("my_collection").select("id").maxRows(1).execute();
-            assertTrue(ds instanceof MongoDbDataSet);
-            assertTrue(ds.next());
-            assertEquals("Row[values=[1]]", ds.getRow().toString());
-            assertFalse(ds.next());
-            ds.close();
+        // delete if already exists
+        {
+            col.drop();
+            col = db.createCollection(getCollectionName(), null);
+        }
 
-            ds = dc.query().from("my_collection").select("id").maxRows(1).firstRow(2).execute();
-            assertTrue(ds instanceof MongoDbDataSet);
-            assertTrue(ds.next());
-            assertEquals("Row[values=[2]]", ds.getRow().toString());
-            assertFalse(ds.next());
-            ds.close();
+        // create 3 records
+        for (int i = 0; i < 3; i++) {
+            BasicDBObject dbRow = new BasicDBObject();
+            dbRow.put("id", i + 1);
+            col.insert(dbRow);
         }
+
+        final MongoDbDataContext dc = new MongoDbDataContext(db);
+
+        DataSet ds;
+
+        ds = dc.query().from(getCollectionName()).select("id").firstRow(2).execute();
+        assertTrue(ds instanceof MongoDbDataSet);
+        assertTrue(ds.next());
+        assertEquals("Row[values=[2]]", ds.getRow().toString());
+        assertTrue(ds.next());
+        assertEquals("Row[values=[3]]", ds.getRow().toString());
+        assertFalse(ds.next());
+        ds.close();
+
+        ds = dc.query().from(getCollectionName()).select("id").maxRows(1).execute();
+        assertTrue(ds instanceof MongoDbDataSet);
+        assertTrue(ds.next());
+        assertEquals("Row[values=[1]]", ds.getRow().toString());
+        assertFalse(ds.next());
+        ds.close();
+
+        ds = dc.query().from(getCollectionName()).select("id").maxRows(1).firstRow(2).execute();
+        assertTrue(ds instanceof MongoDbDataSet);
+        assertTrue(ds.next());
+        assertEquals("Row[values=[2]]", ds.getRow().toString());
+        assertFalse(ds.next());
+        ds.close();
     }
 
     public void testRead() throws Exception {
-        if (proceedWithUnitTest()) {
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
+            return;
+        }
 
-            DBCollection col = db.createCollection("my_collection", null);
+        DBCollection col = db.createCollection(getCollectionName(), null);
+
+        // delete if already exists
+        {
+            col.drop();
+            col = db.createCollection(getCollectionName(), null);
+        }
 
-            // delete if already exists
-            {
-                col.drop();
-                col = db.createCollection("my_collection", null);
+        // create 1000 records
+        for (int i = 0; i < 1000; i++) {
+            BasicDBObject dbRow = new BasicDBObject();
+            dbRow.put("id", i);
+            dbRow.put("name", "record no. " + i);
+            if (i % 5 == 0) {
+                dbRow.put("foo", "bar");
+            } else {
+                dbRow.put("foo", "baz");
             }
+            BasicDBObject nestedObj = new BasicDBObject();
+            nestedObj.put("count", i);
+            nestedObj.put("constant", "foobarbaz");
+            dbRow.put("baz", nestedObj);
 
-            // create 1000 records
-            for (int i = 0; i < 1000; i++) {
-                BasicDBObject dbRow = new BasicDBObject();
-                dbRow.put("id", i);
-                dbRow.put("name", "record no. " + i);
-                if (i % 5 == 0) {
-                    dbRow.put("foo", "bar");
-                } else {
-                    dbRow.put("foo", "baz");
-                }
-                BasicDBObject nestedObj = new BasicDBObject();
-                nestedObj.put("count", i);
-                nestedObj.put("constant", "foobarbaz");
-                dbRow.put("baz", nestedObj);
+            dbRow.put("list", Arrays.<Object> asList("l1", "l2", "l3", i));
 
-                dbRow.put("list", Arrays.<Object> asList("l1", "l2", "l3", i));
+            col.insert(dbRow);
+        }
 
-                col.insert(dbRow);
-            }
+        // Instantiate the actual data context
+        final DataContext dataContext = new MongoDbDataContext(db);
 
-            // Instantiate the actual data context
-            final DataContext dataContext = new MongoDbDataContext(db);
-
-            assertEquals("[my_collection, system.indexes]",
-                    Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
-            Table table = dataContext.getDefaultSchema().getTableByName("my_collection");
-            assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames()));
-
-            assertEquals(ColumnType.MAP, table.getColumnByName("baz").getType());
-            assertEquals(ColumnType.VARCHAR, table.getColumnByName("foo").getType());
-            assertEquals(ColumnType.LIST, table.getColumnByName("list").getType());
-            assertEquals(ColumnType.INTEGER, table.getColumnByName("id").getType());
-            assertEquals(ColumnType.ROWID, table.getColumnByName("_id").getType());
-
-            DataSet ds = dataContext.query().from("my_collection").select("name").and("foo").and("baz").and("list")
-                    .where("id").greaterThan(800).or("foo").isEquals("bar").execute();
-            assertEquals(MongoDbDataSet.class, ds.getClass());
-            assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
-            try {
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 0, bar, {count=0, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 0]]]",
-                        ds.getRow().toString());
+        assertEquals("[" + getCollectionName() + ", system.indexes]", Arrays.toString(dataContext.getDefaultSchema().getTableNames()));
+        Table table = dataContext.getDefaultSchema().getTableByName(getCollectionName());
+        assertEquals("[_id, baz, foo, id, list, name]", Arrays.toString(table.getColumnNames()));
 
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 5, bar, {count=5, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 5]]]",
-                        ds.getRow().toString());
+        assertEquals(ColumnType.MAP, table.getColumnByName("baz").getType());
+        assertEquals(ColumnType.VARCHAR, table.getColumnByName("foo").getType());
+        assertEquals(ColumnType.LIST, table.getColumnByName("list").getType());
+        assertEquals(ColumnType.INTEGER, table.getColumnByName("id").getType());
+        assertEquals(ColumnType.ROWID, table.getColumnByName("_id").getType());
 
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 10, bar, {count=10, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 10]]]",
-                        ds.getRow().toString());
-
-                for (int j = 15; j < 801; j++) {
-                    if (j % 5 == 0) {
-                        assertTrue(ds.next());
-                        assertEquals("Row[values=[record no. " + j + ", bar, {count=" + j
-                                + ", constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , " + j + "]]]", ds.getRow()
-                                .toString());
-                    }
-                }
-
-                assertTrue(ds.next());
-                assertTrue(ds.getRow().getValue(2) instanceof Map);
-                assertEquals(LinkedHashMap.class, ds.getRow().getValue(2).getClass());
+        DataSet ds = dataContext.query().from(getCollectionName()).select("name").and("foo").and("baz").and("list")
+                .where("id").greaterThan(800).or("foo").isEquals("bar").execute();
+        assertEquals(MongoDbDataSet.class, ds.getClass());
+        assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
+        try {
+            assertTrue(ds.next());
+            assertEquals(
+                    "Row[values=[record no. 0, bar, {count=0, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 0]]]",
+                    ds.getRow().toString());
 
-                assertTrue("unexpected type: " + ds.getRow().getValue(3).getClass(),
-                        ds.getRow().getValue(3) instanceof List);
-                assertEquals(BasicDBList.class, ds.getRow().getValue(3).getClass());
+            assertTrue(ds.next());
+            assertEquals(
+                    "Row[values=[record no. 5, bar, {count=5, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 5]]]",
+                    ds.getRow().toString());
 
-                assertEquals(
-                        "Row[values=[record no. 801, baz, {count=801, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 801]]]",
-                        ds.getRow().toString());
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 802, baz, {count=802, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 802]]]",
-                        ds.getRow().toString());
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 803, baz, {count=803, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 803]]]",
-                        ds.getRow().toString());
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 804, baz, {count=804, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 804]]]",
-                        ds.getRow().toString());
-                assertTrue(ds.next());
-                assertEquals(
-                        "Row[values=[record no. 805, bar, {count=805, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 805]]]",
-                        ds.getRow().toString());
+            assertTrue(ds.next());
+            assertEquals(
+                    "Row[values=[record no. 10, bar, {count=10, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 10]]]",
+                    ds.getRow().toString());
 
-                for (int i = 0; i < 194; i++) {
+            for (int j = 15; j < 801; j++) {
+                if (j % 5 == 0) {
                     assertTrue(ds.next());
+                    assertEquals("Row[values=[record no. " + j + ", bar, {count=" + j
+                            + ", constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , " + j + "]]]", ds.getRow()
+                            .toString());
                 }
-                assertEquals(
-                        "Row[values=[record no. 999, baz, {count=999, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 999]]]",
-                        ds.getRow().toString());
-                assertFalse(ds.next());
-            } finally {
-                ds.close();
             }
 
-            ds = dataContext.query().from("my_collection").select("id").and("name").where("id").in(2, 6, 8, 9)
-                    .execute();
             assertTrue(ds.next());
-            assertEquals("Row[values=[2, record no. 2]]", ds.getRow().toString());
+            assertTrue(ds.getRow().getValue(2) instanceof Map);
+            assertEquals(LinkedHashMap.class, ds.getRow().getValue(2).getClass());
+
+            assertTrue("unexpected type: " + ds.getRow().getValue(3).getClass(),
+                    ds.getRow().getValue(3) instanceof List);
+            assertEquals(BasicDBList.class, ds.getRow().getValue(3).getClass());
+
+            assertEquals(
+                    "Row[values=[record no. 801, baz, {count=801, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 801]]]",
+                    ds.getRow().toString());
             assertTrue(ds.next());
-            assertEquals("Row[values=[6, record no. 6]]", ds.getRow().toString());
+            assertEquals(
+                    "Row[values=[record no. 802, baz, {count=802, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 802]]]",
+                    ds.getRow().toString());
             assertTrue(ds.next());
-            assertEquals("Row[values=[8, record no. 8]]", ds.getRow().toString());
+            assertEquals(
+                    "Row[values=[record no. 803, baz, {count=803, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 803]]]",
+                    ds.getRow().toString());
             assertTrue(ds.next());
-            assertEquals("Row[values=[9, record no. 9]]", ds.getRow().toString());
-            assertFalse(ds.next());
-            ds.close();
+            assertEquals(
+                    "Row[values=[record no. 804, baz, {count=804, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 804]]]",
+                    ds.getRow().toString());
+            assertTrue(ds.next());
+            assertEquals(
+                    "Row[values=[record no. 805, bar, {count=805, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 805]]]",
+                    ds.getRow().toString());
 
-            ds = dataContext.query().from("my_collection").select("id").and("name").where("foo").isEquals("bar")
-                    .execute();
-            assertEquals(MongoDbDataSet.class, ds.getClass());
-            assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
-
-            try {
-                List<Object[]> objectArrays = ds.toObjectArrays();
-                assertEquals(200, objectArrays.size());
-                assertEquals("[0, record no. 0]", Arrays.toString(objectArrays.get(0)));
-            } finally {
-                ds.close();
+            for (int i = 0; i < 194; i++) {
+                assertTrue(ds.next());
             }
-
-            // test a primary key lookup query
-            BasicDBObject dbRow = new BasicDBObject();
-            dbRow.put("_id", 123456);
-            dbRow.put("id", 123456);
-            dbRow.put("name", "record no. " + 123456);
-            dbRow.put("foo", "bar123456");
-            BasicDBObject nestedObj = new BasicDBObject();
-            nestedObj.put("count", 123456);
-            nestedObj.put("constant", "foobarbaz");
-            dbRow.put("baz", nestedObj);
-
-            dbRow.put("list", Arrays.<Object> asList("l1", "l2", "l3", 123456));
-
-            col.insert(dbRow);
-
-            ds = dataContext.query().from("my_collection").select("id").and("name").where("_id").eq(123456).execute();
-            assertTrue(ds.next());
-            assertEquals("Row[values=[123456, record no. 123456]]", ds.getRow().toString());
+            assertEquals(
+                    "Row[values=[record no. 999, baz, {count=999, constant=foobarbaz}, [ \"l1\" , \"l2\" , \"l3\" , 999]]]",
+                    ds.getRow().toString());
             assertFalse(ds.next());
+        } finally {
+            ds.close();
+        }
 
-            // do a query that we cannot push to mongo
-            ds = dataContext.query().from("my_collection")
-                    .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[0].getColumnByName("id"))
-                    .where("foo").isEquals("bar").execute();
-            assertEquals(InMemoryDataSet.class, ds.getClass());
+        ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("id").in(2, 6, 8, 9)
+                .execute();
+        assertTrue(ds.next());
+        assertEquals("Row[values=[2, record no. 2]]", ds.getRow().toString());
+        assertTrue(ds.next());
+        assertEquals("Row[values=[6, record no. 6]]", ds.getRow().toString());
+        assertTrue(ds.next());
+        assertEquals("Row[values=[8, record no. 8]]", ds.getRow().toString());
+        assertTrue(ds.next());
+        assertEquals("Row[values=[9, record no. 9]]", ds.getRow().toString());
+        assertFalse(ds.next());
+        ds.close();
+
+        ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("foo").isEquals("bar")
+                .execute();
+        assertEquals(MongoDbDataSet.class, ds.getClass());
+        assertFalse(((MongoDbDataSet) ds).isQueryPostProcessed());
 
+        try {
+            List<Object[]> objectArrays = ds.toObjectArrays();
+            assertEquals(200, objectArrays.size());
+            assertEquals("[0, record no. 0]", Arrays.toString(objectArrays.get(0)));
+        } finally {
             ds.close();
         }
+
+        // test a primary key lookup query
+        BasicDBObject dbRow = new BasicDBObject();
+        dbRow.put("_id", 123456);
+        dbRow.put("id", 123456);
+        dbRow.put("name", "record no. " + 123456);
+        dbRow.put("foo", "bar123456");
+        BasicDBObject nestedObj = new BasicDBObject();
+        nestedObj.put("count", 123456);
+        nestedObj.put("constant", "foobarbaz");
+        dbRow.put("baz", nestedObj);
+
+        dbRow.put("list", Arrays.<Object> asList("l1", "l2", "l3", 123456));
+
+        col.insert(dbRow);
+
+        ds = dataContext.query().from(getCollectionName()).select("id").and("name").where("_id").eq(123456).execute();
+        assertTrue(ds.next());
+        assertEquals("Row[values=[123456, record no. 123456]]", ds.getRow().toString());
+        assertFalse(ds.next());
+
+        // do a query that we cannot push to mongo
+        ds = dataContext.query().from(getCollectionName())
+                .select(FunctionType.SUM, dataContext.getDefaultSchema().getTables()[0].getColumnByName("id"))
+                .where("foo").isEquals("bar").execute();
+        assertEquals(InMemoryDataSet.class, ds.getClass());
+
+        ds.close();
     }
 
     public void testCreateAndWriteData() throws Exception {
-        if (proceedWithUnitTest()) {
-            final MongoDbDataContext dc = new MongoDbDataContext(db);
-            final Schema defaultSchema = dc.getDefaultSchema();
-
-            dc.executeUpdate(new UpdateScript() {
-                @Override
-                public void run(UpdateCallback callback) {
-                    Table[] tables = defaultSchema.getTables();
-                    for (Table table : tables) {
-                        callback.deleteFrom(table).execute();
-                    }
+        if (!isConfigured()) {
+            System.err.println(getInvalidConfigurationMessage());
+            return;
+        }
+        final MongoDbDataContext dc = new MongoDbDataContext(db);
+        final Schema defaultSchema = dc.getDefaultSchema();
+
+        dc.executeUpdate(new UpdateScript() {
+            @Override
+            public void run(UpdateCallback callback) {
+                Table[] tables = defaultSchema.getTables();
+                for (Table table : tables) {
+                    callback.deleteFrom(table).execute();
                 }
-            });
-
-            assertEquals(0, defaultSchema.getTableCount());
+            }
+        });
 
-            dc.executeUpdate(new UpdateScript() {
+        assertEquals(0, defaultSchema.getTableCount());
 
-                @Override
-                public void run(UpdateCallback callback) {
-                    Table table = callback.createTable(defaultSchema, "some_entries").withColumn("foo")
-                            .withColumn("bar").withColumn("baz").withColumn("list").execute();
+        dc.executeUpdate(new UpdateScript() {
 
-                    callback.insertInto(table).value("foo", 1).value("bar", "hello").execute();
-                    callback.insertInto(table).value("foo", 2).value("bar", "world").execute();
-                    callback.insertInto(table).value("foo", 3).value("bar", "hi").execute();
+            @Override
+            public void run(UpdateCallback callback) {
+                Table table = callback.createTable(defaultSchema, "some_entries").withColumn("foo").withColumn("bar")
+                        .withColumn("baz").withColumn("list").execute();
 
-                    Map<String, Object> nestedObj = new HashMap<String, Object>();
-                    nestedObj.put("foo", "bar");
-                    nestedObj.put("123", 456);
+                callback.insertInto(table).value("foo", 1).value("bar", "hello").execute();
+                callback.insertInto(table).value("foo", 2).value("bar", "world").execute();
+                callback.insertInto(table).value("foo", 3).value("bar", "hi").execute();
 
-                    callback.insertInto(table).value("foo", 4).value("bar", "there").value("baz", nestedObj)
-                            .value("list", Arrays.asList(1, 2, 3)).execute();
-                }
-            });
-
-            DataSet dataSet;
-            assertEquals(1, defaultSchema.getTableCount());
-
-            // "Pure" SELECT COUNT(*) query
-            dataSet = dc.query().from("some_entries").selectCount().execute();
-            dataSet.close();
-            assertTrue(dataSet.next());
-            assertEquals(1, dataSet.getSelectItems().length);
-            assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
-            assertEquals(4l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
-            assertFalse(dataSet.next());
-            assertEquals(InMemoryDataSet.class, dataSet.getClass());
-
-            // A conditional SELECT COUNT(*) query
-            dataSet = dc.query().from("some_entries").selectCount().where("foo").greaterThan(2).execute();
-            dataSet.close();
-            assertTrue(dataSet.next());
-            assertEquals(1, dataSet.getSelectItems().length);
-            assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
-            assertEquals(2l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
-            assertFalse(dataSet.next());
-            assertEquals(InMemoryDataSet.class, dataSet.getClass());
-
-            // Select columns
-            dataSet = dc.query().from("some_entries").select("foo").and("bar").and("baz").and("list").execute();
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[1, hello, null, null]]", dataSet.getRow().toString());
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[2, world, null, null]]", dataSet.getRow().toString());
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[3, hi, null, null]]", dataSet.getRow().toString());
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[4, there, {123=456, foo=bar}, [ 1 , 2 , 3]]]", dataSet.getRow().toString());
-            assertFalse(dataSet.next());
-            dataSet.close();
-            assertEquals(MongoDbDataSet.class, dataSet.getClass());
-
-            // delete some records
-            dc.executeUpdate(new UpdateScript() {
-                @Override
-                public void run(UpdateCallback callback) {
-                    callback.deleteFrom("some_entries").where("foo").greaterThan(2).where("baz").isNotNull().execute();
-                }
-            });
-
-            dataSet = dc.query().from("some_entries").select("foo").execute();
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[1]]", dataSet.getRow().toString());
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[2]]", dataSet.getRow().toString());
-            assertTrue(dataSet.next());
-            assertEquals("Row[values=[3]]", dataSet.getRow().toString());
-            assertFalse(dataSet.next());
-            dataSet.close();
-            assertEquals(MongoDbDataSet.class, dataSet.getClass());
-
-            // drop the collection
-            dc.executeUpdate(new UpdateScript() {
-                @Override
-                public void run(UpdateCallback callback) {
-                    callback.dropTable("some_entries").execute();
-                }
-            });
+                Map<String, Object> nestedObj = new HashMap<String, Object>();
+                nestedObj.put("foo", "bar");
+                nestedObj.put("123", 456);
 
-            assertNull(dc.getTableByQualifiedLabel("some_entries"));
+                callback.insertInto(table).value("foo", 4).value("bar", "there").value("baz", nestedObj)
+                        .value("list", Arrays.asList(1, 2, 3)).execute();
+            }
+        });
+
+        DataSet dataSet;
+        assertEquals(1, defaultSchema.getTableCount());
+
+        // "Pure" SELECT COUNT(*) query
+        dataSet = dc.query().from("some_entries").selectCount().execute();
+        dataSet.close();
+        assertTrue(dataSet.next());
+        assertEquals(1, dataSet.getSelectItems().length);
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(4l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
+        assertFalse(dataSet.next());
+        assertEquals(InMemoryDataSet.class, dataSet.getClass());
+
+        // A conditional SELECT COUNT(*) query
+        dataSet = dc.query().from("some_entries").selectCount().where("foo").greaterThan(2).execute();
+        dataSet.close();
+        assertTrue(dataSet.next());
+        assertEquals(1, dataSet.getSelectItems().length);
+        assertEquals(SelectItem.getCountAllItem(), dataSet.getSelectItems()[0]);
+        assertEquals(2l, dataSet.getRow().getValue(SelectItem.getCountAllItem()));
+        assertFalse(dataSet.next());
+        assertEquals(InMemoryDataSet.class, dataSet.getClass());
+
+        // Select columns
+        dataSet = dc.query().from("some_entries").select("foo").and("bar").and("baz").and("list").execute();
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[1, hello, null, null]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[2, world, null, null]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[3, hi, null, null]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[4, there, {123=456, foo=bar}, [ 1 , 2 , 3]]]", dataSet.getRow().toString());
+        assertFalse(dataSet.next());
+        dataSet.close();
+        assertEquals(MongoDbDataSet.class, dataSet.getClass());
+
+        // delete some records
+        dc.executeUpdate(new UpdateScript() {
+            @Override
+            public void run(UpdateCallback callback) {
+                callback.deleteFrom("some_entries").where("foo").greaterThan(2).where("baz").isNotNull().execute();
+            }
+        });
+
+        dataSet = dc.query().from("some_entries").select("foo").execute();
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[1]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[2]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[3]]", dataSet.getRow().toString());
+        assertFalse(dataSet.next());
+        dataSet.close();
+        assertEquals(MongoDbDataSet.class, dataSet.getClass());
+
+        // drop the collection
+        dc.executeUpdate(new UpdateScript() {
+            @Override
+            public void run(UpdateCallback callback) {
+                callback.dropTable("some_entries").execute();
+            }
+        });
 
-            dc.refreshSchemas();
-            assertEquals(0, defaultSchema.getTableCount());
-        }
+        assertNull(dc.getTableByQualifiedLabel("some_entries"));
 
+        dc.refreshSchemas();
+        assertEquals(0, defaultSchema.getTableCount());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/6b0f5f1a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbTestCase.java
----------------------------------------------------------------------
diff --git a/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbTestCase.java b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbTestCase.java
new file mode 100644
index 0000000..446f368
--- /dev/null
+++ b/mongodb/src/test/java/org/apache/metamodel/mongodb/MongoDbTestCase.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.mongodb;
+
+import java.io.File;
+import java.io.FileReader;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+public abstract class MongoDbTestCase extends TestCase {
+
+    private static final String DEFAULT_TEST_COLLECTION_NAME = "my_collection";
+    private static final String DEFAULT_TEST_DATABASE_NAME = "metamodel_test";
+
+    private String _hostname;
+    private String _collectionName;
+    private boolean _configured;
+
+    private String _databaseName;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        Properties properties = new Properties();
+        File file = new File(getPropertyFilePath());
+        if (file.exists()) {
+            properties.load(new FileReader(file));
+            _hostname = properties.getProperty("mongodb.hostname");
+            
+            _databaseName = properties.getProperty("mongodb.databaseName");
+            if (_databaseName == null || _databaseName.isEmpty()) {
+                _databaseName = DEFAULT_TEST_DATABASE_NAME;
+            }
+            
+            _collectionName = properties.getProperty("mongodb.collectionName");
+            if (_collectionName == null || _collectionName.isEmpty()) {
+                _collectionName = DEFAULT_TEST_COLLECTION_NAME;
+            }
+
+            _configured = (_hostname != null && !_hostname.isEmpty());
+
+            if (_configured) {
+                System.out.println("Loaded MongoDB configuration. Hostname=" + _hostname + ", Collection="
+                        + _collectionName);
+            }
+        } else {
+            _configured = false;
+        }
+    }
+
+    private String getPropertyFilePath() {
+        String userHome = System.getProperty("user.home");
+        return userHome + "/metamodel-integrationtest-configuration.properties";
+    }
+
+    protected String getInvalidConfigurationMessage() {
+        return "!!! WARN !!! MongoDB module ignored\r\n" + "Please configure mongodb connection locally ("
+                + getPropertyFilePath() + "), to run integration tests";
+    }
+    
+    public String getDatabaseName() {
+        return _databaseName;
+    }
+
+    public String getCollectionName() {
+        return _collectionName;
+    }
+
+    public String getHostname() {
+        return _hostname;
+    }
+    
+    public boolean isConfigured() {
+        return _configured;
+    }
+}