/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.test.options.mapping; import static org.fest.assertions.Assertions.assertThat; import java.lang.annotation.ElementType; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.hibernate.ogm.OgmSessionFactory; import org.hibernate.ogm.cfg.OgmConfiguration; import org.hibernate.ogm.cfg.OgmProperties; import org.hibernate.ogm.engine.spi.OgmSessionFactoryImplementor; import org.hibernate.ogm.options.navigation.EntityContext; import org.hibernate.ogm.options.navigation.GlobalContext; import org.hibernate.ogm.options.navigation.PropertyContext; import org.hibernate.ogm.options.spi.OptionsContext; import org.hibernate.ogm.options.spi.OptionsService; import org.hibernate.ogm.options.spi.OptionsService.OptionsServiceContext; import org.hibernate.ogm.test.options.examples.EmbedExampleOption; import org.hibernate.ogm.test.options.examples.ForceExampleOption; import org.hibernate.ogm.test.options.examples.NameExampleOption; import org.hibernate.ogm.test.options.mapping.model.Microwave; import org.hibernate.ogm.test.options.mapping.model.Refrigerator; import org.hibernate.ogm.test.options.mapping.model.SampleNoSqlDatastore; import org.hibernate.ogm.test.options.mapping.model.SampleOptionConfigurator; import org.hibernate.ogm.utils.TestHelper; import org.junit.After; import org.junit.Test; /** * An integration test that writes options using the fluent API and then reads them via the {@link OptionsService}. * * @author Gunnar Morling */ public class OptionIntegrationTest { private OgmSessionFactory sessions; @After public void closeSessionFactory() { sessions.close(); } @Test public void testThatEntityOptionCanBeSetAndRetrieved() throws Exception { Map<String, Object> settings = new HashMap<String, Object>(); TestHelper.configureOptionsFor( settings, SampleNoSqlDatastore.class ) .entity( Refrigerator.class ) .force( true ); setupSessionFactory( settings ); OptionsContext refrigatorOptions = getOptionsContext().getEntityOptions( Refrigerator.class ); assertThat( refrigatorOptions.getUnique( ForceExampleOption.class ) ).isTrue(); } @Test public void testThatEntityOptionsCanBeSetAndRetrievedOnMultipleTypes() throws Exception { Map<String, Object> settings = new HashMap<String, Object>(); TestHelper.configureOptionsFor( settings, SampleNoSqlDatastore.class ) .entity( Refrigerator.class ) .force( true ) .entity( Microwave.class ) .name( "test" ); setupSessionFactory( settings ); OptionsContext refrigatorOptions = getOptionsContext().getEntityOptions( Refrigerator.class ); assertThat( refrigatorOptions.getUnique( ForceExampleOption.class ) ).isTrue(); OptionsContext microwaveOptions = getOptionsContext().getEntityOptions( Microwave.class ); assertThat( microwaveOptions.getUnique( NameExampleOption.class ) ).isEqualTo( "test" ); } @Test public void testThatPropertyOptionCanBeSetAndRetrieved() throws Exception { Map<String, Object> settings = new HashMap<String, Object>(); TestHelper.configureOptionsFor( settings, SampleNoSqlDatastore.class ) .entity( Refrigerator.class ) .property( "temperature", ElementType.FIELD ) .embed( "Embedded" ); setupSessionFactory( settings ); OptionsContext temperatureOptions = getOptionsContext().getPropertyOptions( Refrigerator.class, "temperature" ); assertThat( temperatureOptions.getUnique( EmbedExampleOption.class ) ).isEqualTo( "Embedded" ); } @Test public void testThatPropertyOptionCanBeSetViaOgmConfigurationAndRetrieved() throws Exception { OgmConfiguration cfg = new OgmConfiguration(); cfg.configureOptionsFor( SampleNoSqlDatastore.class ) .entity( Refrigerator.class ) .property( "temperature", ElementType.FIELD ) .embed( "Embedded" ); sessions = cfg.buildSessionFactory(); OptionsContext temperatureOptions = getOptionsContext().getPropertyOptions( Refrigerator.class, "temperature" ); assertThat( temperatureOptions.getUnique( EmbedExampleOption.class ) ).isEqualTo( "Embedded" ); } @Test public void testThatOptionsCanBeSetAndRetrievedUsingOptionConfiguratorInstance() throws Exception { Map<String, Object> settings = Collections.<String, Object>singletonMap( OgmProperties.OPTION_CONFIGURATOR, new SampleOptionConfigurator() ); setupSessionFactory( settings ); assertOptionsSetViaConfigurator(); } @Test public void testThatOptionsCanBeSetAndRetrievedUsingOptionConfiguratorType() throws Exception { Map<String, Object> settings = Collections.<String, Object>singletonMap( OgmProperties.OPTION_CONFIGURATOR, SampleOptionConfigurator.class ); setupSessionFactory( settings ); assertOptionsSetViaConfigurator(); } @Test public void testThatOptionsCanBeSetAndRetrievedUsingOptionConfiguratorTypeName() throws Exception { Map<String, Object> settings = Collections.<String, Object>singletonMap( OgmProperties.OPTION_CONFIGURATOR, SampleOptionConfigurator.class.getName() ); setupSessionFactory( settings ); assertOptionsSetViaConfigurator(); } private void assertOptionsSetViaConfigurator() { OptionsContext refrigatorOptions = getOptionsContext().getEntityOptions( Refrigerator.class ); assertThat( refrigatorOptions.getUnique( ForceExampleOption.class ) ).isTrue(); OptionsContext microwaveOptions = getOptionsContext().getEntityOptions( Microwave.class ); assertThat( microwaveOptions.getUnique( NameExampleOption.class ) ).isEqualTo( "test" ); OptionsContext temperatureOptions = getOptionsContext().getPropertyOptions( Refrigerator.class, "temperature" ); assertThat( temperatureOptions.getUnique( EmbedExampleOption.class ) ).isEqualTo( "Embedded" ); } private OptionsServiceContext getOptionsContext() { return ( (OgmSessionFactoryImplementor) sessions ).getServiceRegistry() .getService( OptionsService.class ) .context(); } private void setupSessionFactory(Map<String, Object> settings) { sessions = TestHelper.getDefaultTestSessionFactory( settings, Refrigerator.class ); } public interface AnotherGlobalContext extends GlobalContext<AnotherGlobalContext, AnotherEntityContext> { } public interface AnotherEntityContext extends EntityContext<AnotherEntityContext, AnotherPropertyContext> { } public interface AnotherPropertyContext extends PropertyContext<AnotherEntityContext, AnotherPropertyContext> { } }