package com.lordofthejars.nosqlunit.neo4j.extension.springtemplate.integration;
import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import static ch.lambdaj.Lambda.selectFirst;
import static com.lordofthejars.nosqlunit.neo4j.Neo4jRule.Neo4jRuleBuilder.newNeo4jRule;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
import java.util.Set;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.neo4j.graphdb.GraphDatabaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.data.neo4j.config.JtaTransactionManagerFactoryBean;
import org.springframework.data.neo4j.conversion.Result;
import org.springframework.data.neo4j.support.Neo4jTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import com.lordofthejars.nosqlunit.annotation.CustomComparisonStrategy;
import com.lordofthejars.nosqlunit.annotation.CustomInsertionStrategy;
import com.lordofthejars.nosqlunit.annotation.ShouldMatchDataSet;
import com.lordofthejars.nosqlunit.annotation.UsingDataSet;
import com.lordofthejars.nosqlunit.core.LoadStrategyEnum;
import com.lordofthejars.nosqlunit.neo4j.Neo4jRule;
import com.lordofthejars.nosqlunit.neo4j.extension.springtemplate.SpringTemplateComparisonStrategy;
import com.lordofthejars.nosqlunit.neo4j.extension.springtemplate.SpringTemplateInsertionStrategy;
@Ignore
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="embedded-neo4j-spring-definition.xml")
@CustomInsertionStrategy(insertionStrategy = SpringTemplateInsertionStrategy.class)
@CustomComparisonStrategy(comparisonStrategy = SpringTemplateComparisonStrategy.class)
public class WhenDataIsPopulatedUsingNeo4jTemplate {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private GraphDatabaseService graphDatabaseService;
@Rule
public Neo4jRule neo4jRule = newNeo4jRule().defaultSpringGraphDatabaseServiceNeo4j();
@Test
@UsingDataSet(locations="person.json", loadStrategy=LoadStrategyEnum.CLEAN_INSERT)
public void defined_data_should_be_inserted_into_neo4j() {
Neo4jTemplate neo4jTemplate = new Neo4jTemplate(graphDatabaseService);
Result<Person> persons = neo4jTemplate.findAll(Person.class);
Person person = selectFirst(persons, having(on(Person.class).getName(), is("alex")));
assertThat(person, is(new Person("alex")));
Set<Person> friends = person.getFriends();
assertThat(friends, containsInAnyOrder(new Person("josep")));
}
@Test
@UsingDataSet(locations="person.json", loadStrategy=LoadStrategyEnum.CLEAN_INSERT)
@ShouldMatchDataSet(location="expected-person.json")
public void new_data_should_be_compared_into_neo4j() {
final Neo4jTemplate neo4jTemplate = new Neo4jTemplate(graphDatabaseService);
TransactionTemplate transactionalTemplate = transactionalTemplate(graphDatabaseService);
transactionalTemplate.execute(new TransactionCallback<Void>() {
@Override
public Void doInTransaction(TransactionStatus status) {
Person person = new Person();
person.setName("ada");
neo4jTemplate.save(person);
return null;
}
});
}
private TransactionTemplate transactionalTemplate(GraphDatabaseService graphDatabaseService) {
try {
JtaTransactionManagerFactoryBean jtaTransactionManagerFactoryBean = new JtaTransactionManagerFactoryBean(graphDatabaseService);
return new TransactionTemplate(jtaTransactionManagerFactoryBean.getObject());
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
}