/*
* Copyright (c) 2008-2014 MongoDB, Inc.
*
* Licensed 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 com.mongodb.acceptancetest.core;
import com.mongodb.MongoClient;
import com.mongodb.ReadPreference;
import com.mongodb.client.DatabaseTestCase;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.CreateCollectionOptions;
import org.bson.Document;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static com.mongodb.Fixture.getMongoClient;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
/**
* Documents the basic functionality available for Databases via the Java driver.
*/
public class DatabaseAcceptanceTest extends DatabaseTestCase {
@Test
public void shouldCreateCollection() {
database.createCollection(getCollectionName());
List<String> collections = database.listCollectionNames().into(new ArrayList<String>());
assertThat(collections.contains(getCollectionName()), is(true));
}
@Test
public void shouldCreateCappedCollection() {
database.createCollection(getCollectionName(), new CreateCollectionOptions().capped(true).sizeInBytes(40 * 1024));
List<String> collections = database.listCollectionNames().into(new ArrayList<String>());
assertThat(collections.contains(getCollectionName()), is(true));
MongoCollection<Document> collection = database.getCollection(getCollectionName());
Document collStatsCommand = new Document("collStats", getCollectionName());
Boolean isCapped = database.runCommand(collStatsCommand, ReadPreference.primary()).getBoolean("capped");
assertThat(isCapped, is(true));
assertThat("Should have the default index on _id", collection.listIndexes().into(new ArrayList<Document>()).size(), is(1));
}
@Test
public void shouldCreateCappedCollectionWithoutAutoIndex() {
database.createCollection(getCollectionName(), new CreateCollectionOptions()
.capped(true)
.sizeInBytes(40 * 1024)
.autoIndex(false));
List<String> collections = database.listCollectionNames().into(new ArrayList<String>());
assertThat(collections.contains(getCollectionName()), is(true));
MongoCollection<Document> collection = database.getCollection(getCollectionName());
Document collStatsCommand = new Document("collStats", getCollectionName());
Boolean isCapped = database.runCommand(collStatsCommand, ReadPreference.primary()).getBoolean("capped");
assertThat(isCapped, is(true));
assertThat("Should NOT have the default index on _id", collection.listIndexes().into(new ArrayList<Document>()).size(), is(0));
}
@Test
public void shouldSupportMaxNumberOfDocumentsInACappedCollection() {
int maxDocuments = 5;
database.createCollection(getCollectionName(), new CreateCollectionOptions()
.capped(true)
.sizeInBytes(40 * 1024)
.autoIndex(false)
.maxDocuments(maxDocuments));
List<String> collections = database.listCollectionNames().into(new ArrayList<String>());
assertThat(collections.contains(getCollectionName()), is(true));
Document collStatsCommand = new Document("collStats", getCollectionName());
Document collectionStatistics = database.runCommand(collStatsCommand, ReadPreference.primary());
assertThat("max is set correctly in collection statistics", collectionStatistics.getInteger("max"), is(maxDocuments));
}
@Test
public void shouldListCollectionNamesFromDatabase() {
database.createCollection(getCollectionName());
List<String> collections = database.listCollectionNames().into(new ArrayList<String>());
assertThat(collections.contains(getCollectionName()), is(true));
}
@Test
public void shouldListCollectionsFromDatabase() {
database.drop();
List<Document> collections = database.listCollections().into(new ArrayList<Document>());
assertThat(collections.size(), is(0));
for (int i = 0; i < 20; i++) {
database.createCollection("coll" + i);
}
collections = database.listCollections().into(new ArrayList<Document>());
assertThat(collections.size(), is(greaterThanOrEqualTo(20)));
collections = database.listCollections().filter(new Document("name", "coll1")).into(new ArrayList<Document>());
assertThat(collections.size(), is(1));
}
@Test
public void shouldBeAbleToListAllTheDatabasesAvailable() {
MongoClient mongoClient = getMongoClient();
MongoDatabase firstDatabase = mongoClient.getDatabase("FirstNewDatabase");
MongoDatabase secondDatabase = mongoClient.getDatabase("SecondNewDatabase");
MongoDatabase otherDatabase = mongoClient.getDatabase("DatabaseThatDoesNotExistYet");
try {
// given
firstDatabase.getCollection("coll").insertOne(new Document("aDoc", "to force database creation"));
secondDatabase.getCollection("coll").insertOne(new Document("aDoc", "to force database creation"));
//when
List<String> databaseNames = mongoClient.listDatabaseNames().into(new ArrayList<String>());
//then
assertThat(databaseNames, hasItems(firstDatabase.getName(), secondDatabase.getName()));
assertThat(databaseNames, not(hasItem(otherDatabase.getName())));
} finally {
//tear down
firstDatabase.drop();
secondDatabase.drop();
}
}
}