From 725f52c28f4077154dd96df76ab1217e873447b3 Mon Sep 17 00:00:00 2001 From: Fernando Nogueira Date: Mon, 4 Mar 2024 00:33:49 -0300 Subject: [PATCH] feat!: version 2 overhaul (#24) --- src/main/java/ox/engine/Ox.java | 54 ++---- src/main/java/ox/engine/OxConfig.java | 18 ++ src/main/java/ox/engine/OxConfigBuilder.java | 77 ++++++++ .../exception/DatabaseNotFoundException.java | 11 ++ .../exception/MissingCollectionException.java | 11 ++ .../ox/engine/internal/CreateIndexAction.java | 2 - .../ox/engine/internal/MongoDBConnector.java | 155 +++++++++------ .../internal/MongoDBConnectorConfig.java | 114 +++++++++-- .../ox/engine/internal/OxEnvironment.java | 6 +- .../java/ox/engine/OxMigrationDownTest.java | 58 ------ src/test/java/ox/engine/OxMigrationTest.java | 38 ++-- .../engine/internal/MongoDBConnectorTest.java | 183 ++++-------------- .../ValidateRemoveIndexActionTest.java | 8 +- .../CustomMigrationsCollectionTest.java | 38 ++++ .../ox/integration/DatabaseNotFoundTest.java | 24 +++ .../FailOnMissingCollectionTest.java | 24 +++ .../{partial => }/PartialExecutionTest.java | 16 +- .../java/ox/integration/RollbackTest.java | 33 ++++ .../outofsequence/OutOfSequenceTest.java | 38 ++-- .../integration/sequenced/SequencedTest.java | 26 ++- .../DoNotCreateMigrationsCollectionTest.java | 14 +- src/test/java/ox/utils/TestUtils.java | 9 +- 22 files changed, 583 insertions(+), 374 deletions(-) create mode 100644 src/main/java/ox/engine/OxConfig.java create mode 100644 src/main/java/ox/engine/OxConfigBuilder.java create mode 100644 src/main/java/ox/engine/exception/DatabaseNotFoundException.java create mode 100644 src/main/java/ox/engine/exception/MissingCollectionException.java delete mode 100644 src/test/java/ox/engine/OxMigrationDownTest.java create mode 100644 src/test/java/ox/integration/CustomMigrationsCollectionTest.java create mode 100644 src/test/java/ox/integration/DatabaseNotFoundTest.java create mode 100644 src/test/java/ox/integration/FailOnMissingCollectionTest.java rename src/test/java/ox/integration/{partial => }/PartialExecutionTest.java (64%) create mode 100644 src/test/java/ox/integration/RollbackTest.java diff --git a/src/main/java/ox/engine/Ox.java b/src/main/java/ox/engine/Ox.java index 6175e56..afdfc4c 100644 --- a/src/main/java/ox/engine/Ox.java +++ b/src/main/java/ox/engine/Ox.java @@ -37,35 +37,20 @@ public final class Ox { private static final Logger LOG = LoggerFactory.getLogger(Ox.class); - - private boolean simulate = false; - private final MongoClient mongo; - private final String scanPackage; + private final OxConfig config; private final MongoDBConnector mongoConnector; - private Ox(MongoClient mongo, - String scanPackage, - String databaseName, - boolean createVersioningCollectionIfMissing) { - - this.mongo = mongo; - this.scanPackage = scanPackage; - this.mongoConnector = - new MongoDBConnector(MongoDBConnectorConfig - .create() - .setMongoClient(mongo) - .setDatabaseName(databaseName) - .createCollectionIfDontExists(createVersioningCollectionIfMissing)); - + private Ox(OxConfig config) { + this.config = config; + this.mongoConnector = new MongoDBConnector( + MongoDBConnectorConfig.fromOxConfig(config) + ); } public static Ox setUp( - MongoClient mongo, - String scanPackage, - String databaseName, - boolean createVersioningCollectionIfMissing) { - - return new Ox(mongo, scanPackage, databaseName, createVersioningCollectionIfMissing); + OxConfig config + ) { + return new Ox(config); } public static Ox setUp( @@ -73,7 +58,13 @@ public static Ox setUp( String scanPackage, String databaseName) { - return new Ox(mongo, scanPackage, databaseName, true); + OxConfig oxConfig = new OxConfigBuilder() + .mongo(mongo) + .scanPackage(scanPackage) + .databaseName(databaseName) + .build(); + + return new Ox(oxConfig); } /** @@ -111,7 +102,7 @@ public void down(int version) throws InvalidMongoConfiguration { } private void validateExecution() throws InvalidMongoConfiguration { - if (!simulate && mongo == null) { + if (!config.dryRun() && config.mongo() == null) { throw new InvalidMongoConfiguration("Invalid Mongo Configuration. Please fix it and try again."); } } @@ -156,7 +147,7 @@ private void executeEachMigrate(List migrations, ExecutionMode mode, Integer desiredVersion) { Integer currentVersion; - if (!simulate) { + if (!config.dryRun()) { currentVersion = mongoConnector.retrieveDatabaseCurrentVersion(); } else { currentVersion = 0; @@ -164,7 +155,7 @@ private void executeEachMigrate(List migrations, try { OxEnvironment env = new OxEnvironment(); - env.setSimulate(simulate); + env.dryRun(config.dryRun()); env.setMongoConnector(mongoConnector); LOG.info("[Ox] MongoDB Database Current Version: " + currentVersion); @@ -227,7 +218,7 @@ private void runMigrationUpIfApplies(Integer desiredVersion, OxEnvironment env, public List getMigrationsList() { try { - List resolvedMigrations = resolveMigrations(scanPackage); + List resolvedMigrations = resolveMigrations(config.scanPackage()); return CollectionUtils.sortResolvedMigrations(resolvedMigrations); } catch (IOException e) { LOG.error("[Ox] Error updating MONGODB Database Schema", e); @@ -246,11 +237,6 @@ public Integer databaseVersion() throws InvalidMongoConfiguration { return mongoConnector.retrieveDatabaseCurrentVersion(); } - public Ox simulate() { - simulate = true; - return this; - } - private enum ExecutionMode { UP, DOWN } diff --git a/src/main/java/ox/engine/OxConfig.java b/src/main/java/ox/engine/OxConfig.java new file mode 100644 index 0000000..81d80c3 --- /dev/null +++ b/src/main/java/ox/engine/OxConfig.java @@ -0,0 +1,18 @@ +package ox.engine; + +import com.mongodb.MongoClient; + +public record OxConfig( + MongoClient mongo, + String databaseName, + String scanPackage, + boolean createMigrationCollection, + String migrationCollectionName, + boolean failOnMissingCollection, + boolean dryRun +) { + public static OxConfigBuilder builder() { + return new OxConfigBuilder(); + } +} + diff --git a/src/main/java/ox/engine/OxConfigBuilder.java b/src/main/java/ox/engine/OxConfigBuilder.java new file mode 100644 index 0000000..2eec334 --- /dev/null +++ b/src/main/java/ox/engine/OxConfigBuilder.java @@ -0,0 +1,77 @@ +package ox.engine; + +import com.mongodb.MongoClient; +import ox.Configuration; + +public class OxConfigBuilder { + private boolean createMigrationCollection = true; + private String migrationCollectionName = Configuration.SCHEMA_VERSION_COLLECTION_NAME; + private boolean failOnMissingCollection = false; + private MongoClient mongo; + private String databaseName; + private String scanPackage; + private boolean dryRun = false; + + /** + * By default, Ox will create the migration collection if it does not exists. + *

+ * If you want to disable this behavior, call this method + */ + public OxConfigBuilder disableMigrationCollectionCreation() { + this.createMigrationCollection = false; + return this; + } + + public OxConfigBuilder migrationCollectionName(String migrationCollectionName) { + this.migrationCollectionName = migrationCollectionName; + return this; + } + + /** + * if true, Ox will throw an exception if the collections targeted by the OxActions or Migrations do not exist + *

+ * Defaults to false + *

+ * Attention: This is a global setting, it will affect all OxActions and Migrations. + * If false, Ox will ignore the missing collection and continue the migration process. + */ + public OxConfigBuilder failOnMissingCollection(boolean failOnMissingCollection) { + this.failOnMissingCollection = failOnMissingCollection; + return this; + } + + public OxConfigBuilder mongo(MongoClient mongo) { + this.mongo = mongo; + return this; + } + + public OxConfigBuilder databaseName(String databaseName) { + this.databaseName = databaseName; + return this; + } + + public OxConfigBuilder scanPackage(String scanPackage) { + this.scanPackage = scanPackage; + return this; + } + + /** + * Enables dry run mode. Ox will only simulate the migration process, it will not execute the migrations + */ + public OxConfigBuilder dryRun() { + this.dryRun = true; + return this; + } + + public OxConfig build() { + return new OxConfig( + mongo, + databaseName, + scanPackage, + createMigrationCollection, + migrationCollectionName, + failOnMissingCollection, + dryRun + ); + } +} diff --git a/src/main/java/ox/engine/exception/DatabaseNotFoundException.java b/src/main/java/ox/engine/exception/DatabaseNotFoundException.java new file mode 100644 index 0000000..6c6d547 --- /dev/null +++ b/src/main/java/ox/engine/exception/DatabaseNotFoundException.java @@ -0,0 +1,11 @@ +package ox.engine.exception; + +public class DatabaseNotFoundException extends OxRuntimeException { + public DatabaseNotFoundException() { + super("database.notfound.exception"); + } + + public DatabaseNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/ox/engine/exception/MissingCollectionException.java b/src/main/java/ox/engine/exception/MissingCollectionException.java new file mode 100644 index 0000000..0f893a1 --- /dev/null +++ b/src/main/java/ox/engine/exception/MissingCollectionException.java @@ -0,0 +1,11 @@ +package ox.engine.exception; + +public class MissingCollectionException extends OxRuntimeException { + public MissingCollectionException() { + super("collection.not.found"); + } + + public MissingCollectionException(String msg) { + super(msg); + } +} diff --git a/src/main/java/ox/engine/internal/CreateIndexAction.java b/src/main/java/ox/engine/internal/CreateIndexAction.java index 3e2f08a..ce10353 100644 --- a/src/main/java/ox/engine/internal/CreateIndexAction.java +++ b/src/main/java/ox/engine/internal/CreateIndexAction.java @@ -17,7 +17,6 @@ public class CreateIndexAction extends OxAction { private static final Logger LOG = LoggerFactory.getLogger(CreateIndexAction.class); - private final Map attributes = new LinkedHashMap<>(); private final String indexName; @@ -151,7 +150,6 @@ protected void validateAction() throws InvalidMigrateActionException { if (attributes.size() > 1 && ttlIndex) { throw new InvalidMigrateActionException("TTL indexes can not have more than 1 attribute"); } - } @Override diff --git a/src/main/java/ox/engine/internal/MongoDBConnector.java b/src/main/java/ox/engine/internal/MongoDBConnector.java index eb7ce2f..cc81e8c 100644 --- a/src/main/java/ox/engine/internal/MongoDBConnector.java +++ b/src/main/java/ox/engine/internal/MongoDBConnector.java @@ -1,12 +1,16 @@ package ox.engine.internal; +import com.mongodb.MongoClient; import com.mongodb.*; +import com.mongodb.client.*; +import com.mongodb.client.model.CreateCollectionOptions; +import com.mongodb.client.model.IndexOptions; +import org.bson.Document; +import org.bson.conversions.Bson; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ox.Configuration; -import ox.engine.exception.CouldNotCreateCollectionException; -import ox.engine.exception.InvalidCollectionException; -import ox.engine.exception.InvalidMongoDatabaseConfiguration; +import ox.engine.exception.*; import ox.engine.structure.OrderingType; import ox.utils.CollectionUtils; @@ -15,57 +19,70 @@ public class MongoDBConnector { private static final Logger LOG = LoggerFactory.getLogger(MongoDBConnector.class); - private final String databaseName; - - private final boolean createCollectionIfDontExists; - private final MongoDBConnectorConfig config; public MongoDBConnector(MongoDBConnectorConfig config) { LOG.info("[Ox] Configuring MongoDB Access..."); - assert config != null; - this.config = config; - this.createCollectionIfDontExists = config.isCreateCollectionIfNotExists(); - this.databaseName = config.getDatabaseName(); - - if (this.databaseName == null) { + if (!isConfigValid(config)) { throw new InvalidMongoDatabaseConfiguration("Database name is null. Cannot proceed."); } + this.config = config; + } + + private boolean isConfigValid(MongoDBConnectorConfig config) { + return config != null && config.getDatabaseName() != null && config.getMongo() != null; } protected MongoDBConnectorConfig getConfig() { return config; } + private MongoClient mongo() { + return config.getMongo(); + } + + private MongoDatabase database() { + return mongo().getDatabase(config.getDatabaseName()); + } + + private boolean collectionExists(String collectionName) { + MongoIterable collections = database().listCollectionNames(); + for (String collection : collections) { + if (collection.equals(collectionName)) { + return true; + } + } + return false; + } + public Integer retrieveDatabaseCurrentVersion() { validateDatabaseNames(); - DB db = config.getMongo().getDB(databaseName); + MongoDatabase db = database(); - if (db.collectionExists(Configuration.SCHEMA_VERSION_COLLECTION_NAME)) { - return getVersion(db); - } else { - if (createCollectionIfDontExists) { - db.createCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME, new BasicDBObject().append("capped", false)); - if (db.collectionExists(Configuration.SCHEMA_VERSION_COLLECTION_NAME)) { - createMigrateVersionsCollectionIndex(db); - return getVersion(db); - } else { - throw new CouldNotCreateCollectionException("Error trying to create collection."); - } + if (collectionExists(config.getMigrationCollectionName())) { + return getVersion(); + } + if (config.shouldCreateMigrationCollection()) { + db.createCollection(config.getMigrationCollectionName(), new CreateCollectionOptions().capped(false)); + if (collectionExists(config.getMigrationCollectionName())) { + createMigrateVersionsCollectionIndex(); + return getVersion(); } else { - throw new CouldNotCreateCollectionException("Versioning collection doesn't exists and auto collection create is set to false"); + throw new CouldNotCreateCollectionException("Error trying to create collection."); } + } else { + throw new CouldNotCreateCollectionException("Versioning collection doesn't exists and auto collection create is set to false"); } } - private void createMigrateVersionsCollectionIndex(DB db) { - DBCollection collection = db.getCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME); - BasicDBObject objectIndex = new BasicDBObject(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, -1); - BasicDBObject indexOptions = new BasicDBObject("unique", true); - collection.createIndex(objectIndex, indexOptions); + private void createMigrateVersionsCollectionIndex() { + MongoDatabase database = database(); + MongoCollection collection = database.getCollection(config.getMigrationCollectionName()); + Bson objectIndex = new BasicDBObject(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, -1); + collection.createIndex(objectIndex, new IndexOptions().unique(true)); } /** @@ -74,28 +91,33 @@ private void createMigrateVersionsCollectionIndex(DB db) { * If not exists, validates if is it possible to create it. */ private void validateDatabaseNames() { - List dbNames = config.getMongo().getDatabaseNames(); - - if (dbNames == null || dbNames.isEmpty()) { - throw new InvalidMongoDatabaseConfiguration("There is no existing database in this MongoDB. You must first create a new database"); + MongoIterable dbNamesIterable = config.getMongo().listDatabaseNames(); + List dbNames = new ArrayList<>(); + try (MongoCursor it = dbNamesIterable.iterator()) { + while (it.hasNext()) { + dbNames.add(it.next()); + } } - - if (!dbNames.contains(databaseName) - && !createCollectionIfDontExists) { - throw new InvalidMongoDatabaseConfiguration("MongoDB Database not found and is not set for auto creation. Please create it and try again"); + if (dbNames.isEmpty()) { + throw new DatabaseNotFoundException(); + } + if (!dbNames.contains(config.getDatabaseName()) + && !config.shouldCreateMigrationCollection()) { + throw new DatabaseNotFoundException("MongoDB Database not found and is not set for auto creation. Please create it and try again"); } - } - private Integer getVersion(DB db) { - DBCollection collection = db.getCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME); + private Integer getVersion() { + MongoCollection collection = database().getCollection(config.getMigrationCollectionName()); BasicDBObject o = new BasicDBObject(); o.append(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, -1); - try (DBCursor result = collection.find().sort(o).limit(1)) { - if (!result.hasNext()) { + FindIterable result = collection.find().sort(o).limit(1); + + try (MongoCursor it = result.iterator()) { + if (!it.hasNext()) { return 0; } - DBObject current = result.next(); + Document current = it.next(); return (Integer) current.get(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE); } } @@ -103,20 +125,22 @@ private Integer getVersion(DB db) { public void executeCommand(OxAction action) { LOG.warn("[Ox] Executing action: {}", action); verifyAndCreateCollectionIfNecessary(action); - action.runAction(this, config.getMongo(), databaseName); + action.runAction(this, config.getMongo(), config.getDatabaseName()); } private void verifyAndCreateCollectionIfNecessary(OxAction action) { validateCollection(action); - if (!config.getMongo().getDB(databaseName).collectionExists(action.getCollection())) { - config.getMongo().getDB(databaseName) - .createCollection( - action.getCollection(), - new BasicDBObject() - .append("capped", false) - ); + MongoDatabase db = database(); + boolean collectionExists = collectionExists(action.getCollection()); + + if (!collectionExists) { + if (config.shouldFailOnMissingCollection()) { + throw new MissingCollectionException("failOnMissingCollection is set to true and collection does not exists. Collection: " + action.getCollection()); + } else { + db.createCollection(action.getCollection(), new CreateCollectionOptions().capped(false)); + } } } @@ -135,8 +159,8 @@ public void insertMigrationVersion(Integer version) { dbObject.append("date", new Date()); config.getMongo() - .getDB(databaseName) - .getCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME) + .getDB(config.getDatabaseName()) + .getCollection(config.getMigrationCollectionName()) .insert(dbObject); } @@ -146,8 +170,8 @@ public void removeMigrationVersion(Integer version) { Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, version); config.getMongo() - .getDB(databaseName) - .getCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME) + .getDB(config.getDatabaseName()) + .getCollection(config.getMigrationCollectionName()) .remove(dbObject); } @@ -166,7 +190,7 @@ public boolean verifyIfHasSameNameAndDifferentAttributes( String indexName, String collection) { - List indexInfo = config.getMongo().getDB(databaseName).getCollection(collection).getIndexInfo(); + List indexInfo = config.getMongo().getDB(config.getDatabaseName()).getCollection(collection).getIndexInfo(); for (DBObject current : indexInfo) { String remoteIndexName = (String) current.get("name"); @@ -194,7 +218,7 @@ protected boolean verifyIfIndexExists( String indexName, String collection) { - List indexInfo = config.getMongo().getDB(databaseName).getCollection(collection).getIndexInfo(); + List indexInfo = config.getMongo().getDB(config.getDatabaseName()).getCollection(collection).getIndexInfo(); if (indexInfo.isEmpty()) { return false; @@ -273,22 +297,25 @@ public void dropIndexByName(String collection, String indexName) { LOG.error("[Ox] IndexName is null. Cannot drop Index."); return; } - if (databaseName == null) { + if (config.getDatabaseName() == null) { LOG.error("[Ox] database is null. Cannot drop Index."); return; } - config.getMongo().getDB(databaseName).getCollection(collection).dropIndex(indexName); + config.getMongo().getDB(config.getDatabaseName()).getCollection(collection).dropIndex(indexName); } public void createIndex(String collection, BasicDBObject indexDefinition, BasicDBObject indexOptions) { LOG.info("Creating index... "); - config.getMongo().getDB(databaseName).getCollection(collection).createIndex(indexDefinition, indexOptions); + config.getMongo().getDB(config.getDatabaseName()).getCollection(collection).createIndex(indexDefinition, indexOptions); } public boolean verifyIfMigrateWasAlreadyExecuted(Integer version) { - DBCollection versionCollection = config.getMongo().getDB(databaseName).getCollection(Configuration.SCHEMA_VERSION_COLLECTION_NAME); + DBCollection versionCollection = config.getMongo() + .getDB(config.getDatabaseName()) + .getCollection(config.getMigrationCollectionName()); + versionCollection.setReadPreference(ReadPreference.primary()); BasicDBObject dbObject = new BasicDBObject(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, version); @@ -299,7 +326,7 @@ public boolean verifyIfMigrateWasAlreadyExecuted(Integer version) { } public DB getMongoDatabase() { - return config.getMongo().getDB(databaseName); + return config.getMongo().getDB(config.getDatabaseName()); } public boolean verifyIfCollectionExists(String collectionName) { diff --git a/src/main/java/ox/engine/internal/MongoDBConnectorConfig.java b/src/main/java/ox/engine/internal/MongoDBConnectorConfig.java index c82506b..db3a1ad 100644 --- a/src/main/java/ox/engine/internal/MongoDBConnectorConfig.java +++ b/src/main/java/ox/engine/internal/MongoDBConnectorConfig.java @@ -1,6 +1,8 @@ package ox.engine.internal; import com.mongodb.MongoClient; +import ox.Configuration; +import ox.engine.OxConfig; /** * MongoDBConnector Configuration. @@ -9,42 +11,120 @@ */ public final class MongoDBConnectorConfig { - private boolean createCollectionIfNotExists; + private boolean createMigrationCollection = true; + private String migrationCollectionName; + /** + * if true, Ox will throw an exception if the collections targeted by the OxActions or Migrations do not exist + */ + private boolean failOnMissingCollection; private MongoClient mongo; private String databaseName; - public static MongoDBConnectorConfig create() { - return new MongoDBConnectorConfig(); + public static class Builder { + private boolean createMigrationCollectionIfNotExists = true; + private MongoClient mongo; + private String databaseName; + private String migrationCollectionName = Configuration.SCHEMA_VERSION_COLLECTION_NAME; + private boolean failOnMissingCollection = false; + + private Builder() { + } + + /** + * Set to true if you want to create the migration collection if it does not exists + *

+ * Defaults to true + */ + public Builder createMigrationCollection(boolean value) { + this.createMigrationCollectionIfNotExists = value; + return this; + } + + public Builder setMongoClient(MongoClient mongo) { + this.mongo = mongo; + return this; + } + + public Builder setDatabaseName(String databaseName) { + this.databaseName = databaseName; + return this; + } + + public Builder setMigrationCollectionName(String migrationCollectionName) { + this.migrationCollectionName = migrationCollectionName; + return this; + } + + /** + * if true, Ox will throw an exception if the collections targeted by the OxActions or Migrations do not exist + *

+ * Defaults to false + *

+ * Attention: This is a global setting, it will affect all OxActions and Migrations. + * If false, Ox will ignore the missing collection and continue the migration process. + */ + public Builder setFailOnMissingCollection(boolean failOnMissingCollection) { + this.failOnMissingCollection = failOnMissingCollection; + return this; + } + + public MongoDBConnectorConfig build() { + return new MongoDBConnectorConfig( + this.mongo, + this.databaseName, + this.migrationCollectionName, + this.createMigrationCollectionIfNotExists, + this.failOnMissingCollection + ); + } } - private MongoDBConnectorConfig() { - this.createCollectionIfNotExists = true; + public static MongoDBConnectorConfig.Builder builder() { + return new Builder(); } - public MongoDBConnectorConfig createCollectionIfDontExists(boolean value) { - this.createCollectionIfNotExists = value; - return this; + public static MongoDBConnectorConfig fromOxConfig(OxConfig oxConfig) { + return new MongoDBConnectorConfig( + oxConfig.mongo(), + oxConfig.databaseName(), + oxConfig.migrationCollectionName(), + oxConfig.createMigrationCollection(), + oxConfig.failOnMissingCollection() + ); } - public MongoDBConnectorConfig setMongoClient(MongoClient mongo) { + private MongoDBConnectorConfig(MongoClient mongo, + String databaseName, + String migrationCollectionName, + boolean createMigrationCollectionIfNotExists, + boolean failOnMissingCollection) { + this.createMigrationCollection = createMigrationCollectionIfNotExists; this.mongo = mongo; - return this; + this.databaseName = databaseName; + this.migrationCollectionName = migrationCollectionName; + this.failOnMissingCollection = failOnMissingCollection; } - public boolean isCreateCollectionIfNotExists() { - return createCollectionIfNotExists; + public boolean shouldCreateMigrationCollection() { + return createMigrationCollection; } - public MongoClient getMongo() { - return mongo; + public String getMigrationCollectionName() { + return migrationCollectionName; } - public MongoDBConnectorConfig setDatabaseName(String databaseName) { - this.databaseName = databaseName; - return this; + public MongoClient getMongo() { + return mongo; } public String getDatabaseName() { return databaseName; } + + /** + * if true, Ox will throw an exception if the collections targeted by the OxActions or Migrations do not exist + */ + public boolean shouldFailOnMissingCollection() { + return failOnMissingCollection; + } } diff --git a/src/main/java/ox/engine/internal/OxEnvironment.java b/src/main/java/ox/engine/internal/OxEnvironment.java index 74f4867..8392272 100644 --- a/src/main/java/ox/engine/internal/OxEnvironment.java +++ b/src/main/java/ox/engine/internal/OxEnvironment.java @@ -41,8 +41,8 @@ public DB getMongoDatabase() { return mongoConnector.getMongoDatabase(); } - public void setSimulate(boolean simulate) { - this.simulate = simulate; + public void dryRun(boolean dryRun) { + this.simulate = dryRun; } public boolean isSimulate() { @@ -52,4 +52,4 @@ public boolean isSimulate() { public void setMongoConnector(MongoDBConnector mongoConnector) { this.mongoConnector = mongoConnector; } -} \ No newline at end of file +} diff --git a/src/test/java/ox/engine/OxMigrationDownTest.java b/src/test/java/ox/engine/OxMigrationDownTest.java deleted file mode 100644 index 208b4a4..0000000 --- a/src/test/java/ox/engine/OxMigrationDownTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package ox.engine; - -import com.mongodb.*; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import ox.Configuration; -import ox.engine.exception.InvalidMongoConfiguration; - -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(MockitoJUnitRunner.class) -public class OxMigrationDownTest { - - @Mock - private MongoClient mongo; - - @Test - public void runDownMigrationOnANonEmptyDBTest() throws InvalidMongoConfiguration { - - DB db = Mockito.mock(DB.class); - DBCollection collection = Mockito.mock(DBCollection.class); - - DBCursor cursor = Mockito.mock(DBCursor.class); - - BasicDBObject dbObject = new BasicDBObject(); - dbObject.append(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, 10); - - List dbList = new ArrayList<>(); - dbList.add("string"); - - Mockito.when(mongo.getDatabaseNames()).thenReturn(dbList); - Mockito.when(mongo.getDB(Mockito.anyString())).thenReturn(db); - Mockito.when(db.collectionExists(Mockito.anyString())).thenReturn(true); - Mockito.when(db.getCollection(Mockito.anyString())).thenReturn(collection); - Mockito.when(collection.find()).thenReturn(cursor); - Mockito.when(cursor.sort(Mockito.any(DBObject.class))).thenReturn(cursor); - Mockito.when(cursor.limit(Mockito.anyInt())).thenReturn(cursor); - - Mockito.when(cursor.hasNext()).thenReturn(true).thenReturn(false); - Mockito.when(cursor.next()).thenReturn(dbObject); - - Ox engine = Ox.setUp( - mongo, - "ox.db.migrations", - "string"); - - - engine.down(); - - assertThat(engine.databaseVersion()).isEqualTo(0); - } -} diff --git a/src/test/java/ox/engine/OxMigrationTest.java b/src/test/java/ox/engine/OxMigrationTest.java index 7691122..d23705c 100644 --- a/src/test/java/ox/engine/OxMigrationTest.java +++ b/src/test/java/ox/engine/OxMigrationTest.java @@ -1,12 +1,16 @@ package ox.engine; -import com.mongodb.*; +import com.mongodb.DB; +import com.mongodb.DBCollection; +import com.mongodb.DBObject; +import com.mongodb.MongoClient; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import ox.engine.exception.InvalidMongoConfiguration; +import ox.engine.exception.InvalidMongoDatabaseConfiguration; import ox.engine.internal.MongoDBConnector; @RunWith(MockitoJUnitRunner.class) @@ -26,14 +30,19 @@ public class OxMigrationTest { @Test public void runMigrationsTest() throws InvalidMongoConfiguration { - Mockito.when(mongo.getDB(Mockito.anyString())).thenReturn(db); Mockito.when(db.getCollection(Mockito.anyString())).thenReturn(coll); - Ox engine = Ox.setUp(mongo, "ox.db.migrations", "myDB", true); - engine.simulate() - .up(); + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("myDB") + .scanPackage("ox.db.migrations") + .dryRun() + .build(); + + Ox engine = Ox.setUp(config); + engine.up(); } @Test @@ -43,19 +52,24 @@ public void runDownMigrationTest() throws InvalidMongoConfiguration { Mockito.when(db.getCollection(Mockito.anyString())).thenReturn(coll); Mockito.when(coll.count(Mockito.any(DBObject.class))).thenReturn(1L); + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("myDB") + .scanPackage("ox.db.migrations") + .dryRun() + .build(); + Ox - .setUp(mongo, "ox.db.migrations", "myDB", true) - .simulate() + .setUp(config) .down(); } - @Test(expected = InvalidMongoConfiguration.class) + @Test(expected = InvalidMongoDatabaseConfiguration.class) public void validateInvalidMongoInstance() throws InvalidMongoConfiguration { - Ox.setUp( - null, - "ox.db.migrations", - "myDB") + null, + "ox.db.migrations", + "myDB") .up(); } diff --git a/src/test/java/ox/engine/internal/MongoDBConnectorTest.java b/src/test/java/ox/engine/internal/MongoDBConnectorTest.java index 3dc058e..bd293fb 100644 --- a/src/test/java/ox/engine/internal/MongoDBConnectorTest.java +++ b/src/test/java/ox/engine/internal/MongoDBConnectorTest.java @@ -1,19 +1,21 @@ package ox.engine.internal; import com.mongodb.*; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; -import ox.Configuration; import ox.engine.exception.InvalidCollectionException; -import ox.engine.exception.InvalidMongoDatabaseConfiguration; import ox.engine.structure.OrderingType; import ox.utils.Faker; import ox.utils.TestUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -25,119 +27,25 @@ private MongoClient newMockedMongo() { return Mockito.mock(MongoClient.class); } - private static DB createMockedDB(boolean collectionExists) { + private static MongoDatabase createMockedDB(List existingCollections) { - DB db = Mockito.mock(DB.class); - Mockito - .when(db.collectionExists(Mockito.anyString())) - .thenReturn(collectionExists).thenReturn(true); - - DBCollection dbCollection = Mockito.mock(DBCollection.class); - - Mockito - .when((db.getCollection(Mockito.anyString()))).thenReturn(dbCollection); - - DBCursor dbCursor = Mockito.mock(DBCursor.class, "dbCursor1"); + MongoDatabase db = Mockito.mock(MongoDatabase.class); - Mockito.when(dbCollection.find()).thenReturn(dbCursor); - Mockito.when(dbCursor.sort(Mockito.any(DBObject.class))).thenReturn(dbCursor); - Mockito.when(dbCursor.limit(1)).thenReturn(dbCursor); - Mockito.when(dbCursor.hasNext()).thenReturn(true).thenReturn(false); + MongoIterable iterable = Mockito.mock(MongoIterable.class); + MongoCursor cursor = Mockito.mock(MongoCursor.class); - BasicDBObject o = new BasicDBObject(); - o.append(Configuration.MIGRATION_COLLECTION_VERSION_ATTRIBUTE, 1); + Mockito.when(db.listCollectionNames()).thenReturn(iterable); + Mockito.when(iterable.iterator()).thenReturn(cursor); - Mockito.when(dbCursor.next()).thenReturn(o); + if (!existingCollections.isEmpty()) { + Mockito.when(cursor.hasNext()).thenReturn(true).thenReturn(false); + } else { + Mockito.when(cursor.hasNext()).thenReturn(false); + } return db; } - /** - * Validates if no database is found - */ - @Test(expected = InvalidMongoDatabaseConfiguration.class) - public void mongoDBConnectorNoDatabaseValidationTest() { - TestUtils.newMongoDBConnector().retrieveDatabaseCurrentVersion(); - } - - /** - * The configured database doesn't exists - * and can't be created because automatic - * creation is not set true - */ - @Test(expected = InvalidMongoDatabaseConfiguration.class) - public void mongoDBConnectorDatabaseNotFoundAndAutoCreationNotSetTest() { - - MongoClient mockedMongo = Mockito.mock(MongoClient.class); - - MongoDBConnector connector = new MongoDBConnector(MongoDBConnectorConfig - .create() - .setMongoClient(mockedMongo) - .setDatabaseName("invalidDatabase") - .createCollectionIfDontExists(false)); - - ArrayList dbNames = new ArrayList<>(); - dbNames.add("myDBName"); - - Mockito - .when(mockedMongo.getDatabaseNames()) - .thenReturn(dbNames); - - connector.retrieveDatabaseCurrentVersion(); - } - - /** - * Validates the migration_versions get version method - */ - @Test - public void mongoDBConnectorGetSchemaVersionTest() { - - MongoDBConnector connector = TestUtils.newMongoDBConnector(); - List dbNames = new ArrayList<>(); - - dbNames.add(connector.getConfig().getDatabaseName()); - Mockito - .when(connector.getConfig().getMongo().getDatabaseNames()) - .thenReturn(dbNames); - - DB db = createMockedDB(true); - - Mockito.when(connector.getConfig().getMongo().getDB(Mockito.anyString())).thenReturn(db); - - Integer version = connector.retrieveDatabaseCurrentVersion(); - Assert.assertEquals("DB Schema Version must be 1", Integer.valueOf(1), version); - } - - /** - * Tests the method that verifies - * if the migration_versions collection exists - */ - @Test - public void mongoDBConnectorCreateSchemaVersionCollectionIfNotExists() { - - MongoClient mockedMongo = Mockito.mock(MongoClient.class); - - String fakeDB = Faker.fakeDBName(); - - MongoDBConnector connector = new MongoDBConnector(MongoDBConnectorConfig - .create() - .setMongoClient(mockedMongo) - .setDatabaseName(fakeDB) - .createCollectionIfDontExists(true)); - - List dbNames = new ArrayList<>(); - dbNames.add(fakeDB); - - Mockito - .when(connector.getConfig().getMongo().getDatabaseNames()) - .thenReturn(dbNames); - - DB db = createMockedDB(false); - Mockito.when(connector.getConfig().getMongo().getDB(Mockito.anyString())).thenReturn(db); - - connector.retrieveDatabaseCurrentVersion(); - } - /** * Validates the executeCommand method. *

@@ -150,9 +58,8 @@ public void executeCommandTest() { OxAction action = Mockito.mock(OxAction.class); - DB db = createMockedDB(false); - Mockito.when(connector.getConfig().getMongo().getDB(Mockito.anyString())).thenReturn(db); - Mockito.when(db.collectionExists(Mockito.anyString())).thenReturn(false); + MongoDatabase db = createMockedDB(Collections.emptyList()); + Mockito.when(connector.getConfig().getMongo().getDatabase(Mockito.anyString())).thenReturn(db); Mockito.when(action.getCollection()).thenReturn("aTestCollection"); connector.executeCommand(action); @@ -163,11 +70,11 @@ public void executeInvalidCollectionCommandTest() { MongoClient mockedMongo = Mockito.mock(MongoClient.class); - MongoDBConnector connector = new MongoDBConnector(MongoDBConnectorConfig - .create() - .createCollectionIfDontExists(true) - .setMongoClient(mockedMongo) - .setDatabaseName(Faker.fakeDBName())); + MongoDBConnector connector = new MongoDBConnector( + MongoDBConnectorConfig.builder() + .setMongoClient(mockedMongo) + .setDatabaseName(Faker.fakeDBName()) + .build()); OxAction action = Mockito.mock(OxAction.class); Mockito.when(action.getCollection()).thenReturn(null); @@ -185,11 +92,9 @@ public void verifyIfAn2dsphereIndexWithSameAttributesAlreadyExistsTest() { MongoClient mockedMongo = Mockito.mock(MongoClient.class); - MongoDBConnectorConfig config = MongoDBConnectorConfig - .create() - .createCollectionIfDontExists(true) + MongoDBConnectorConfig config = MongoDBConnectorConfig.builder() .setMongoClient(mockedMongo) - .setDatabaseName("myDB"); + .setDatabaseName("myDB").build(); MongoDBConnector connector = new MongoDBConnector(config); @@ -222,11 +127,9 @@ public void verifyIfAnIndexWithSameAttributesAlreadyExistsTest() { MongoClient mockedMongo = Mockito.mock(MongoClient.class); - MongoDBConnectorConfig config = MongoDBConnectorConfig - .create() - .createCollectionIfDontExists(true) + MongoDBConnectorConfig config = MongoDBConnectorConfig.builder() .setMongoClient(mockedMongo) - .setDatabaseName(Faker.fakeDBName()); + .setDatabaseName(Faker.fakeDBName()).build(); MongoDBConnector connector = new MongoDBConnector(config); @@ -262,11 +165,9 @@ public void validateVerifyIfIndexExistsWhenTheCollectionHasNoIndex() { MongoClient mockedMongo = newMockedMongo(); - MongoDBConnectorConfig config = MongoDBConnectorConfig - .create() - .createCollectionIfDontExists(true) + MongoDBConnectorConfig config = MongoDBConnectorConfig.builder() .setMongoClient(mockedMongo) - .setDatabaseName("myDB"); + .setDatabaseName("myDB").build(); MongoDBConnector connector = new MongoDBConnector(config); @@ -294,11 +195,9 @@ public void validateVerifyIfIndexWithTheSameNameExists() { MongoClient mockedMongo = newMockedMongo(); - MongoDBConnectorConfig config = MongoDBConnectorConfig - .create() - .createCollectionIfDontExists(true) + MongoDBConnectorConfig config = MongoDBConnectorConfig.builder() .setMongoClient(mockedMongo) - .setDatabaseName("myDB"); + .setDatabaseName("myDB").build(); MongoDBConnector connector = new MongoDBConnector(config); @@ -393,11 +292,12 @@ public void dropIndexByNameDatabaseNotNullTest() { Mockito.when(db.getCollection(Mockito.anyString())).thenReturn(collection); Mockito.when(mockedMongo.getDB(Mockito.anyString())).thenReturn(db); - MongoDBConnector connector = new MongoDBConnector(MongoDBConnectorConfig - .create() - .setMongoClient(mockedMongo) - .createCollectionIfDontExists(true) - .setDatabaseName("databaseName")); + MongoDBConnector connector = new MongoDBConnector( + MongoDBConnectorConfig + .builder() + .setMongoClient(mockedMongo) + .setDatabaseName("databaseName") + .build()); connector.dropIndexByName("collection", "indexName"); } @@ -411,14 +311,13 @@ public void createIndexTest() { Mockito.when(mockedMongo.getDB(Mockito.anyString())).thenReturn(db); Mockito.when(db.getCollection(Mockito.anyString())).thenReturn(collection); - MongoDBConnector connector = new MongoDBConnector(MongoDBConnectorConfig - .create() - .setMongoClient(mockedMongo) - .createCollectionIfDontExists(true) - .setDatabaseName("databaseName")); + MongoDBConnector connector = new MongoDBConnector( + MongoDBConnectorConfig.builder() + .setMongoClient(mockedMongo) + .setDatabaseName("databaseName") + .build()); connector.createIndex("coll", new BasicDBObject(), new BasicDBObject()); } - } diff --git a/src/test/java/ox/engine/internal/ValidateRemoveIndexActionTest.java b/src/test/java/ox/engine/internal/ValidateRemoveIndexActionTest.java index 062c416..91b4eae 100644 --- a/src/test/java/ox/engine/internal/ValidateRemoveIndexActionTest.java +++ b/src/test/java/ox/engine/internal/ValidateRemoveIndexActionTest.java @@ -2,7 +2,6 @@ import com.mongodb.DB; import com.mongodb.DBCollection; -import com.mongodb.Mongo; import com.mongodb.MongoClient; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,8 +15,11 @@ public class ValidateRemoveIndexActionTest { private MongoDBConnector newMongoDBConnector() { MongoClient mockedMongo = Mockito.mock(MongoClient.class); - return new MongoDBConnector(MongoDBConnectorConfig.create() - .setMongoClient(mockedMongo).setDatabaseName(Faker.fakeDBName())); + return new MongoDBConnector(MongoDBConnectorConfig + .builder() + .setMongoClient(mockedMongo) + .setDatabaseName(Faker.fakeDBName()) + .build()); } /** diff --git a/src/test/java/ox/integration/CustomMigrationsCollectionTest.java b/src/test/java/ox/integration/CustomMigrationsCollectionTest.java new file mode 100644 index 0000000..5d2db3b --- /dev/null +++ b/src/test/java/ox/integration/CustomMigrationsCollectionTest.java @@ -0,0 +1,38 @@ +package ox.integration; + +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; +import org.junit.Test; +import ox.engine.Ox; +import ox.engine.OxConfig; +import ox.engine.exception.InvalidMongoConfiguration; +import ox.integration.base.OxBaseContainerTest; + +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertTrue; + +public class CustomMigrationsCollectionTest extends OxBaseContainerTest { + + @Test + public void shouldCreateCustomMigrationsCollection() throws InvalidMongoConfiguration { + OxConfig config = OxConfig.builder() + .mongo(getDefaultMongo()) + .databaseName("custom_migrations_db") + .scanPackage("ox.db.migrations") + .migrationCollectionName("ox_schema_migration_history") + .build(); + + Ox.setUp(config).up(); + + MongoDatabase database = getDefaultMongo().getDatabase("custom_migrations_db"); + + Set set = new HashSet<>(); + MongoIterable collections = database.listCollectionNames(); + collections.into(set); + + assertTrue(set.contains("ox_schema_migration_history")); + } + +} diff --git a/src/test/java/ox/integration/DatabaseNotFoundTest.java b/src/test/java/ox/integration/DatabaseNotFoundTest.java new file mode 100644 index 0000000..e54da70 --- /dev/null +++ b/src/test/java/ox/integration/DatabaseNotFoundTest.java @@ -0,0 +1,24 @@ +package ox.integration; + +import org.junit.Test; +import ox.engine.Ox; +import ox.engine.OxConfig; +import ox.engine.exception.DatabaseNotFoundException; +import ox.engine.exception.InvalidMongoConfiguration; +import ox.integration.base.OxBaseContainerTest; +import ox.utils.Faker; + +public class DatabaseNotFoundTest extends OxBaseContainerTest { + + @Test(expected = DatabaseNotFoundException.class) + public void databaseNotFoundTest() throws InvalidMongoConfiguration { + OxConfig config = OxConfig.builder() + .mongo(getDefaultMongo()) + .databaseName(Faker.fakeDBName()) + .scanPackage("ox.db.migrations") + .disableMigrationCollectionCreation() + .build(); + + Ox.setUp(config).up(); + } +} diff --git a/src/test/java/ox/integration/FailOnMissingCollectionTest.java b/src/test/java/ox/integration/FailOnMissingCollectionTest.java new file mode 100644 index 0000000..29592ce --- /dev/null +++ b/src/test/java/ox/integration/FailOnMissingCollectionTest.java @@ -0,0 +1,24 @@ +package ox.integration; + +import org.junit.Test; +import ox.engine.Ox; +import ox.engine.OxConfig; +import ox.engine.exception.InvalidMongoConfiguration; +import ox.engine.exception.MissingCollectionException; +import ox.integration.base.OxBaseContainerTest; + +public class FailOnMissingCollectionTest extends OxBaseContainerTest { + + @Test(expected = MissingCollectionException.class) + public void shouldFailOnMissingCollection() throws InvalidMongoConfiguration { + OxConfig config = OxConfig.builder() + .mongo(getDefaultMongo()) + .databaseName("fail_on_missing_collection_db") + .scanPackage("ox.db.migrations") + .failOnMissingCollection(true) + .build(); + + Ox.setUp(config).up(); + } + +} diff --git a/src/test/java/ox/integration/partial/PartialExecutionTest.java b/src/test/java/ox/integration/PartialExecutionTest.java similarity index 64% rename from src/test/java/ox/integration/partial/PartialExecutionTest.java rename to src/test/java/ox/integration/PartialExecutionTest.java index e1b5e93..ce23f60 100644 --- a/src/test/java/ox/integration/partial/PartialExecutionTest.java +++ b/src/test/java/ox/integration/PartialExecutionTest.java @@ -1,8 +1,9 @@ -package ox.integration.partial; +package ox.integration; import com.mongodb.MongoClient; import org.junit.Test; import ox.engine.Ox; +import ox.engine.OxConfig; import ox.engine.exception.InvalidMongoConfiguration; import ox.integration.base.OxBaseContainerTest; @@ -14,11 +15,14 @@ public class PartialExecutionTest extends OxBaseContainerTest { public void shouldExecuteMigrationToVersion2() throws InvalidMongoConfiguration { MongoClient mongo = getDefaultMongo(); - Ox ox = Ox.setUp( - mongo, - "ox.db.migrations", - "partialExecutionTest", - true); + + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("partialExecutionTest") + .scanPackage("ox.db.migrations") + .build(); + + Ox ox = Ox.setUp(config); ox.up(2); assertThat(ox.databaseVersion()).isEqualTo(2); diff --git a/src/test/java/ox/integration/RollbackTest.java b/src/test/java/ox/integration/RollbackTest.java new file mode 100644 index 0000000..838bc2e --- /dev/null +++ b/src/test/java/ox/integration/RollbackTest.java @@ -0,0 +1,33 @@ +package ox.integration; + +import com.mongodb.MongoClient; +import org.junit.Test; +import ox.engine.Ox; +import ox.engine.OxConfig; +import ox.engine.exception.InvalidMongoConfiguration; +import ox.integration.base.OxBaseContainerTest; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RollbackTest extends OxBaseContainerTest { + + @Test + public void shouldRollback() throws InvalidMongoConfiguration { + + MongoClient mongo = getDefaultMongo(); + + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("rollback-test") + .scanPackage("ox.db.migrations") + .build(); + + Ox ox = Ox.setUp(config); + + ox.up(); + assertThat(ox.databaseVersion()).isEqualTo(10); + ox.down(2); + assertThat(ox.databaseVersion()).isEqualTo(2); + } + +} diff --git a/src/test/java/ox/integration/outofsequence/OutOfSequenceTest.java b/src/test/java/ox/integration/outofsequence/OutOfSequenceTest.java index ea4956c..4e8a7c8 100644 --- a/src/test/java/ox/integration/outofsequence/OutOfSequenceTest.java +++ b/src/test/java/ox/integration/outofsequence/OutOfSequenceTest.java @@ -7,6 +7,7 @@ import org.bson.Document; import org.junit.Test; import ox.engine.Ox; +import ox.engine.OxConfig; import ox.engine.exception.InvalidMongoConfiguration; import ox.integration.base.OxBaseContainerTest; @@ -20,11 +21,14 @@ public void orderedMigrationsTest() throws InvalidMongoConfiguration { String migrationsPackage = "ox.integration.outofsequence.migrations"; MongoClient mongo = getDefaultMongo(); - Ox ox = Ox.setUp( - mongo, - migrationsPackage + ".step1", - "oxOutOfSequenceTest", - true); + + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("oxOutOfSequenceTest") + .scanPackage(migrationsPackage + ".step1") + .build(); + + Ox ox = Ox.setUp(config); Integer databaseVersion = ox.databaseVersion(); assertThat(databaseVersion) @@ -35,22 +39,26 @@ public void orderedMigrationsTest() throws InvalidMongoConfiguration { databaseVersion = ox.databaseVersion(); assertThat(databaseVersion).isEqualTo(1); - ox = Ox.setUp( - mongo, - migrationsPackage + ".step2", - "oxOutOfSequenceTest", - true); + config = OxConfig.builder() + .mongo(mongo) + .databaseName("oxOutOfSequenceTest") + .scanPackage(migrationsPackage + ".step2") + .build(); + + ox = Ox.setUp(config); ox.up(); databaseVersion = ox.databaseVersion(); assertThat(databaseVersion).isEqualTo(3); - ox = Ox.setUp( - mongo, - migrationsPackage + ".step3", - "oxOutOfSequenceTest", - true); + config = OxConfig.builder() + .mongo(mongo) + .databaseName("oxOutOfSequenceTest") + .scanPackage(migrationsPackage + ".step3") + .build(); + + ox = Ox.setUp(config); ox.up(); databaseVersion = ox.databaseVersion(); diff --git a/src/test/java/ox/integration/sequenced/SequencedTest.java b/src/test/java/ox/integration/sequenced/SequencedTest.java index 6532a40..3a0c220 100644 --- a/src/test/java/ox/integration/sequenced/SequencedTest.java +++ b/src/test/java/ox/integration/sequenced/SequencedTest.java @@ -2,6 +2,7 @@ import com.mongodb.MongoClient; import org.junit.Test; +import ox.engine.OxConfig; import ox.integration.base.OxBaseContainerTest; import ox.engine.Ox; import ox.engine.exception.InvalidMongoConfiguration; @@ -13,11 +14,14 @@ public class SequencedTest extends OxBaseContainerTest { @Test public void orderedMigrationsTest() throws InvalidMongoConfiguration { MongoClient mongo = getDefaultMongo(); - Ox ox = Ox.setUp( - mongo, - "ox.integration.sequenced.migrations.step1", - "oxSequencedTest", - true); + + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("oxSequencedTest") + .scanPackage("ox.integration.sequenced.migrations.step1") + .build(); + + Ox ox = Ox.setUp(config); Integer databaseVersion = ox.databaseVersion(); assertThat(databaseVersion) @@ -28,11 +32,13 @@ public void orderedMigrationsTest() throws InvalidMongoConfiguration { databaseVersion = ox.databaseVersion(); assertThat(databaseVersion).isEqualTo(1); - ox = Ox.setUp( - mongo, - "ox.integration.sequenced.migrations.step2", - "oxSequencedTest", - true); + config = OxConfig.builder() + .mongo(mongo) + .databaseName("oxSequencedTest") + .scanPackage("ox.integration.sequenced.migrations.step2") + .build(); + + ox = Ox.setUp(config); ox.up(); databaseVersion = ox.databaseVersion(); diff --git a/src/test/java/ox/migrationscollection/DoNotCreateMigrationsCollectionTest.java b/src/test/java/ox/migrationscollection/DoNotCreateMigrationsCollectionTest.java index 4347a2f..02e034e 100644 --- a/src/test/java/ox/migrationscollection/DoNotCreateMigrationsCollectionTest.java +++ b/src/test/java/ox/migrationscollection/DoNotCreateMigrationsCollectionTest.java @@ -4,6 +4,7 @@ import org.bson.Document; import org.junit.Test; import ox.engine.Ox; +import ox.engine.OxConfig; import ox.engine.exception.CouldNotCreateCollectionException; import ox.engine.exception.InvalidMongoConfiguration; import ox.integration.base.OxBaseContainerTest; @@ -18,11 +19,14 @@ public void shouldNotCreateMigrationsCollection() throws InvalidMongoConfigurati .getCollection("someTest") .insertOne(new Document("test", true)); - Ox ox = Ox.setUp( - mongo, - "ox.db.migrations", - "withoutSchemaMigrationsCollection", - false); + OxConfig config = OxConfig.builder() + .mongo(mongo) + .databaseName("withoutSchemaMigrationsCollection") + .scanPackage("ox.db.migrations") + .disableMigrationCollectionCreation() + .build(); + + Ox ox = Ox.setUp(config); ox.databaseVersion(); diff --git a/src/test/java/ox/utils/TestUtils.java b/src/test/java/ox/utils/TestUtils.java index 46ed6bb..eb0ba28 100644 --- a/src/test/java/ox/utils/TestUtils.java +++ b/src/test/java/ox/utils/TestUtils.java @@ -9,9 +9,12 @@ public class TestUtils { public static MongoDBConnector newMongoDBConnector() { MongoClient mockedMongo = Mockito.mock(MongoClient.class); - return new MongoDBConnector(MongoDBConnectorConfig - .create() + + MongoDBConnectorConfig config = MongoDBConnectorConfig.builder() .setMongoClient(mockedMongo) - .setDatabaseName(Faker.fakeDBName())); + .setDatabaseName(Faker.fakeDBName()) + .build(); + + return new MongoDBConnector(config); } }