/* * 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.junit.Test; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; public class DBRefTest extends DatabaseTestCase { @SuppressWarnings("unchecked") @Test public void testRefListRoundTrip() { DBCollection a = database.getCollection("reflistfield"); List<DBRef> refs = new ArrayList<DBRef>(); refs.add(new DBRef("other", 12)); refs.add(new DBRef("other", 14)); refs.add(new DBRef("other", 16)); a.save(new BasicDBObject("refs", refs)); DBObject loaded = a.findOne(); assertNotNull(loaded); List<DBRef> refsLoaded = (List<DBRef>) loaded.get("refs"); assertNotNull(refsLoaded); assertEquals(3, refsLoaded.size()); assertEquals(DBRef.class, refsLoaded.get(0).getClass()); assertEquals(12, refsLoaded.get(0).getId()); assertEquals(14, refsLoaded.get(1).getId()); assertEquals(16, refsLoaded.get(2).getId()); } @Test public void testRoundTrip() { DBCollection a = database.getCollection("refroundtripa"); DBCollection b = database.getCollection("refroundtripb"); a.drop(); b.drop(); a.save(new BasicDBObject("_id", 17).append("n", 111)); b.save(new BasicDBObject("n", 12).append("l", new DBRef("refroundtripa", 17))); assertEquals(12, b.findOne().get("n")); assertEquals(DBRef.class, b.findOne().get("l").getClass()); } @Test public void testFindByDBRef() { DBRef ref = new DBRef("fake", 17); collection.save(new BasicDBObject("n", 12).append("l", ref)); assertEquals(12, collection.findOne().get("n")); assertEquals(DBRef.class, collection.findOne().get("l").getClass()); DBObject loaded = collection.findOne(new BasicDBObject("l", ref)); assertEquals(12, loaded.get("n")); assertEquals(DBRef.class, loaded.get("l").getClass()); assertEquals(ref.getId(), ((DBRef) loaded.get("l")).getId()); assertEquals(ref.getCollectionName(), ((DBRef) loaded.get("l")).getCollectionName()); } @Test public void testGetEntityWithSingleDBRefWithCompoundId() { DBCollection a = database.getCollection("a"); a.drop(); BasicDBObject compoundId = new BasicDBObject("name", "someName").append("email", "test@example.com"); BasicDBObject entity = new BasicDBObject("_id", "testId").append("ref", new DBRef("fake", compoundId)); a.save(entity); DBObject fetched = a.findOne(new BasicDBObject("_id", "testId")); assertNotNull(fetched); assertFalse(fetched.containsField("$id")); assertEquals(fetched, entity); } @Test public void testGetEntityWithArrayOfDBRefsWithCompoundIds() { DBCollection a = database.getCollection("a"); a.drop(); BasicDBObject compoundId1 = new BasicDBObject("name", "someName").append("email", "test@example.com"); BasicDBObject compoundId2 = new BasicDBObject("name", "someName2").append("email", "test2@example.com"); BasicDBList listOfRefs = new BasicDBList(); listOfRefs.add(new DBRef("fake", compoundId1)); listOfRefs.add(new DBRef("fake", compoundId2)); BasicDBObject entity = new BasicDBObject("_id", "testId").append("refs", listOfRefs); a.save(entity); DBObject fetched = a.findOne(new BasicDBObject("_id", "testId")); assertNotNull(fetched); assertEquals(fetched, entity); } @Test public void testGetEntityWithMapOfDBRefsWithCompoundIds() { DBCollection base = database.getCollection("basecollection"); base.drop(); BasicDBObject compoundId1 = new BasicDBObject("name", "someName").append("email", "test@example.com"); BasicDBObject compoundId2 = new BasicDBObject("name", "someName2").append("email", "test2@example.com"); BasicDBObject mapOfRefs = new BasicDBObject().append("someName", new DBRef("compoundkeys", compoundId1)) .append("someName2", new DBRef("compoundkeys", compoundId2)); BasicDBObject entity = new BasicDBObject("_id", "testId").append("refs", mapOfRefs); base.save(entity); DBObject fetched = base.findOne(new BasicDBObject("_id", "testId")); assertNotNull(fetched); DBObject fetchedRefs = (DBObject) fetched.get("refs"); assertFalse(fetchedRefs.keySet().contains("$id")); assertEquals(fetched, entity); } }