/* * 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.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; import org.junit.Test; public class TestDBRefHandling extends MongoDBTestBase { @Test public void simpleDbRefShouldBeSavedAsDbRef() { JacksonDBCollection<Owner, String> coll = getCollection(Owner.class, String.class); JacksonDBCollection<Referenced, String> refColl = getCollection( Referenced.class, String.class); refColl.insert(new Referenced("hello", 10)); coll.insert(new Owner(new DBRef<Referenced, String>("hello", refColl .getName()))); String id = coll.findOne()._id; Owner saved = coll.findOneById(id); assertThat(saved.ref, notNullValue()); assertThat(saved.ref.getId(), equalTo("hello")); assertThat(saved.ref.getCollectionName(), equalTo(refColl.getName())); // Try loading it Referenced ref = saved.ref.fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo("hello")); assertThat(ref.i, equalTo(10)); } @Test public void dbRefWithObjectIdShouldBeSavedAsDbRef() { JacksonDBCollection<ObjectIdOwner, String> coll = getCollection( ObjectIdOwner.class, String.class); JacksonDBCollection<ObjectIdReferenced, byte[]> refColl = getCollection( ObjectIdReferenced.class, byte[].class); byte[] refId = new org.bson.types.ObjectId().toByteArray(); refColl.insert(new ObjectIdReferenced(refId, 10)); coll.insert(new ObjectIdOwner(new DBRef<ObjectIdReferenced, byte[]>( refId, refColl.getName()))); String id = coll.findOne()._id; ObjectIdOwner saved = coll.findOneById(id); assertThat(saved.ref, notNullValue()); assertThat(saved.ref.getId(), equalTo(refId)); assertThat(saved.ref.getCollectionName(), equalTo(refColl.getName())); // Try loading it ObjectIdReferenced ref = saved.ref.fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo(refId)); assertThat(ref.i, equalTo(10)); } @Test public void testUsingMongoCollectionAnnotation() { JacksonDBCollection<Owner, String> coll = getCollection(Owner.class, String.class); JacksonDBCollection<Referenced, String> refColl = getCollection( Referenced.class, String.class, "referenced"); refColl.insert(new Referenced("hello", 10)); coll.insert(new Owner(new DBRef<Referenced, String>("hello", Referenced.class))); String id = coll.findOne()._id; Owner saved = coll.findOneById(id); assertThat(saved.ref, notNullValue()); assertThat(saved.ref.getId(), equalTo("hello")); assertThat(saved.ref.getCollectionName(), equalTo("referenced")); // Try loading it Referenced ref = saved.ref.fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo("hello")); assertThat(ref.i, equalTo(10)); } @Test public void testDBUpdateWithDbRef() { JacksonDBCollection<Owner, String> coll = getCollection(Owner.class, String.class); coll.insert(new Owner()); String id = coll.findOne()._id; coll.updateById(id, DBUpdate.set("ref", new DBRef<Referenced, String>( "hello", Referenced.class))); assertThat(coll.findOneById(id).ref, notNullValue()); assertThat(coll.findOneById(id).ref.getId(), equalTo("hello")); } public static class Owner { public Owner(DBRef<Referenced, String> ref) { this.ref = ref; } public Owner() { } @ObjectId public String _id; public DBRef<Referenced, String> ref; } @MongoCollection(name = "referenced") public static class Referenced { public Referenced(String _id, int i) { this._id = _id; this.i = i; } public Referenced() { } public String _id; public int i; } public static class ObjectIdOwner { public ObjectIdOwner(DBRef<ObjectIdReferenced, byte[]> ref) { this.ref = ref; } public ObjectIdOwner() { } @ObjectId public String _id; @ObjectId public DBRef<ObjectIdReferenced, byte[]> ref; } public static class ObjectIdReferenced { public ObjectIdReferenced(byte[] id, int i) { _id = id; this.i = i; } public ObjectIdReferenced() { } @ObjectId public byte[] _id; public int i; } @Test public void collectionOfDbRefsShouldBeSavedAsDbRefs() { JacksonDBCollection<CollectionOwner, String> coll = getCollection( CollectionOwner.class, String.class); JacksonDBCollection<Referenced, String> refColl = getCollection( Referenced.class, String.class, "referenced"); refColl.insert(new Referenced("hello", 10)); refColl.insert(new Referenced("world", 20)); CollectionOwner owner = new CollectionOwner(); owner.list = Arrays.asList(new DBRef<Referenced, String>("hello", refColl.getName()), new DBRef<Referenced, String>("world", refColl.getName())); owner._id = "foo"; coll.insert(owner); CollectionOwner saved = coll.findOneById("foo"); assertThat(saved.list, notNullValue()); assertThat(saved.list, hasSize(2)); assertThat(saved.list.get(0).getId(), equalTo("hello")); assertThat(saved.list.get(0).getCollectionName(), equalTo(refColl.getName())); assertThat(saved.list.get(1).getId(), equalTo("world")); assertThat(saved.list.get(1).getCollectionName(), equalTo(refColl.getName())); // Try loading them Referenced ref = saved.list.get(0).fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo("hello")); assertThat(ref.i, equalTo(10)); ref = saved.list.get(1).fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo("world")); assertThat(ref.i, equalTo(20)); } @Test public void fetchCollectionOfDBRefsShouldReturnRightResults() { JacksonDBCollection<CollectionOwner, String> coll = getCollection( CollectionOwner.class, String.class); JacksonDBCollection<Referenced, String> refColl = getCollection( Referenced.class, String.class, "referenced"); refColl.insert(new Referenced("hello", 10)); refColl.insert(new Referenced("world", 20)); CollectionOwner owner = new CollectionOwner(); owner.list = Arrays.asList(new DBRef<Referenced, String>("hello", refColl.getName()), new DBRef<Referenced, String>("world", refColl.getName())); owner._id = "foo"; coll.insert(owner); CollectionOwner saved = coll.findOneById("foo"); List<Referenced> fetched = coll.fetch(saved.list); assertThat(fetched, hasSize(2)); assertThat(fetched.get(0)._id, equalTo("hello")); assertThat(fetched.get(0).i, equalTo(10)); assertThat(fetched.get(1)._id, equalTo("world")); assertThat(fetched.get(1).i, equalTo(20)); } public static class CollectionOwner { public String _id; public List<DBRef<Referenced, String>> list; } @Test public void collectionOfObjectIdDbRefsShouldBeSavedAsObjectIdDbRefs() { JacksonDBCollection<ObjectIdCollectionOwner, String> coll = getCollection( ObjectIdCollectionOwner.class, String.class); JacksonDBCollection<ObjectIdReferenced, byte[]> refColl = getCollection( ObjectIdReferenced.class, byte[].class, "referenced"); byte[] refId1 = new org.bson.types.ObjectId().toByteArray(); refColl.insert(new ObjectIdReferenced(refId1, 10)); byte[] refId2 = new org.bson.types.ObjectId().toByteArray(); refColl.insert(new ObjectIdReferenced(refId2, 20)); ObjectIdCollectionOwner owner = new ObjectIdCollectionOwner(); owner.list = Arrays .asList(new DBRef<ObjectIdReferenced, byte[]>(refId1, refColl .getName()), new DBRef<ObjectIdReferenced, byte[]>( refId2, refColl.getName())); owner._id = "foo"; coll.insert(owner); ObjectIdCollectionOwner saved = coll.findOneById("foo"); assertThat(saved.list, notNullValue()); assertThat(saved.list, hasSize(2)); assertThat(saved.list.get(0).getId(), equalTo(refId1)); assertThat(saved.list.get(0).getCollectionName(), equalTo(refColl.getName())); assertThat(saved.list.get(1).getId(), equalTo(refId2)); assertThat(saved.list.get(1).getCollectionName(), equalTo(refColl.getName())); // Try loading them ObjectIdReferenced ref = saved.list.get(0).fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo(refId1)); assertThat(ref.i, equalTo(10)); ref = saved.list.get(1).fetch(); assertThat(ref, notNullValue()); assertThat(ref._id, equalTo(refId2)); assertThat(ref.i, equalTo(20)); } public static class ObjectIdCollectionOwner { public String _id; @ObjectId public List<DBRef<ObjectIdReferenced, byte[]>> list; } }