/*
* 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.examples.restaurants;
import static org.apache.webbeans.util.Asserts.assertNotNull;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.neo4j.ogm.session.SessionFactory;
import org.neo4j.ogm.testutil.MultiDriverTestClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
import org.springframework.data.neo4j.examples.restaurants.domain.Diner;
import org.springframework.data.neo4j.examples.restaurants.domain.Restaurant;
import org.springframework.data.neo4j.examples.restaurants.repo.RestaurantRepository;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@ContextConfiguration(classes = {RestaurantTests.RestaurantContext.class})
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
/**
*
* Tests that we support each kind of keyword specified by Part.Type
*
* @author Jasper Blues
*/
public class RestaurantTests extends MultiDriverTestClass {
@Autowired
private RestaurantRepository restaurantRepository;
@After
public void tearDown() {
restaurantRepository.deleteAll();
}
/**
* This test, as the below one does, asserts that the parameter index for each query part is set correctly. Most
* query parts are associated with one parameter, while certain kinds, such as NEAR, require more.
*
* @see DATAGRAPH-561
*/
@Test
public void shouldFindRestaurantsNear_nameParameterFirst() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
restaurantRepository.save(restaurant);
List<Restaurant> results = restaurantRepository.findByNameAndLocationNear(
"San Francisco International Airport (SFO)",
new Distance(150, Metrics.KILOMETERS), new Point(37.6, -122.3));
assertNotNull(results);
assertEquals(1, results.size());
Restaurant found = results.get(0);
assertNotNull(found.getLocation());
assertEquals(37.61649, found.getLocation().getX(), 0);
assertEquals(-122.38681, found.getLocation().getY(), 0);
}
/**
*
* This test, as the above one does, asserts that the parameter index for each query part is set correctly. Most
* query parts are associated with one parameter, while certain kinds, such as NEAR, require more.
*
* @see DATAGRAPH-561
*/
@Test
public void shouldFindRestaurantsNear_locationFirst() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
restaurantRepository.save(restaurant);
List<Restaurant> results = restaurantRepository.findByLocationNearAndName(
new Distance(150, Metrics.KILOMETERS), new Point(37.6, -122.3),
"San Francisco International Airport (SFO)");
assertNotNull(results);
assertEquals(1, results.size());
Restaurant found = results.get(0);
assertNotNull(found.getLocation());
assertEquals(37.61649, found.getLocation().getX(), 0);
assertEquals(-122.38681, found.getLocation().getY(), 0);
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindRestaurantsWithScoreBetween() {
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", 80.6);
restaurantRepository.save(cyma);
Restaurant awful = new Restaurant("Awful", 20.0);
restaurantRepository.save(awful);
List<Restaurant> results = restaurantRepository.findByScoreBetween(70.0, 80.0);
assertNotNull(results);
assertEquals(1, results.size());
List<Restaurant> shouldBeEmpty = restaurantRepository.findByScoreBetween(30.0, 40.0);
assertNotNull(shouldBeEmpty);
assertEquals(0, shouldBeEmpty.size());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByPropertyIsNull() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", "Mostly Ramen");
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByDescriptionIsNull();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByPropertyIsNotNull() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", "Mostly Ramen");
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByDescriptionIsNotNull();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindBNestedProperty_different_entity_type_IsNull() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
Diner diner = new Diner("Jasper", null);
restaurant.addRegularDiner(diner);
restaurantRepository.save(restaurant);
List<Restaurant> results = restaurantRepository.findByRegularDinersLastNameIsNull();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindBNestedProperty_same_entity_type_IsNull() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)",
new Point(37.61649, -122.38681), 94128);
Diner diner = new Diner("Jasper", null);
restaurant.addRegularDiner(diner);
Restaurant kuroda = new Restaurant("Kuroda", null);
restaurant.addSimilarRestaurant(kuroda);
restaurantRepository.save(restaurant);
List<Restaurant> results = restaurantRepository.findBySimilarRestaurantsDescriptionIsNull();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByScoreLessThan() {
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", 81.3);
restaurantRepository.save(cyma);
List<Restaurant> results = restaurantRepository.findByScoreLessThan(75);
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
results = restaurantRepository.findByScoreLessThan(72.4);
assertNotNull(results);
assertEquals(0, results.size());
results = restaurantRepository.findByScoreLessThanEqual(72.4);
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByScoreGreaterThan() {
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", 81.3);
restaurantRepository.save(cyma);
List<Restaurant> results = restaurantRepository.findByScoreGreaterThan(75);
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Cyma", results.get(0).getName());
results = restaurantRepository.findByScoreGreaterThan(90.0);
assertNotNull(results);
assertEquals(0, results.size());
results = restaurantRepository.findByScoreGreaterThanEqual(81.3);
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Cyma", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByLaunchDateBefore() {
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
kuroda.setLaunchDate(new Date(1000));
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", 80.5);
cyma.setLaunchDate(new Date(2000));
restaurantRepository.save(cyma);
List<Restaurant> results = restaurantRepository.findByLaunchDateBefore(new Date(1001));
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
results = restaurantRepository.findByLaunchDateBefore(new Date(999));
assertNotNull(results);
assertEquals(0, results.size());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByLaunchDateAfter() {
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
kuroda.setLaunchDate(new Date(1000));
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", 80.5);
cyma.setLaunchDate(new Date(2000));
restaurantRepository.save(cyma);
List<Restaurant> results = restaurantRepository.findByLaunchDateAfter(new Date(1500));
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Cyma", results.get(0).getName());
results = restaurantRepository.findByLaunchDateAfter(new Date(3000));
assertNotNull(results);
assertEquals(0, results.size());
}
/**
* All findByPropertyLike does currently is to require an exact match, ignoring case.
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameNotLike() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameNotLike("kuroda");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* All findByPropertyLike does currently is to require an exact match, ignoring case.
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameLike() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameLike("*san francisco international*");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameStartingWith() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameStartingWith("San Francisco");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameEndingWith() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameEndingWith("Airport (SFO)");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameContaining() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameContaining("International Airport");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
results = restaurantRepository.findByNameNotContaining("International Airport");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameContainingOrDescriptionIsNull() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
Restaurant cyma = new Restaurant("Cyma", "Greek Stuff");
List<Restaurant> results = restaurantRepository.findByNameContaining("International Airport");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
results = restaurantRepository.findByNameNotContainingOrDescriptionIsNull("International Airport");
Collections.sort(results);
assertNotNull(results);
assertEquals(2, results.size());
assertEquals("Kuroda", results.get(0).getName());
assertEquals("San Francisco International Airport (SFO)", results.get(1).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameIn() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameIn(Arrays.asList("Kuroda", "Foo", "Bar"));
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
results = restaurantRepository.findByNameNotIn(Arrays.asList("Kuroda", "Foo", "Bar"));
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameMatchesRegEx() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameMatchesRegex("(?i)san francisco.*");
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("San Francisco International Airport (SFO)", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByNameExists() {
Restaurant restaurant = new Restaurant("San Francisco International Airport (SFO)", 68.0);
restaurantRepository.save(restaurant);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByNameExists();
assertNotNull(results);
assertEquals(2, results.size());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByPropertyIsTrue()
{
Restaurant kazan = new Restaurant("Kazan", 77.0);
kazan.setHalal(true);
restaurantRepository.save(kazan);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
kuroda.setHalal(false);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByHalalIsTrue();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kazan", results.get(0).getName());
}
/**
* @see DATAGRAPH-904
*/
@Test
public void shouldFindByPropertyIsFalse()
{
Restaurant kazan = new Restaurant("Kazan", 77.0);
kazan.setHalal(true);
restaurantRepository.save(kazan);
Restaurant kuroda = new Restaurant("Kuroda", 72.4);
kuroda.setHalal(false);
restaurantRepository.save(kuroda);
List<Restaurant> results = restaurantRepository.findByHalalIsFalse();
assertNotNull(results);
assertEquals(1, results.size());
assertEquals("Kuroda", results.get(0).getName());
}
@Configuration
@ComponentScan({"org.springframework.data.neo4j.examples.restaurants"})
@EnableNeo4jRepositories("org.springframework.data.neo4j.examples.restaurants.repo")
@EnableTransactionManagement
static class RestaurantContext {
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(getBaseConfiguration().build(),"org.springframework.data.neo4j.examples.restaurants.domain");
}
@Bean
public PlatformTransactionManager transactionManager() {
return new Neo4jTransactionManager(sessionFactory());
}
}
}