/* * 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; import org.bson.types.ObjectId; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.List; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @SuppressWarnings({"rawtypes"}) // DBCollection is tested a lot, however little analysis has been done to see if the tests overlap. Some of the tests in this class // almost definitely overlap either with DBCollectionTest or DBCollectionSpecification. If they do not overlap, // they should be moved into one of those test files and this test case ultimately removed. public class DBCollectionOldTest extends DatabaseTestCase { @Test public void testMultiInsert() { DBCollection c = collection; DBObject obj = c.findOne(); assertEquals(obj, null); DBObject inserted1 = BasicDBObjectBuilder.start().add("x", 1).add("y", 2).get(); DBObject inserted2 = BasicDBObjectBuilder.start().add("x", 3).add("y", 3).get(); c.insert(inserted1, inserted2); Assert.assertThat(collection.count(), is(2L)); } @Test(expected = DuplicateKeyException.class) public void testDuplicateKeyException() { DBCollection c = collection; DBObject obj = new BasicDBObject(); c.insert(obj, WriteConcern.ACKNOWLEDGED); c.insert(obj, WriteConcern.ACKNOWLEDGED); } @Test public void testDropIndividualIndexes() { DBCollection c = database.getCollection("dropindex2"); c.drop(); c.save(new BasicDBObject("x", 1)); assertEquals(1, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("x", 1)); assertEquals(2, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("y", 1)); assertEquals(3, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("z", 1)); assertEquals(4, c.getIndexInfo().size()); c.dropIndex("y_1"); assertEquals(3, c.getIndexInfo().size()); c.dropIndex(new BasicDBObject("x", 1)); assertEquals(2, c.getIndexInfo().size()); c.dropIndexes("z_1"); assertEquals(1, c.getIndexInfo().size()); } @Test public void shouldDropCompoundIndexes1() { DBCollection c = database.getCollection("dropindex3"); c.drop(); BasicDBObject newDoc = new BasicDBObject("x", "some value").append("y", "another value"); c.save(newDoc); assertEquals(1, c.getIndexInfo().size()); BasicDBObject indexFields = new BasicDBObject("x", 1).append("y", 1); c.createIndex(indexFields); assertEquals(2, c.getIndexInfo().size()); c.dropIndex(indexFields); assertEquals(1, c.getIndexInfo().size()); } @Test public void shouldDropCompoundIndexes2() { DBCollection c = database.getCollection("dropindex4"); c.drop(); BasicDBObject newDoc = new BasicDBObject("x", "some value").append("y", "another value"); c.save(newDoc); assertEquals(1, c.getIndexInfo().size()); BasicDBObject indexFields = new BasicDBObject("x", 1).append("y", 1); c.createIndex(indexFields); assertEquals(2, c.getIndexInfo().size()); c.dropIndex("x_1_y_1"); assertEquals(1, c.getIndexInfo().size()); } @Test public void shouldDropCompoundGeoIndexes() { DBCollection c = database.getCollection("dropindex5"); c.drop(); BasicDBObject newDoc = new BasicDBObject("x", "some value").append("y", "another value"); c.save(newDoc); assertEquals(1, c.getIndexInfo().size()); BasicDBObject indexFields = new BasicDBObject("x", "2d").append("y", 1); c.createIndex(indexFields); assertEquals(2, c.getIndexInfo().size()); c.dropIndex("x_2d_y_1"); assertEquals(1, c.getIndexInfo().size()); } @Test public void shouldDropGeoIndexes() { DBCollection c = database.getCollection("dropindex6"); c.drop(); c.save(new BasicDBObject("x", 1)); assertEquals(1, c.getIndexInfo().size()); BasicDBObject indexFields = new BasicDBObject("x", "2d"); c.createIndex(indexFields); assertEquals(2, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("y", "2d")); assertEquals(3, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("z", "2d")); assertEquals(4, c.getIndexInfo().size()); c.dropIndex("y_2d"); assertEquals(3, c.getIndexInfo().size()); c.dropIndex(indexFields); assertEquals(2, c.getIndexInfo().size()); c.dropIndexes("z_2d"); assertEquals(1, c.getIndexInfo().size()); } @Test public void testEnsureIndex() { collection.save(new BasicDBObject("x", 1)); assertEquals(1, collection.getIndexInfo().size()); collection.createIndex(new BasicDBObject("x", 1), new BasicDBObject("unique", true)); assertEquals(2, collection.getIndexInfo().size()); assertEquals(Boolean.TRUE, collection.getIndexInfo().get(1).get("unique")); } @Test public void testEnsureNestedIndex() { DBCollection c = collection; BasicDBObject newDoc = new BasicDBObject("x", new BasicDBObject("y", 1)); c.save(newDoc); assertEquals(1, c.getIndexInfo().size()); c.createIndex(new BasicDBObject("x.y", 1), new BasicDBObject("name", "nestedIdx1").append("unique", false)); assertEquals(2, c.getIndexInfo().size()); } @Test public void shouldSupportIndexAliases() { // given collection.save(new BasicDBObject("x", 1)); assertEquals(1, collection.getIndexInfo().size()); // when String indexAlias = "indexAlias"; collection.createIndex(new BasicDBObject("x", 1), new BasicDBObject("name", indexAlias)); // then assertEquals(2, collection.getIndexInfo().size()); assertEquals(indexAlias, collection.getIndexInfo().get(1).get("name")); } @Test(expected = DuplicateKeyException.class) public void testIndexExceptions() { DBCollection c = collection; c.insert(new BasicDBObject("x", 1)); c.insert(new BasicDBObject("x", 1)); c.createIndex(new BasicDBObject("y", 1)); c.createIndex(new BasicDBObject("y", 1)); // make sure this doesn't throw c.createIndex(new BasicDBObject("x", 1), new BasicDBObject("unique", true)); } @Test public void testWriteResultOnUnacknowledgedUpdate(){ collection.insert(new BasicDBObject("_id", 1)); WriteResult res = collection.update(new BasicDBObject("_id", 1), new BasicDBObject("$inc", new BasicDBObject("x", 1)), false, false, WriteConcern.UNACKNOWLEDGED); try { res.getN(); fail(); } catch (UnsupportedOperationException e) { // expected } try { res.getUpsertedId(); fail(); } catch (UnsupportedOperationException e) { // expected } try { res.isUpdateOfExisting(); fail(); } catch (UnsupportedOperationException e) { // expected } } @Test public void testWriteResultOnUpdate(){ collection.insert(new BasicDBObject("_id", 1)); WriteResult res = collection.update(new BasicDBObject("_id", 1), new BasicDBObject("$inc", new BasicDBObject("x", 1))); assertEquals(1, res.getN()); assertTrue(res.isUpdateOfExisting()); assertNull(res.getUpsertedId()); } @Test public void testWriteResultOnUpsert(){ ObjectId id = new ObjectId(); collection.insert(new BasicDBObject("_id", 1)); WriteResult res = collection.update(new BasicDBObject("_id", id), new BasicDBObject("$inc", new BasicDBObject("x", 1)), true, false); assertEquals(1, res.getN()); assertFalse(res.isUpdateOfExisting()); assertEquals(id, res.getUpsertedId()); } @Test public void testWriteResultOnRemove() { collection.insert(new BasicDBObject("_id", 1)); collection.insert(new BasicDBObject("_id", 2)); WriteResult res = collection.remove(new BasicDBObject()); assertEquals(2, res.getN()); assertFalse(res.isUpdateOfExisting()); assertNull(res.getUpsertedId()); } @Test public void testMultiInsertNoContinue() { List<DBObject> documents = Arrays.<DBObject>asList(new BasicDBObject("_id", 1).append("x", 1).append("y", 2), new BasicDBObject("_id", 1).append("x", 3).append("y", 4), new BasicDBObject("x", 5).append("y", 6)); try { collection.insert(documents, WriteConcern.ACKNOWLEDGED); fail("Insert should have failed"); } catch (MongoException e) { assertEquals(11000, e.getCode()); } assertEquals(1, collection.count()); try { collection.insert(documents, new InsertOptions()); fail("Insert should have failed"); } catch (MongoException e) { assertEquals(11000, e.getCode()); } assertEquals(1, collection.count()); } @Test public void testMultiInsertWithContinue() { List<DBObject> documents = Arrays.<DBObject>asList(new BasicDBObject("_id", 1).append("x", 1).append("y", 2), new BasicDBObject("_id", 1).append("x", 3).append("y", 4), new BasicDBObject("x", 5).append("y", 6)); try { collection.insert(documents, new InsertOptions().continueOnError(true)); fail("Insert should have failed"); } catch (MongoException e) { assertEquals(11000, e.getCode()); } assertEquals(collection.count(), 2); } @Test(expected = IllegalArgumentException.class) public void testDotKeysFail() { DBCollection c = collection; DBObject obj = BasicDBObjectBuilder.start().add("x", 1).add("y", 2).add("foo.bar", "baz").get(); c.insert(obj); } }