package org.mongodb.morphia.issue377;
import com.mongodb.DBObject;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Serialized;
import org.mongodb.morphia.dao.BasicDAO;
import org.mongodb.morphia.mapping.MappedClass;
import org.mongodb.morphia.mapping.MappedField;
import org.mongodb.morphia.mapping.Mapper;
import org.mongodb.morphia.mapping.cache.DefaultEntityCache;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* Unit test for testing morphia mappings with Serialized
*/
public class TestMapping extends TestBase {
@Test
public void testCanMapSerializableObject() {
// given
Mapper mapper = new Mapper();
User user = new User();
user.id = 1;
user.userObject = new SerializableObject();
// when
DBObject dbObject = mapper.toDBObject(user);
User object = mapper.fromDBObject(getDs(), User.class, dbObject, new DefaultEntityCache());
// then
assertThat(object.userObject, is(user.userObject));
}
@Test
public void testMapping() {
final BasicDAO<User, ObjectId> messageDAO = new BasicDAO<User, ObjectId>(User.class, getDs());
Assert.assertNotNull(messageDAO);
Mapper mapper = new Mapper();
User user = new User();
user.id = 1;
user.userObject = "just a String";
DBObject dbObject = mapper.toDBObject(user);
Object object = mapper.fromDBObject(getDs(), User.class, dbObject, new DefaultEntityCache());
Assert.assertEquals(user.userObject, ((User) object).userObject);
user.userObject = 33;
dbObject = mapper.toDBObject(user);
object = mapper.fromDBObject(getDs(), User.class, dbObject, new DefaultEntityCache());
Assert.assertEquals(user.userObject, ((User) object).userObject);
user.userObject = 33.3;
dbObject = mapper.toDBObject(user);
object = mapper.fromDBObject(getDs(), User.class, dbObject, new DefaultEntityCache());
Assert.assertEquals(user.userObject, ((User) object).userObject);
}
@Test
public void testToMongoObjectCorrectlyMapsSerializableFieldForIssue591() {
// given
Mapper mapper = new Mapper();
User user = new User();
user.id = 1;
user.userObject = new SerializableObject();
MappedClass mc = new MappedClass(User.class, mapper);
MappedField mf = mc.getMappedField("userObject");
// when
Object dbValue = mapper.toMongoObject(mf, null, user.userObject);
Class<byte[]> byteArrayClass = byte[].class;
// then
assertThat(dbValue, is(instanceOf(byteArrayClass)));
}
@Test
public void testToMongoObjectCorrectlyMapsSerializableListOfObjectsForIssue591() {
// given
Mapper mapper = new Mapper();
ListEntity user = new ListEntity();
user.id = 1;
List<Object> list = new ArrayList<Object>();
list.add("value");
user.list = list;
MappedClass mc = new MappedClass(ListEntity.class, mapper);
MappedField mf = mc.getMappedField("list");
// when
Object dbValue = mapper.toMongoObject(mf, null, user.list);
Class<byte[]> byteArrayClass = byte[].class;
// then
assertThat(dbValue, is(instanceOf(byteArrayClass)));
}
@Entity
@SuppressWarnings("unused")
private static class User {
@Id
private Integer id;
@Serialized
private Object userObject;
}
@Entity
@SuppressWarnings("unused")
private static class ListEntity {
@Id
private Integer id;
@Serialized
private List<Object> list;
}
private static class SerializableObject implements Serializable {
private final int someValue = 7;
@Override
public boolean equals(final Object o) {
return this == o || !(o == null || getClass() != o.getClass());
}
@Override
public int hashCode() {
return someValue;
}
}
}