/** * Copyright 2009-2013 Oy Vaadin Ltd * * 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.vaadin.addon.jpacontainer.metadata; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.Collection; import java.util.Set; import javax.persistence.Id; import javax.persistence.Version; import org.junit.Before; import org.junit.Test; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Address_F; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Address_M; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Data_D; import com.vaadin.addon.jpacontainer.metadata.TestClasses.EmbeddedIdEntity_F; import com.vaadin.addon.jpacontainer.metadata.TestClasses.EmbeddedIdEntity_M; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Integer_ConcreteId_M; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Person_F; import com.vaadin.addon.jpacontainer.metadata.TestClasses.Person_M; import com.vaadin.addon.jpacontainer.testdata.Data; /** * Test case for {@link MetadataFactory}. * * @author Petter Holmström (Vaadin Ltd) * @since 1.0 */ public class MetadataFactoryTest { private MetadataFactory factory; @Before public void setUp() { factory = MetadataFactory.getInstance(); } @Test public void testGetMetadataFromFields_EntityClass() { EntityClassMetadata<Person_F> metadata = factory .getEntityClassMetadata(Person_F.class); // Basic information assertEquals("Person_F", metadata.getEntityName()); assertEquals(Person_F.class, metadata.getMappedClass()); assertTrue(metadata.hasIdentifierProperty()); { PersistentPropertyMetadata id = metadata.getIdentifierProperty(); assertEquals("id", id.getName()); assertEquals(Integer.class, id.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, id.getAccessType()); assertNotNull(id.getAnnotation(Id.class)); assertNull(id.getTypeMetadata()); assertTrue(id.isWritable()); } assertTrue(metadata.hasVersionProperty()); { PersistentPropertyMetadata version = metadata.getVersionProperty(); assertEquals("version", version.getName()); assertEquals(Integer.class, version.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, version.getAccessType()); assertNotNull(version.getAnnotation(Version.class)); assertNull(version.getTypeMetadata()); assertTrue(version.isWritable()); } assertFalse(metadata.hasEmbeddedIdentifier()); // Properties assertSame(metadata.getIdentifierProperty(), metadata.getProperty("id")); assertSame(metadata.getVersionProperty(), metadata.getProperty("version")); { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("firstName"); assertEquals("firstName", prop.getName()); assertEquals(String.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, prop.getAccessType()); assertEquals(PropertyKind.SIMPLE, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("lastName"); assertEquals("lastName", prop.getName()); assertEquals(String.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, prop.getAccessType()); assertEquals(PropertyKind.SIMPLE, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("address"); assertEquals("address", prop.getName()); assertEquals(Address_F.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, prop.getAccessType()); assertEquals(PropertyKind.EMBEDDED, prop.getPropertyKind()); assertNotNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("children"); assertEquals("children", prop.getName()); assertEquals(Collection.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, prop.getAccessType()); assertEquals(PropertyKind.ONE_TO_MANY, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("parent"); assertEquals("parent", prop.getName()); assertEquals(Person_F.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.FIELD, prop.getAccessType()); assertEquals(PropertyKind.MANY_TO_ONE, prop.getPropertyKind()); assertSame(metadata, prop.getTypeMetadata()); assertTrue(prop.isWritable()); } // These fields do not have getter methods, hence they cannot be present // in the metadata assertNull(metadata.getProperty("transientField")); assertNull(metadata.getProperty("transientField2")); { PropertyMetadata prop = metadata.getProperty("transientBaseField"); assertEquals("transientBaseField", prop.getName()); assertEquals(Integer.class, prop.getType()); assertFalse(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientField3"); assertEquals("transientField3", prop.getName()); assertEquals(String.class, prop.getType()); assertFalse(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientField4"); assertEquals("transientField4", prop.getName()); assertEquals(String.class, prop.getType()); assertTrue(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientAddress"); assertEquals("transientAddress", prop.getName()); assertEquals(Address_M.class, prop.getType()); assertTrue(prop.isWritable()); } assertEquals(11, metadata.getProperties().size()); } @Test public void testGetMetadataFromMethods_EntityClass() { EntityClassMetadata<Person_M> metadata = factory .getEntityClassMetadata(Person_M.class); // Basic information assertEquals("Person_M", metadata.getEntityName()); assertEquals(Person_M.class, metadata.getMappedClass()); assertTrue(metadata.hasIdentifierProperty()); { PersistentPropertyMetadata id = metadata.getIdentifierProperty(); assertEquals("id", id.getName()); assertEquals(Integer.class, id.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, id.getAccessType()); assertNotNull(id.getAnnotation(Id.class)); assertNull(id.getTypeMetadata()); assertTrue(id.isWritable()); } assertTrue(metadata.hasVersionProperty()); { PersistentPropertyMetadata version = metadata.getVersionProperty(); assertEquals("version", version.getName()); assertEquals(Integer.class, version.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, version.getAccessType()); assertNotNull(version.getAnnotation(Version.class)); assertNull(version.getTypeMetadata()); assertTrue(version.isWritable()); } assertFalse(metadata.hasEmbeddedIdentifier()); // Properties assertSame(metadata.getIdentifierProperty(), metadata.getProperty("id")); assertSame(metadata.getVersionProperty(), metadata.getProperty("version")); { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("firstName"); assertEquals("firstName", prop.getName()); assertEquals(String.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, prop.getAccessType()); assertEquals(PropertyKind.SIMPLE, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("lastName"); assertEquals("lastName", prop.getName()); assertEquals(String.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, prop.getAccessType()); assertEquals(PropertyKind.SIMPLE, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("address"); assertEquals("address", prop.getName()); assertEquals(Address_M.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, prop.getAccessType()); assertEquals(PropertyKind.EMBEDDED, prop.getPropertyKind()); assertNotNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("children"); assertEquals("children", prop.getName()); assertEquals(Collection.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, prop.getAccessType()); assertEquals(PropertyKind.ONE_TO_MANY, prop.getPropertyKind()); assertNull(prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PersistentPropertyMetadata prop = (PersistentPropertyMetadata) metadata .getProperty("parent"); assertEquals("parent", prop.getName()); assertEquals(Person_M.class, prop.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, prop.getAccessType()); assertEquals(PropertyKind.MANY_TO_ONE, prop.getPropertyKind()); assertSame(metadata, prop.getTypeMetadata()); assertTrue(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientBaseField"); assertEquals("transientBaseField", prop.getName()); assertEquals(Integer.class, prop.getType()); assertFalse(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientField"); assertEquals("transientField", prop.getName()); assertEquals(String.class, prop.getType()); assertFalse(prop.isWritable()); } { PropertyMetadata prop = metadata.getProperty("transientField2"); assertEquals("transientField2", prop.getName()); assertEquals(String.class, prop.getType()); assertTrue(prop.isWritable()); } assertEquals(10, metadata.getProperties().size()); } @Test public void testGetMetadataFromMethods_InheritanceOrder() { EntityClassMetadata<Integer_ConcreteId_M> metadata = factory .getEntityClassMetadata(Integer_ConcreteId_M.class); // Basic information assertEquals("Integer_ConcreteId_M", metadata.getEntityName()); assertEquals(Integer_ConcreteId_M.class, metadata.getMappedClass()); assertTrue(metadata.hasIdentifierProperty()); { PersistentPropertyMetadata id = metadata.getIdentifierProperty(); assertEquals("id", id.getName()); assertEquals(Integer.class, id.getType()); assertEquals(PersistentPropertyMetadata.AccessType.METHOD, id.getAccessType()); assertNotNull(id.getAnnotation(Id.class)); assertNull(id.getTypeMetadata()); assertTrue(id.isWritable()); } // Properties assertSame(metadata.getIdentifierProperty(), metadata.getProperty("id")); assertEquals(1, metadata.getProperties().size()); } @Test public void testGetEmbeddedIdFromFields() { EntityClassMetadata<EmbeddedIdEntity_F> metadata = factory .getEntityClassMetadata(EmbeddedIdEntity_F.class); assertTrue(metadata.hasIdentifierProperty()); assertTrue(metadata.hasEmbeddedIdentifier()); assertFalse(metadata.hasVersionProperty()); assertSame(factory.getClassMetadata(Address_F.class, PersistentPropertyMetadata.AccessType.FIELD), metadata .getIdentifierProperty().getTypeMetadata()); } @Test public void testGetEmbeddedIdFromMethods() { EntityClassMetadata<EmbeddedIdEntity_M> metadata = factory .getEntityClassMetadata(EmbeddedIdEntity_M.class); assertTrue(metadata.hasIdentifierProperty()); assertTrue(metadata.hasEmbeddedIdentifier()); assertFalse(metadata.hasVersionProperty()); assertSame(factory.getClassMetadata(Address_M.class, PersistentPropertyMetadata.AccessType.METHOD), metadata .getIdentifierProperty().getTypeMetadata()); } @Test public void testBuildMetadataForEntityWithTargetEntityAnnotatedField() { EntityClassMetadata<Data_D> metadata = factory .getEntityClassMetadata(Data_D.class); } @Test public void testCollectionTypeWithTargetEntityAnnotation() { EntityClassMetadata<Data> metadata = factory .getEntityClassMetadata(Data.class); Class<?> type = metadata.getProperty("manyToMany").getType(); assertEquals(Set.class, type); } }