/* * 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.session.events; import static org.junit.Assert.*; import org.junit.Test; import org.neo4j.ogm.domain.filesystem.Document; import org.neo4j.ogm.domain.filesystem.Folder; import org.neo4j.ogm.session.event.Event; /** * @author vince */ public class AssociatedObjectsTest extends EventTestBaseClass { @Test public void shouldNotFireEventsOnAssociatedFolderThatHasNotChanged() { // even though the document is updated, // its associated folder has not changed, // so no folder save events should fire a.setName("newA"); session.save(a); assertTrue(eventListener.captured(a, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_SAVE)); assertEquals(2, eventListener.count()); } @Test public void shouldFireEventsForAllDirtyObjectsThatAreReachableFromTheRoot() { // the documents b and c are connected to a via a shared folder, // so events should fire for each of a,b and c a.setName("newA"); b.setName("newB"); c.setName("newC"); session.save(a); assertTrue(eventListener.captured(a, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(b, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(b, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(c, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(c, Event.TYPE.POST_SAVE)); assertEquals(6, eventListener.count()); } @Test public void shouldFireEventsForAssociatedObjectsWhenDeletingParentObjectWithInconsistentDomainModel() { session.delete(a); // a has a folder object reference // note that we're not actually changing the folder object. It still // has a reference to the deleted document a. This means the domain model // will be internally inconsistent. Nevertheless, because the relationship between // the folder and the document has been deleted in the graph, we must // fire events for the folder. assertTrue(eventListener.captured(a, Event.TYPE.PRE_DELETE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_DELETE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsForAssociatedObjectsWhenDeletingParentObjectWithConsistentDomainModel() { folder.getDocuments().remove(a); session.delete(a); // a has a folder object reference assertTrue(eventListener.captured(a, Event.TYPE.PRE_DELETE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_DELETE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenAddNewObjectInCollectionAndSaveCollection() { // add a new document to an existing folder and save the document Document z = new Document(); z.setFolder(folder); folder.getDocuments().add(z); session.save(folder); assertTrue(eventListener.captured(z, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(z, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenAddNewObjectToCollectionAndSaveNewObject() { // add a new document to an existing folder and save the document Document z = new Document(); z.setFolder(folder); folder.getDocuments().add(z); session.save(z); assertTrue(eventListener.captured(z, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(z, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenAddExistingObjectToCollectionAndSaveExistingObject() { d.setFolder(folder); folder.getDocuments().add(d); session.save(d); assertTrue(eventListener.captured(d, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(d, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenSetAssociatedObjectToNewAnonymousObject() { a.setFolder(new Folder()); folder.getDocuments().remove(a); session.save(a); // events for creation of new object assertTrue(eventListener.captured(new Folder(), Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(new Folder(), Event.TYPE.POST_SAVE)); // events for update of a's folder relationship assertTrue(eventListener.captured(a, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_SAVE)); // events for updates of folder's relationship to a assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(6, eventListener.count()); } @Test public void shouldFireEventsWhenAddExistingObjectToCollectionAndSaveCollection() { assertNull(d.getFolder()); d.setFolder(folder); folder.getDocuments().add(d); session.save(folder); assertTrue(eventListener.captured(d, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(d, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenItemDisassociatedFromContainerAndSaveContainer() { folder.getDocuments().remove(a); a.setFolder(null); session.save(folder); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } @Test public void shouldFireEventsWhenItemDisassociatedFromContainerAndSaveItem() { folder.getDocuments().remove(a); a.setFolder(null); session.save(a); assertTrue(eventListener.captured(folder, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(folder, Event.TYPE.POST_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.PRE_SAVE)); assertTrue(eventListener.captured(a, Event.TYPE.POST_SAVE)); assertEquals(4, eventListener.count()); } }