package org.skyscreamer.yoga.selector; import org.junit.Assert; import org.junit.Test; import org.skyscreamer.yoga.exceptions.ParseSelectorException; import org.skyscreamer.yoga.mapper.ResultTraverser; import org.skyscreamer.yoga.test.model.basic.DataGenerator; import org.skyscreamer.yoga.test.model.extended.Album; import org.skyscreamer.yoga.test.model.extended.AlbumEntityConfiguration; import org.skyscreamer.yoga.test.model.extended.User; import org.skyscreamer.yoga.test.model.extended.UserEntityConfigurationWithArtistCoreField; import org.skyscreamer.yoga.test.util.AbstractTraverserTest; import java.util.List; import java.util.Map; /** * User: corby Date: 5/6/12 */ public class CoreFieldsTest extends AbstractTraverserTest { // The User object has a @Core annotation on the ID and Name fields. Pass in // an empty selector and a null selector, // and verify that only the ID and Name fields are returned. @Test public void testCoreAnnotations() throws ParseSelectorException { User solomon = DataGenerator.solomon(); ResultTraverser traverser = new ResultTraverser(); Map<String, Object> objectTree = doTraverse( solomon, ":", traverser ); Assert.assertEquals( 2, objectTree.size() ); Assert.assertEquals( solomon.getId(), objectTree.get( "id" ) ); Assert.assertEquals( solomon.getName(), objectTree.get( "name" ) ); } // Use an AlbumEntityConfiguration that defines ID and Title as core fields. Pass // in an empty selector and a null // selector, and verify that only the ID and Title fields are returned. @Test public void testNullCoreEntityConfigurationFields() { Album funeral = DataGenerator.funeral(); ResultTraverser traverser = new ResultTraverser(); getEntityConfigurationRegistry().register(new AlbumEntityConfiguration()); Map<String, Object> objectTree = doTraverse( funeral, null, traverser ); Assert.assertEquals( 2, objectTree.size() ); Assert.assertEquals( funeral.getId(), objectTree.get( "id" ) ); Assert.assertEquals( funeral.getTitle(), objectTree.get( "title" ) ); } /** * Use an AlbumEntityConfiguration that defines ID and Title as core fields. Pass * in an empty selector and a null selector, and verify that only the ID and * Title fields are returned. */ @Test public void testEmptyCoreEntityConfigurationFields() { Album funeral = DataGenerator.funeral(); ResultTraverser traverser = new ResultTraverser(); getEntityConfigurationRegistry().register( new AlbumEntityConfiguration() ); Map<String, Object> objectTree = doTraverse( funeral, ":", traverser ); Assert.assertEquals( 2, objectTree.size() ); Assert.assertEquals( funeral.getId(), objectTree.get( "id" ) ); Assert.assertEquals( funeral.getTitle(), objectTree.get( "title" ) ); } /** * Use a UserConfiguration that defines a complex type (List of Artists) as * a core field. Also, ensure that core fields defined by both the * YogaEntityConfiguration and the annotations are returned. */ @Test public void testComplexCoreFields() { User carter = DataGenerator.carter(); carter.getFavoriteArtists().add( DataGenerator.neutralMilkHotel() ); carter.getFavoriteArtists().add( DataGenerator.arcadeFire() ); ResultTraverser traverser = new ResultTraverser(); getEntityConfigurationRegistry().register( new UserEntityConfigurationWithArtistCoreField() ); Map<String, Object> objectTree = doTraverse( carter, ":", traverser ); Assert.assertEquals( 2, objectTree.size() ); Assert.assertEquals( carter.getId(), objectTree.get( "id" ) ); List<Map<String, Object>> favoriteArtists = getList( objectTree, "favoriteArtists" ); Assert.assertNotNull( favoriteArtists ); Assert.assertEquals( 2, favoriteArtists.size() ); Map<String, Object> neutralMap = findItem( favoriteArtists, "name", "Neutral Milk Hotel" ); Assert.assertEquals( DataGenerator.neutralMilkHotel().getId(), neutralMap.get( "id" ) ); Map<String, Object> arcadeMap = findItem( favoriteArtists, "name", "Arcade Fire" ); Assert.assertEquals( DataGenerator.arcadeFire().getId(), arcadeMap.get( "id" ) ); } }