/* * 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.template; import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.neo4j.ogm.session.Session; 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.Configuration; import org.springframework.data.neo4j.events.EventPublisher; import org.springframework.data.neo4j.events.Neo4jModificationEventListener; import org.springframework.data.neo4j.examples.movies.domain.Actor; import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories; import org.springframework.data.neo4j.transaction.Neo4jTransactionManager; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; /** * Test to assert the behaviour of {@link Session}'s interaction with Spring application events. * * @author Adam George * @author Mark Angrish */ @ContextConfiguration(classes = TemplateApplicationEventTests.DataManipulationEventConfiguration.class) @RunWith(SpringJUnit4ClassRunner.class) public class TemplateApplicationEventTests extends MultiDriverTestClass { @Autowired private Session session; @Autowired private Neo4jModificationEventListener eventListener; @Test @Transactional public void shouldCreateTemplateAndPublishAppropriateApplicationEventsOnSaveAndOnDelete() { assertNotNull("The Neo4jTemplate wasn't autowired into this test", this.session); Actor entity = new Actor(); entity.setName("John Abraham"); assertFalse(this.eventListener.receivedPreSaveEvent()); assertFalse(this.eventListener.receivedPostSaveEvent()); this.session.save(entity); assertTrue(this.eventListener.receivedPreSaveEvent()); assertSame(entity, this.eventListener.getPreSaveEvent().getSource().getObject()); assertTrue(this.eventListener.receivedPostSaveEvent()); assertSame(entity, this.eventListener.getPostSaveEvent().getSource().getObject()); assertFalse(this.eventListener.receivedPreDeleteEvent()); assertFalse(this.eventListener.receivedPostDeleteEvent()); this.session.delete(entity); assertTrue(this.eventListener.receivedPreDeleteEvent()); assertSame(entity, this.eventListener.getPreDeleteEvent().getSource().getObject()); assertTrue(this.eventListener.receivedPostDeleteEvent()); assertSame(entity, this.eventListener.getPostDeleteEvent().getSource().getObject()); } @Configuration @EnableNeo4jRepositories @EnableTransactionManagement static class DataManipulationEventConfiguration { @Bean public PlatformTransactionManager transactionManager() { return new Neo4jTransactionManager(sessionFactory()); } @Bean public SessionFactory sessionFactory() { return new SessionFactory(getBaseConfiguration().build(), "org.springframework.data.neo4j.examples.movies.domain") { @Override public Session openSession() { Session session = super.openSession(); session.register(eventPublisher()); return session; } }; } @Bean public EventPublisher eventPublisher() { return new EventPublisher(); } @Bean public Neo4jModificationEventListener eventListener() { return new Neo4jModificationEventListener(); } } }