/*
* Copyright 2011 VZ Netzwerke Ltd
* Copyright 2014 devbliss GmbH
*
* 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 org.mongojack;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mongojack.mock.MockEmbeddedObject;
import org.mongojack.mock.MockObject;
import org.mongojack.mock.MockObjectIntId;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
/**
* Test for parser and generator
*/
public class TestParsingAndGenerating extends MongoDBTestBase {
private JacksonDBCollection<MockObject, String> coll;
@Before
public void setup() throws Exception {
coll = getCollection(MockObject.class, String.class);
}
@Test
public void testInsertNoId() {
MockObject object = new MockObject();
coll.insert(object);
assertNotNull(coll.findOne()._id);
}
@Test
public void testInsertRetrieveAllEmpty() {
MockObject object = new MockObject();
object._id = "1";
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object, result);
}
@Test
public void testInsertRetrieveString() {
MockObject object = new MockObject();
object.string = "a string";
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.string, result.string);
}
@Test
public void testInsertRetrieveInteger() {
MockObject object = new MockObject();
object.integer = 10;
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.integer, result.integer);
}
@Test
public void testInsertRetrieveLong() {
MockObject object = new MockObject();
object.longs = 10L;
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.longs, result.longs);
}
@Test
@Ignore("BSON doesn't yet know how to handle BigInteger")
public void testInsertRetrieveBigInteger() {
MockObject object = new MockObject();
object.bigInteger = BigInteger.valueOf(100);
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.bigInteger, result.bigInteger);
}
@Test
public void testInsertRetrieveFloat() {
MockObject object = new MockObject();
object.floats = 3.0f;
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.floats, result.floats);
}
@Test
public void testInsertRetrieveDouble() {
MockObject object = new MockObject();
object.doubles = 4.65;
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.doubles, result.doubles);
}
@Test
@Ignore("BSON doesn't yet know how to handle BigDecimal")
public void testInsertRetrieveBigDecimal() {
MockObject object = new MockObject();
object.bigDecimal = BigDecimal.valueOf(4, 6);
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.bigDecimal, result.bigDecimal);
}
@Test
public void testInsertRetrieveBoolean() {
MockObject object = new MockObject();
object.booleans = true;
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.booleans, result.booleans);
}
@Test
public void testInsertRetrieveDate() {
MockObject object = new MockObject();
object.date = new Date(10000);
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.date, result.date);
}
@Test
public void testDateIsStoredAsBsonDate() {
MockObject object = new MockObject();
object.date = new Date(10000);
coll.insert(object);
DBObject result = coll.getDbCollection().findOne();
assertEquals(object.date, result.get("date"));
}
@Test
public void testInsertRetrieveEmptyList() {
MockObject object = new MockObject();
object.simpleList = Collections.emptyList();
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.simpleList, result.simpleList);
}
@Test
public void testInsertRetrievePopulatedSimpleList() {
MockObject object = new MockObject();
object.simpleList = Arrays.asList("1", "2");
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.simpleList, result.simpleList);
}
@Test
public void testInsertRetrievePopulatedComplexList() {
MockObject object = new MockObject();
MockEmbeddedObject o1 = new MockEmbeddedObject();
o1.value = "o1";
MockEmbeddedObject o2 = new MockEmbeddedObject();
o2.value = "o2";
object.complexList = Arrays.asList(o1, o2);
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.complexList, result.complexList);
}
@Test
public void testInsertRetrieveEmbeddedObject() {
MockObject object = new MockObject();
object.object = new MockEmbeddedObject();
object.object.value = "blah";
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.object, result.object);
}
@Test
public void testInsertRetrieveEmebeddedObjectList() {
MockObject object = new MockObject();
object.object = new MockEmbeddedObject();
object.object.list = Arrays.asList("1", "2");
coll.insert(object);
MockObject result = coll.findOne();
assertEquals(object.object, result.object);
}
@Test
public void testEverything() {
MockObject object = new MockObject();
object._id = "theid";
object.integer = 123;
object.longs = 1234L;
object.floats = 12.34f;
object.doubles = 123.456;
object.booleans = true;
object.simpleList = Arrays.asList("simple1", "simple2");
MockEmbeddedObject o1 = new MockEmbeddedObject();
o1.value = "embedded 1";
o1.list = Arrays.asList("e1 list1", "e1 list2");
MockEmbeddedObject o2 = new MockEmbeddedObject();
o2.value = "embedded 2";
o2.list = Arrays.asList("e2 list1", "e2 list2");
MockEmbeddedObject o3 = new MockEmbeddedObject();
o3.value = "embedded 3";
o3.list = Arrays.asList("e3 list1", "e3 list2");
object.complexList = Arrays.asList(o1, o2);
object.object = o3;
coll.insert(object);
assertEquals(object, coll.findOne());
}
@Test
public void testIntId() {
MockObjectIntId object = new MockObjectIntId();
object._id = 123456;
JacksonDBCollection<MockObjectIntId, Integer> coll = getCollectionAs(
MockObjectIntId.class, Integer.class);
coll.insert(object);
MockObjectIntId result = coll.findOne();
assertEquals(object._id, result._id);
}
@Test(expected = MongoException.class)
public void testParseErrors() {
DBCursor<MockObject> cursor = coll.find(new BasicDBObject("integer",
new BasicDBObject("$thisisinvalid", "true")));
cursor.hasNext();
}
@Test
public void testByteArray() throws Exception {
ObjectWithByteArray object = new ObjectWithByteArray();
object._id = "id";
object.bytes = new byte[] {1, 2, 3, 4, 5};
JacksonDBCollection<ObjectWithByteArray, String> coll = getCollectionAs(
ObjectWithByteArray.class, String.class);
coll.insert(object);
ObjectWithByteArray result = coll.findOne();
assertThat(result.bytes, equalTo(object.bytes));
// Ensure that it is actually stored as binary
DBObject dbObject = coll.getDbCollection().findOne();
assertThat(dbObject.get("bytes"), instanceOf(byte[].class));
}
public static class ObjectWithByteArray {
public String _id;
public byte[] bytes;
}
private <T, K> JacksonDBCollection<T, K> getCollectionAs(Class<T> type,
Class<K> keyType) {
return getCollection(type, keyType, coll.getName());
}
}