package com.springone.myrestaurants.domain; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.neo4j.graphdb.Node; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.graph.neo4j.support.node.Neo4jHelper; import org.springframework.data.graph.neo4j.support.GraphDatabaseContext; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.BeforeTransaction; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.sql.DataSource; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import static java.util.Arrays.asList; /** * @author Michael Hunger * @since 02.10.2010 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @DirtiesContext @Transactional public class TopRatedRestaurantFinderTest { @Autowired private GraphDatabaseContext graphDatabaseContext; @PersistenceContext EntityManager em; @Autowired DataSource dataSource; @Autowired PlatformTransactionManager transactionManager; @Before @BeforeTransaction public void cleanDb() { Neo4jHelper.cleanDb(graphDatabaseContext); } @Test public void returnsFriendsInOrder() { final Restaurant a = restaurant("a"); final Restaurant b = restaurant("b"); final Restaurant c = restaurant("c"); final UserAccount A = user("A"); final UserAccount B1 = user("B1"); final UserAccount B2 = user("B2"); final UserAccount C1 = user("C1"); Assert.assertNotNull("user has node", node(A)); A.knows(B1); A.knows(B2); B1.knows(C1); C1.rate(a, 1, ""); C1.rate(b, 5, ""); C1.rate(c, 3, ""); final Node node = node(A); final Collection<RatedRestaurant> topNRatedRestaurants = new TopRatedRestaurantFinder().getTopNRatedRestaurants(A, 5); Collection<Restaurant> result = new ArrayList<Restaurant>(); for (RatedRestaurant ratedRestaurant : topNRatedRestaurants) { result.add(ratedRestaurant.getRestaurant()); } final Restaurant b2 = em.find(Restaurant.class, 2L); Assert.assertNotNull(b2); Assert.assertEquals(asList(b,c, a), result); } private Node node(UserAccount a) { return a.getPersistentState(); } private UserAccount user(String name) { UserAccount userAccount = new UserAccount(); //userAccount.setId((long) name.hashCode()); em.persist(userAccount); em.flush(); userAccount.persist(); userAccount.setNickname(name); return userAccount; } private Restaurant restaurant(String name) { Restaurant restaurant = new Restaurant(); restaurant.setName(name); //restaurant.setId((long) name.hashCode()); em.persist(restaurant); em.flush(); restaurant.persist(); return restaurant; } private void dumpResults(String sql) { final List<Map<String, Object>> result = new SimpleJdbcTemplate(dataSource).queryForList(sql); System.out.println("result = " + result); } }