package liquibase.change; import liquibase.database.core.H2Database; import liquibase.database.core.MySQLDatabase; import liquibase.database.core.OracleDatabase; import liquibase.structure.core.Column; import liquibase.structure.core.Table; import liquibase.structure.core.View; import org.junit.Test; import java.util.HashMap; import java.util.HashSet; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertSame; import static liquibase.test.Assert.assertSetsEqual; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class ChangeMetaDataTest { @Test public void constructor() { HashSet<ChangeParameterMetaData> params = new HashSet<ChangeParameterMetaData>(); params.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "a", "a", null, null, null, Integer.class, null, null, null, null)); HashMap<String, String> notes = new HashMap<String, String>(); notes.put("db1", "note1"); notes.put("db2", "note2"); String[] appliesTo = new String[] {"table", "column"}; ChangeMetaData metaData = new ChangeMetaData("x", "y", 10, appliesTo, notes, params); assertEquals("x", metaData.getName()); assertEquals("y", metaData.getDescription()); assertEquals(10, metaData.getPriority()); assertEquals(2, metaData.getAppliesTo().size()); assertEquals(1, metaData.getParameters().size()); assertEquals("a", metaData.getParameters().keySet().iterator().next()); assertEquals("note1", metaData.getNotes("db1")); assertEquals("note2", metaData.getNotes("db2")); assertNull(metaData.getNotes("db3")); } @Test public void constructor_nullParams() { ChangeMetaData metaData = new ChangeMetaData("x", "y", 5, null, null, null); assertEquals(0, metaData.getParameters().size()); } @Test public void constructor_nullAppliesTo() { ChangeMetaData metaData = new ChangeMetaData("x", "y", 5, null, null, null); assertNull(metaData.getAppliesTo()); } @Test public void constructor_emptyAppliesTo() { ChangeMetaData metaData = new ChangeMetaData("x", "y", 5, new String[0], null, null); assertNull("Empty appliesTo should convert to a null appliesTo", metaData.getAppliesTo()); } @Test(expected = UnsupportedOperationException.class) public void getParameters_unmodifyable() { new ChangeMetaData("x", "y", 1, null, null, new HashSet()).getParameters().put("new", mock(ChangeParameterMetaData.class)); } @Test public void getRequiredParameters_empty() { ChangeMetaData changeMetaData = new ChangeMetaData("x", "y", 1, null, null, null); assertEquals(0, changeMetaData.getRequiredParameters(new H2Database()).size()); } @Test public void getRequiredParameters() { HashSet<ChangeParameterMetaData> parameters = new HashSet<ChangeParameterMetaData>(); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "noneRequired", "x", null, null, null, Integer.class, new String[]{"none"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "allRequired", "x", null, null, null, Integer.class, new String[]{"all"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "h2Required", "x", null, null, null, Integer.class, new String[] {"h2"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "oracleRequired", "x", null, null, null, Integer.class, new String[] {"oracle"}, null, null, null)); ChangeMetaData changeMetaData = new ChangeMetaData("x", "y", 1, null, null, parameters); assertSetsEqual(new String[]{"allRequired", "h2Required"}, changeMetaData.getRequiredParameters(new H2Database()).keySet()); assertSetsEqual(new String[]{"allRequired", "oracleRequired"}, changeMetaData.getRequiredParameters(new OracleDatabase()).keySet()); assertSetsEqual(new String[]{"allRequired"}, changeMetaData.getRequiredParameters(new MySQLDatabase()).keySet()); } @Test public void getOptionalParameters() { HashSet<ChangeParameterMetaData> parameters = new HashSet<ChangeParameterMetaData>(); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "noneRequired", "x", null, null, null, Integer.class, new String[]{"none"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "allRequired", "x", null, null, null, Integer.class, new String[]{"all"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "h2Required", "x", null, null, null, Integer.class, new String[] {"h2"}, null, null, null)); parameters.add(new ChangeParameterMetaData(new ExampleAbstractChange(), "oracleRequired", "x", null, null, null, Integer.class, new String[] {"oracle"}, null, null, null)); ChangeMetaData changeMetaData = new ChangeMetaData("x", "y", 1, null, null, parameters); assertSetsEqual(new String[]{"noneRequired", "oracleRequired"}, changeMetaData.getOptionalParameters(new H2Database()).keySet()); assertSetsEqual(new String[]{"noneRequired", "h2Required"}, changeMetaData.getOptionalParameters(new OracleDatabase()).keySet()); assertSetsEqual(new String[]{"noneRequired", "h2Required", "oracleRequired"}, changeMetaData.getOptionalParameters(new MySQLDatabase()).keySet()); } @Test public void appliesTo() { ChangeMetaData metaData = new ChangeMetaData("x", "y", 5, new String[] {"table", "column"}, null, null); assertTrue(metaData.appliesTo(new Table())); assertTrue(metaData.appliesTo(new Column())); assertFalse(metaData.appliesTo(new View())); } @Test public void appliesTo_nullAppliesTo() { ChangeMetaData metaData = new ChangeMetaData("x", "y", 5, new String[0], null, null); assertFalse(metaData.appliesTo(new Table())); assertFalse(metaData.appliesTo(new Column())); } }