blob: 82e56e8b2a9e41c5997086adcbb9438d285f22d9 [file] [log] [blame]
/*
* Copyright (c) 2011, Rickard Öberg. All Rights Reserved.
* Copyright (c) 2012, Paul Merlin. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.qi4j.library.sql.liquibase;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.qi4j.api.activation.ActivationEvent;
import org.qi4j.api.activation.ActivationEventListener;
import org.qi4j.api.activation.ActivationException;
import org.qi4j.api.common.Visibility;
import org.qi4j.api.property.Property;
import org.qi4j.api.structure.Application;
import org.qi4j.api.structure.Module;
import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.bootstrap.AssemblyException;
import org.qi4j.bootstrap.ModuleAssembly;
import org.qi4j.bootstrap.SingletonAssembler;
import org.qi4j.functional.Function;
import org.qi4j.io.Inputs;
import org.qi4j.io.Outputs;
import org.qi4j.library.sql.assembly.DataSourceAssembler;
import org.qi4j.library.sql.common.Databases;
import org.qi4j.library.sql.dbcp.DBCPDataSourceServiceAssembler;
import org.qi4j.test.EntityTestAssembler;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.qi4j.io.Outputs.collection;
import static org.qi4j.io.Transforms.map;
/**
* Test DataSource and Liquibase services
*/
public class LiquibaseServiceTest
{
@Test
public void testLiquibase()
throws SQLException, IOException, ActivationException, AssemblyException
{
final SingletonAssembler assembler = new SingletonAssembler()
{
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
ModuleAssembly configModule = module;
// Create in-memory store for configurations
new EntityTestAssembler().assemble( configModule );
new DBCPDataSourceServiceAssembler().
identifiedBy( "datasource-service" ).
withConfig( configModule, Visibility.layer ).
assemble( module );
new DataSourceAssembler().
withDataSourceServiceIdentity( "datasource-service" ).
identifiedBy( "testds-liquibase" ).
withCircuitBreaker().
assemble( module );
module.values( SomeValue.class );
// Set up Liquibase service that will create the tables
// START SNIPPET: assembly
new LiquibaseAssembler().
withConfig( configModule, Visibility.layer ).
assemble( module );
// END SNIPPET: assembly
module.forMixin( LiquibaseConfiguration.class ).declareDefaults().enabled().set( true );
module.forMixin( LiquibaseConfiguration.class ).declareDefaults().changeLog().set( "changelog.xml" );
}
@Override
public void beforeActivation( Application application )
{
application.registerActivationEventListener( new ActivationEventListener()
{
@Override
public void onEvent( ActivationEvent event )
{
System.out.println( event );
}
} );
}
};
Module module = assembler.module();
// START SNIPPET: io
// Look up the DataSource
DataSource ds = module.findService( DataSource.class ).get();
// Instanciate Databases helper
Databases database = new Databases( ds );
// Assert that insertion works
assertTrue( database.update( "insert into test values ('someid', 'bar')" ) == 1 );
// END SNIPPET: io
database.query( "select * from test", new Databases.ResultSetVisitor()
{
@Override
public boolean visit( ResultSet visited )
throws SQLException
{
assertThat( visited.getString( "id" ), equalTo( "someid" ) );
assertThat( visited.getString( "foo" ), equalTo( "bar" ) );
return true;
}
} );
Function<ResultSet, SomeValue> toValue = new Function<ResultSet, SomeValue>()
{
@Override
public SomeValue map( ResultSet resultSet )
{
ValueBuilder<SomeValue> builder = assembler.module().newValueBuilder( SomeValue.class );
try
{
builder.prototype().id().set( resultSet.getString( "id" ) );
builder.prototype().foo().set( resultSet.getString( "foo" ) );
}
catch( SQLException e )
{
throw new IllegalArgumentException( "Could not convert to SomeValue", e );
}
return builder.newInstance();
}
};
// START SNIPPET: io
// Select rows and load them in a List
List<SomeValue> rows = new ArrayList<SomeValue>();
database.query( "select * from test" ).transferTo( map( toValue, collection( rows ) ) );
// Transfer all rows to System.out
Inputs.iterable( rows ).transferTo( Outputs.systemOut() );
// END SNIPPET: io
}
interface SomeValue
extends ValueComposite
{
Property<String> id();
Property<String> foo();
}
}