/* * Copyright (c) 2002-2017 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * 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.neo4j.ogm.persistence.examples.social; import static org.junit.Assert.*; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.neo4j.ogm.cypher.ComparisonOperator; import org.neo4j.ogm.cypher.Filter; import org.neo4j.ogm.domain.social.Individual; import org.neo4j.ogm.domain.social.Mortal; import org.neo4j.ogm.domain.social.Person; import org.neo4j.ogm.domain.social.User; import org.neo4j.ogm.session.Session; import org.neo4j.ogm.session.SessionFactory; import org.neo4j.ogm.testutil.MultiDriverTestClass; /** * @author Luanne Misquitta */ public class SocialIntegrationTest extends MultiDriverTestClass { private static SessionFactory sessionFactory; private Session session; @BeforeClass public static void oneTimeSetUp() { sessionFactory = new SessionFactory(getBaseConfiguration().build(), "org.neo4j.ogm.domain.social"); } @Before public void init() throws IOException { session = sessionFactory.openSession(); } @After public void clearDatabase() { session.purgeDatabase(); } /** * @see DATAGRAPH-594 */ @Test public void shouldFetchOnlyPeopleILike() { session.query("create (p1:Person {name:'A'}) create (p2:Person {name:'B'}) create (p3:Person {name:'C'})" + " create (p4:Person {name:'D'}) create (p1)-[:LIKES]->(p2) create (p1)-[:LIKES]->(p3) create (p4)-[:LIKES]->(p1)", Collections.EMPTY_MAP); Person personA = session.loadAll(Person.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(personA); assertEquals(2, personA.getPeopleILike().size()); Person personD = session.loadAll(Person.class, new Filter("name", ComparisonOperator.EQUALS, "D")).iterator().next(); assertNotNull(personD); assertEquals(1, personD.getPeopleILike().size()); assertEquals(personA, personD.getPeopleILike().get(0)); } /** * @see DATAGRAPH-594 */ @Test public void shouldFetchFriendsInBothDirections() { session.query("create (p1:Individual {name:'A'}) create (p2:Individual {name:'B'}) create (p3:Individual {name:'C'})" + " create (p4:Individual {name:'D'}) create (p1)-[:FRIENDS]->(p2) create (p1)-[:FRIENDS]->(p3) create (p4)-[:FRIENDS]->(p1)", Collections.EMPTY_MAP); Individual individualA = session.loadAll(Individual.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(individualA); assertEquals(2, individualA.getFriends().size()); } /** * @see DATAGRAPH-594 */ @Test public void shouldFetchFriendsForUndirectedRelationship() { session.query("create (p1:User {name:'A'}) create (p2:User {name:'B'}) create (p3:User {name:'C'})" + " create (p4:User {name:'D'}) create (p1)-[:FRIEND]->(p2) create (p1)-[:FRIEND]->(p3) create (p4)-[:FRIEND]->(p1)", Collections.EMPTY_MAP); User userA = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(userA); assertEquals(3, userA.getFriends().size()); User userB = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "B")).iterator().next(); assertNotNull(userB); assertEquals(1, userB.getFriends().size()); assertEquals(userA, userB.getFriends().get(0)); User userD = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "D")).iterator().next(); assertNotNull(userD); assertEquals(1, userD.getFriends().size()); assertEquals(userA, userD.getFriends().get(0)); } /** * @see DATAGRAPH-594 */ @Test public void shouldSaveUndirectedFriends() { User userA = new User("A"); User userB = new User("B"); User userC = new User("C"); User userD = new User("D"); userA.getFriends().add(userB); userA.getFriends().add(userC); userD.getFriends().add(userA); session.save(userA); session.save(userB); session.save(userC); session.save(userD); session.clear(); userA = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(userA); assertEquals(3, userA.getFriends().size()); userB = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "B")).iterator().next(); assertNotNull(userB); assertEquals(1, userB.getFriends().size()); assertEquals(userA.getName(), userB.getFriends().get(0).getName()); userD = session.loadAll(User.class, new Filter("name", ComparisonOperator.EQUALS, "D")).iterator().next(); assertNotNull(userD); assertEquals(1, userD.getFriends().size()); assertEquals(userA.getName(), userD.getFriends().get(0).getName()); } /** * @see DATAGRAPH-594 */ @Test public void shouldSaveUndirectedFriendsInBothDirections() { Person userA = new Person("A"); Person userB = new Person("B"); userA.getPeopleILike().add(userB); userB.getPeopleILike().add(userA); session.save(userA); session.clear(); userA = session.loadAll(Person.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(userA); assertEquals(1, userA.getPeopleILike().size()); session.clear(); userB = session.loadAll(Person.class, new Filter("name", ComparisonOperator.EQUALS, "B")).iterator().next(); assertNotNull(userB); assertEquals(1, userB.getPeopleILike().size()); } /** * @see DATAGRAPH-594 */ @Test public void shouldSaveIncomingKnownMortals() { Mortal mortalA = new Mortal("A"); Mortal mortalB = new Mortal("B"); Mortal mortalC = new Mortal("C"); Mortal mortalD = new Mortal("D"); mortalA.getKnownBy().add(mortalB); mortalA.getKnownBy().add(mortalC); mortalD.getKnownBy().add(mortalA); session.save(mortalA); session.save(mortalB); session.save(mortalC); session.save(mortalD); session.clear(); mortalA = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(mortalA); assertEquals(2, mortalA.getKnownBy().size()); mortalB = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "B")).iterator().next(); assertNotNull(mortalB); assertEquals(0, mortalB.getKnownBy().size()); mortalC = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "C")).iterator().next(); assertNotNull(mortalC); assertEquals(0, mortalC.getKnownBy().size()); mortalD = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "D")).iterator().next(); assertNotNull(mortalD); assertEquals(1, mortalD.getKnownBy().size()); assertEquals("A", mortalD.getKnownBy().iterator().next().getName()); } /** * @see DATAGRAPH-594 */ @Test public void shouldFetchIncomingKnownMortals() { session.query("create (m1:Mortal {name:'A'}) create (m2:Mortal {name:'B'}) create (m3:Mortal {name:'C'})" + " create (m4:Mortal {name:'D'}) create (m1)<-[:KNOWN_BY]-(m2) create (m1)<-[:KNOWN_BY]-(m3) create (m4)<-[:KNOWN_BY]-(m1)", Collections.EMPTY_MAP); Mortal mortalA = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "A")).iterator().next(); assertNotNull(mortalA); assertEquals(2, mortalA.getKnownBy().size()); Mortal mortalB = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "B")).iterator().next(); assertNotNull(mortalB); assertEquals(0, mortalB.getKnownBy().size()); Mortal mortalC = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "C")).iterator().next(); assertNotNull(mortalC); assertEquals(0, mortalC.getKnownBy().size()); Mortal mortalD = session.loadAll(Mortal.class, new Filter("name", ComparisonOperator.EQUALS, "D")).iterator().next(); assertNotNull(mortalD); assertEquals(1, mortalD.getKnownBy().size()); assertEquals("A", mortalD.getKnownBy().iterator().next().getName()); } @Test public void shouldFetchFriendsUndirected() { User adam = new User("Adam"); User daniela = new User("Daniela"); User michal = new User("Michal"); User vince = new User("Vince"); adam.befriend(daniela); daniela.befriend(michal); michal.befriend(vince); session.save(adam); session.clear(); adam = session.load(User.class, adam.getId()); assertEquals(1, adam.getFriends().size()); daniela = session.load(User.class, daniela.getId()); assertEquals(2, daniela.getFriends().size()); List<String> friendNames = new ArrayList<>(); for (User friend : daniela.getFriends()) { friendNames.add(friend.getName()); } assertTrue(friendNames.contains("Adam")); assertTrue(friendNames.contains("Michal")); session.clear(); michal = session.load(User.class, michal.getId()); assertEquals(2, michal.getFriends().size()); session.clear(); vince = session.load(User.class, vince.getId()); assertEquals(1, vince.getFriends().size()); } }