HHH-10937 - Add test for issue

This commit is contained in:
Andrea Boriero 2016-07-30 14:19:38 +02:00
parent 5eacf421fb
commit a190d2f3eb
2 changed files with 209 additions and 1 deletions

View File

@ -13,7 +13,9 @@ class RecordingTarget implements GenerationTarget {
SCHEMA_CREATE( Pattern.compile( "create schema (.*)" ) ),
SCHEMA_DROP( Pattern.compile( "drop schema (.*)" ) ),
TABLE_CREATE( Pattern.compile( "create table (\\S+) .*" ) ),
TABLE_DROP( Pattern.compile( "drop table (.*)" ) );
TABLE_DROP( Pattern.compile( "drop table (.*)" ) ),
SEQUENCE_CREATE(Pattern.compile( "create sequence (.*) start (.*)" )),
SEQUENCE_DROP(Pattern.compile( "drop sequence if exists (.*)" ));
private final Pattern pattern;

View File

@ -0,0 +1,206 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* 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.test.schemafilter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Environment;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.mapping.Table;
import org.hibernate.tool.schema.internal.DefaultSchemaFilter;
import org.hibernate.tool.schema.internal.SchemaCreatorImpl;
import org.hibernate.tool.schema.internal.SchemaDropperImpl;
import org.hibernate.tool.schema.spi.SchemaFilter;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.hibernate.testing.DialectChecks;
import org.hibernate.testing.RequiresDialectFeature;
import org.hibernate.testing.ServiceRegistryBuilder;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import static org.hibernate.test.schemafilter.RecordingTarget.Category.SEQUENCE_CREATE;
import static org.hibernate.test.schemafilter.RecordingTarget.Category.SEQUENCE_DROP;
/**
* @author Andrea Boriero
*/
@TestForIssue(jiraKey = "HHH-10937")
@RequiresDialectFeature(value = {DialectChecks.SupportSchemaCreation.class})
public class SequenceFilterTest extends BaseUnitTestCase {
private StandardServiceRegistryImpl serviceRegistry;
private Metadata metadata;
@Before
public void setUp() {
Map settings = new HashMap();
settings.putAll( Environment.getProperties() );
settings.put( AvailableSettings.DIALECT, H2Dialect.class.getName() );
settings.put( AvailableSettings.FORMAT_SQL, false );
this.serviceRegistry = ServiceRegistryBuilder.buildServiceRegistry( settings );
MetadataSources ms = new MetadataSources( serviceRegistry );
ms.addAnnotatedClass( Schema1Entity1.class );
ms.addAnnotatedClass( Schema2Entity2.class );
this.metadata = ms.buildMetadata();
}
@After
public void tearDown() {
serviceRegistry.destroy();
}
@Test
public void createSchema_unfiltered() {
RecordingTarget target = doCreation( new DefaultSchemaFilter() );
Assert.assertThat( target.getActions( SEQUENCE_CREATE ), containsExactly(
"entity_1_seq_gen",
"entity_2_seq_gen"
) );
}
@Test
public void createSchema_filtered() {
RecordingTarget target = doCreation( new TestSchemaFilter() );
Assert.assertThat( target.getActions( SEQUENCE_CREATE ), containsExactly(
"entity_1_seq_gen"
) );
}
@Test
public void dropSchema_unfiltered() {
RecordingTarget target = doDrop( new DefaultSchemaFilter() );
Assert.assertThat( target.getActions( SEQUENCE_DROP ), containsExactly(
"entity_1_seq_gen",
"entity_2_seq_gen"
) );
}
@Test
public void dropSchema_filtered() {
RecordingTarget target = doDrop( new TestSchemaFilter() );
Assert.assertThat(
target.getActions( SEQUENCE_DROP ),
containsExactly( "entity_1_seq_gen" )
);
}
@Entity
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entity_1_seq_gen")
@javax.persistence.Table(name = "the_entity_1", schema = "the_schema_1")
public static class Schema1Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen")
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
@Entity
@SequenceGenerator(initialValue = 1, name = "idgen2", sequenceName = "entity_2_seq_gen")
@javax.persistence.Table(name = "the_entity_2", schema = "the_schema_2")
public static class Schema2Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen2")
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
private static class TestSchemaFilter implements SchemaFilter {
@Override
public boolean includeNamespace(Namespace namespace) {
return true;
}
@Override
public boolean includeTable(Table table) {
return true;
}
@Override
public boolean includeSequence(Sequence sequence) {
final String render = sequence.getName().render();
return !"entity_2_seq_gen".endsWith( sequence.getName().render() );
}
}
private RecordingTarget doCreation(SchemaFilter filter) {
RecordingTarget target = new RecordingTarget();
new SchemaCreatorImpl( serviceRegistry, filter ).doCreation( metadata, true, target );
return target;
}
private RecordingTarget doDrop(SchemaFilter filter) {
RecordingTarget target = new RecordingTarget();
new SchemaDropperImpl( serviceRegistry, filter ).doDrop( metadata, true, target );
return target;
}
private BaseMatcher<Set<String>> containsExactly(Object... expected) {
return containsExactly( new HashSet( Arrays.asList( expected ) ) );
}
private BaseMatcher<Set<String>> containsExactly(final Set expected) {
return new BaseMatcher<Set<String>>() {
@Override
public boolean matches(Object item) {
Set set = (Set) item;
return set.size() == expected.size()
&& set.containsAll( expected );
}
@Override
public void describeTo(Description description) {
description.appendText( "Is set containing exactly " + expected );
}
};
}
}