/*
* Copyright (c) [2011-2016] "Pivotal Software, Inc." / "Neo Technology" / "Graph Aware Ltd."
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product may include a number of subcomponents with
* separate copyright notices and license terms. Your use of the source
* code for these subcomponents is subject to the terms and
* conditions of the subcomponent's license, as noted in the LICENSE file.
*
*/
package org.springframework.data.neo4j.repositories;
import static org.junit.Assert.*;
import static org.neo4j.ogm.testutil.GraphTestUtils.*;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.neo4j.ogm.testutil.MultiDriverTestClass;
import org.springframework.data.neo4j.repositories.domain.Movie;
import org.springframework.data.neo4j.repositories.domain.User;
import org.springframework.data.neo4j.repositories.repo.MovieRepository;
import org.springframework.data.neo4j.repositories.repo.UserRepository;
import org.springframework.data.neo4j.repository.support.Neo4jRepositoryFactory;
import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;
import org.springframework.data.neo4j.util.IterableUtils;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
/**
* @author Michal Bachman
* @author Luanne Misquitta
* @author Mark Angrish
* @author Vince Bickers
*/
public class ProgrammaticRepositoryTests extends MultiDriverTestClass {
private static SessionFactory sessionFactory;
private static PlatformTransactionManager platformTransactionManager;
private static TransactionTemplate transactionTemplate;
private MovieRepository movieRepository;
private Session session;
@BeforeClass
public static void oneTimeSetUp() {
sessionFactory = new SessionFactory(getBaseConfiguration().build(), "org.springframework.data.neo4j.repositories.domain");
platformTransactionManager = new Neo4jTransactionManager(sessionFactory);
transactionTemplate = new TransactionTemplate(platformTransactionManager);
}
@Before
public void init() {
session = sessionFactory.openSession();
session.purgeDatabase();
}
@Test
public void canInstantiateRepositoryProgrammatically() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
public void doInTransactionWithoutResult(TransactionStatus status) {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
movieRepository = factory.getRepository(MovieRepository.class);
Movie movie = new Movie("PF");
movieRepository.save(movie);
}
});
assertSameGraph(getGraphDatabaseService(), "CREATE (m:Movie {title:'PF'})");
assertEquals(1, IterableUtils.count(movieRepository.findAll()));
}
/**
* @see DATAGRAPH-847
*/
@Test
@Transactional
public void shouldBeAbleToDeleteAllViaRepository() {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
UserRepository userRepository = factory.getRepository(UserRepository.class);
User userA = new User("A");
User userB = new User("B");
userRepository.save(userA);
userRepository.save(userB);
assertEquals(2, userRepository.count());
userRepository.deleteAll();
assertEquals(0, userRepository.count());
}
/**
* @see DATAGRAPH-813
*/
@Test
@Transactional
public void shouldDeleteUserByNameAndReturnCountOfDeletedUsers() {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
UserRepository userRepository = factory.getRepository(UserRepository.class);
User userA = new User("A");
userA.setName("A");
userRepository.save(userA);
Assert.assertEquals(1, userRepository.count());
Assert.assertEquals(new Long(1), userRepository.deleteByName("A"));
Assert.assertEquals(0, userRepository.count());
}
/**
* @see DATAGRAPH-813
*/
@Test
@Transactional
public void shouldDeleteUserByNameAndReturnListOfDeletedUserIds() {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
UserRepository userRepository = factory.getRepository(UserRepository.class);
User userA = new User("A");
User userAClone = new User("A");
userRepository.save(userA);
userRepository.save(userAClone);
Assert.assertEquals(2, userRepository.count());
List<Long> deletedUserIds = userRepository.removeByName("A");
Assert.assertEquals(2, deletedUserIds.size());
Assert.assertEquals(userA.getId(), deletedUserIds.get(0));
Assert.assertEquals(userAClone.getId(), deletedUserIds.get(1));
Assert.assertEquals(0, userRepository.count());
}
@Test
@Transactional
public void shouldBeAbleToDeleteUserWithRelationships() {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
UserRepository userRepository = factory.getRepository(UserRepository.class);
User userA = new User("A");
User userB = new User("B");
userA.getFriends().add(userB);
userB.getFriends().add(userA);
userRepository.save(userA);
Assert.assertEquals(2, userRepository.count());
userRepository.deleteByName("A");
Assert.assertEquals(1, userRepository.count());
}
/**
* @see DATAGRAPH-813
*/
@Test
@Transactional
public void shouldCountUserByName() {
RepositoryFactorySupport factory = new Neo4jRepositoryFactory(session);
UserRepository userRepository = factory.getRepository(UserRepository.class);
User userA = new User("A");
userA.setName("A");
userRepository.save(userA);
Assert.assertEquals(new Long(1), userRepository.countByName("A"));
}
}