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.selector.parser.DynamicPropertyResolver; import org.skyscreamer.yoga.selector.parser.MapSelectorResolver; import org.skyscreamer.yoga.test.model.basic.DataGenerator; import org.skyscreamer.yoga.test.model.extended.Artist; import org.skyscreamer.yoga.test.model.extended.User; import org.skyscreamer.yoga.test.util.AbstractTraverserTest; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; /** * User: corby * Date: 5/8/12 */ public class PropertyResolverTest extends AbstractTraverserTest { @Test // Populate a MapSelectorResolver with an aliased selector, and ensure it resolves correctly. public void testMapSelectorResolver() { Map<String,String> definedSelectors = new HashMap<String, String>(); definedSelectors.put( "$suggestedAlbums", "favoriteArtists(albums(title,songs(id,title)))" ); MapSelectorResolver mapSelectorResolver = new MapSelectorResolver(); mapSelectorResolver.setDefinedSelectors( definedSelectors ); setAliasSelectorResolver( mapSelectorResolver ); doTestResolver(); } @Test // Set up a DynamicPropertyResolver with the Properties file selectorAlias.properties, and ensure it // resolves the selector correctly. public void testDynamicPropertyResolver() throws IOException { DynamicPropertyResolver dynamicPropertyResolver = new DynamicPropertyResolver(); InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( "selectorAlias.properties" ); dynamicPropertyResolver.setPropertyFile( is ); setAliasSelectorResolver( dynamicPropertyResolver ); doTestResolver(); } @Test (expected=ParseSelectorException.class) public void testBadDynamicPropertyResolver() throws ParseSelectorException, IOException { DynamicPropertyResolver dynamicPropertyResolver = new DynamicPropertyResolver(); dynamicPropertyResolver.setPropertyFile( new BadInputStream() ); dynamicPropertyResolver.resolveSelector( "" ); } private void doTestResolver() { User corby = DataGenerator.corby(); Artist prince = DataGenerator.prince(); corby.getFavoriteArtists().add( prince ); prince.getAlbums().add( DataGenerator.nineteen99() ); prince.getAlbums().add( DataGenerator.diamondsAndPearls() ); ResultTraverser traverser = new ResultTraverser(); Map<String, Object> objectTree = doTraverse( corby, "$suggestedAlbums", traverser ); Assert.assertEquals( 3, objectTree.size() ); List<Map<String,Object>> favoriteArtists = getList( objectTree, "favoriteArtists" ); Assert.assertEquals( 1, favoriteArtists.size() ); Map<String,Object> princeMap = findItem( favoriteArtists, "name", "Prince" ); List<Map<String,Object>> albums = getList( princeMap, "albums" ); Assert.assertEquals( 2, albums.size() ); Map<String,Object> nineteen99Map = findItem( albums, "title", "1999" ); List<Map<String,Object>> songs = getList( nineteen99Map, "songs" ); Assert.assertEquals( 3, songs.size() ); Map<String,Object> marriedMap = findItem( songs, "id", 12 ); Assert.assertEquals( 2, marriedMap.size() ); Assert.assertEquals( "Let's Pretend We're Married", marriedMap.get( "title" ) ); } }