/** * */ package org.minnal.instrument.entity; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Set; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import org.activejpa.entity.Model; import org.minnal.instrument.NamingStrategy; import org.minnal.instrument.UnderscoreNamingStrategy; import org.minnal.instrument.entity.EntityNode.EntityNodePath; import org.minnal.instrument.entity.metadata.EntityMetaDataProvider; import org.minnal.utils.Node.PathVisitor; import org.testng.annotations.Test; /** * @author ganeshs * */ public class EntityNodeTest { private EntityNode entityNode; private NamingStrategy namingStrategy = new UnderscoreNamingStrategy(); @Test public void shouldConstructEntityTree() { entityNode = new EntityNode(CompositeModel.class, namingStrategy); entityNode.construct(); assertEquals(entityNode.getChildren().size(), 2); } @Test public void shouldPopulateEntityNodeName() { entityNode = new EntityNode(CompositeModel.class, namingStrategy); assertEquals(entityNode.getName(), "compositeModel"); } @Test public void shouldPopulateEntityResourceName() { entityNode = new EntityNode(CompositeModel.class, namingStrategy); assertEquals(entityNode.getResourceName(), "composite_models"); } @Test public void shouldPopulateEntityMetaData() { entityNode = new EntityNode(Parent.class, namingStrategy); assertEquals(entityNode.getEntityMetaData(), EntityMetaDataProvider.instance().getEntityMetaData(Parent.class)); } @Test public void shouldPopulateEntityMetaDataWithoutLooping() { entityNode = new EntityNode(CompositeModel.class, namingStrategy); entityNode.construct(); assertEquals(entityNode.getEntityMetaData(), EntityMetaDataProvider.instance().getEntityMetaData(CompositeModel.class)); } @Test public void shouldPopulateEntityMetaDataWithBidirectionalAssociation() { entityNode = new EntityNode(Employee.class, namingStrategy); entityNode.construct(); assertEquals(entityNode.getEntityMetaData(), EntityMetaDataProvider.instance().getEntityMetaData(Employee.class)); } @Test public void shouldCreateEntityNodePath() { entityNode = new EntityNode(Parent.class, namingStrategy); entityNode.construct(); List<EntityNode> path = Arrays.asList(entityNode, entityNode.getChildren().iterator().next()); assertEquals(entityNode.createNodePath(path), entityNode.new EntityNodePath(path)); } @Test public void shouldTraverseEntityTree() { entityNode = new EntityNode(Parent.class, namingStrategy); entityNode.construct(); PathVisitor<EntityNodePath, EntityNode> visitor = mock(PathVisitor.class); entityNode.traverse(visitor); verify(visitor).visit(entityNode.createNodePath(Arrays.asList(entityNode))); verify(visitor).visit(entityNode.createNodePath(Arrays.asList(entityNode, entityNode.getChildren().iterator().next()))); } @Test public void shouldGetEntityNodePathForPathString() { entityNode = new EntityNode(Parent.class, namingStrategy); entityNode.construct(); EntityNodePath path = entityNode.getEntityNodePath("children"); assertEquals(path.getBulkPath(), "/parents/{parent_id}/children"); } @Entity private class CompositeModel extends Model { private Long id; private String code; @OneToMany private Set<CompositeModel> children; @OneToMany private Set<CompositeModel> siblings; @Override public Serializable getId() { return null; } } private class Employee extends Model { @Id private Long id; @ManyToMany private Set<Department> departments; @Override public Serializable getId() { return id; } } private class Department extends Model { @Id private Long id; @ManyToMany private Set<Employee> employees; @Override public Serializable getId() { return id; } } @Entity private class Parent extends Model { @Id @Searchable private Long id; @EntityKey @Searchable private String code; @OneToMany private Set<Child> children; @Override public Serializable getId() { return id; } } @Entity private class Child extends Model { @Id private Long id; @EntityKey @Searchable private String code; @OneToMany public Serializable getId() { return null; } } }