From ecd557365445772f6df547a9b7257dd21c798f1d Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Mon, 6 May 2019 11:47:08 +0200 Subject: [PATCH] ReplaceCustomChangeUnitTest --- .../liquibase/ReplaceCustomChange.java | 34 ++-- .../ReplaceCustomChangeUnitTest.java | 148 ++++++++++++++++++ 2 files changed, 164 insertions(+), 18 deletions(-) create mode 100644 src/test/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChangeUnitTest.java diff --git a/src/main/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChange.java b/src/main/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChange.java index 5cb2998e..33b31610 100644 --- a/src/main/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChange.java +++ b/src/main/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChange.java @@ -23,9 +23,6 @@ public class ReplaceCustomChange implements CustomTaskChange { private String searchFor; private String replaceWith; - @SuppressWarnings("unused") - private ResourceAccessor resourceAccessor; - @Override public void execute(final Database database) throws CustomChangeException { final JdbcConnection conn = (JdbcConnection) database.getConnection(); @@ -34,8 +31,9 @@ public class ReplaceCustomChange implements CustomTaskChange { conn.setAutoCommit(false); final Statement statement = conn.createStatement(); for (String columnName : columnNames.split(",")) { - final String sql = "UPDATE " + tableName + " SET " + columnName + "= replace(" + columnName + ", '|', " + - (isH2 ? "STRINGDECODE('\n') " : "E'\\n'") + ")"; + final String sql = "UPDATE " + tableName + " SET " + columnName + "= replace(" + columnName + ", '" + searchFor + + "', " + + (isH2 ? "STRINGDECODE('" + replaceWith + "')" : "E'" + replaceWith + "'") + ")"; statement.executeUpdate(sql); } conn.commit(); @@ -46,7 +44,7 @@ public class ReplaceCustomChange implements CustomTaskChange { @Override public String getConfirmationMessage() { - return "table " + tableName + " / columns " + columnNames + ": replaced all '" + searchFor + "' to '" + replaceWith + return "in table " + tableName + " / columns " + columnNames + ": replaced all '" + searchFor + "' to '" + replaceWith + "'"; } @@ -65,33 +63,33 @@ public class ReplaceCustomChange implements CustomTaskChange { return null; } - public String getTableName() { - return tableName; - } + // public String getTableName() { + // return tableName; + // } public void setTableName(final String tableName) { this.tableName = tableName; } - public String getColumnNames() { - return columnNames; - } + // public String getColumnNames() { + // return columnNames; + // } public void setColumnNames(final String columns) { this.columnNames = columns; } - public String getSearchFor() { - return searchFor; - } + // public String getSearchFor() { + // return searchFor; + // } public void setSearchFor(final String searchFor) { this.searchFor = searchFor; } - public String getReplaceWith() { - return replaceWith; - } + // public String getReplaceWith() { + // return replaceWith; + // } public void setReplaceWith(final String replaceWith) { this.replaceWith = replaceWith; diff --git a/src/test/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChangeUnitTest.java b/src/test/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChangeUnitTest.java new file mode 100644 index 00000000..df9f5b1f --- /dev/null +++ b/src/test/java/org/hostsharing/hsadminng/liquibase/ReplaceCustomChangeUnitTest.java @@ -0,0 +1,148 @@ +// Licensed under Apache-2.0 +package org.hostsharing.hsadminng.liquibase; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.ThrowableAssert.catchThrowable; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import liquibase.database.Database; +import liquibase.database.jvm.JdbcConnection; +import liquibase.exception.CustomChangeException; +import liquibase.exception.DatabaseException; +import liquibase.exception.SetupException; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import java.sql.SQLException; +import java.sql.Statement; + +public class ReplaceCustomChangeUnitTest { + + private static final String POSTGRES_DATABASE_PRODUCT_NAME = "PostgreSQL"; + private static final String H2_DATABASE_PRODUCT_NAME = "H2"; + + @Rule + public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Mock + private Database database; + + @Mock + private JdbcConnection connection; + + @Mock + private Statement statement; + + @Before + public void initMocks() throws DatabaseException { + given(database.getConnection()).willReturn(connection); + given(connection.createStatement()).willReturn(statement); + } + + @Test + public void updatesForPostgres() throws Exception { + // given + given(database.getDatabaseProductName()).willReturn(POSTGRES_DATABASE_PRODUCT_NAME); + final ReplaceCustomChange replaceCustomChange = givenReplaceCustomChange("some_table", "address,remark", "|", "\\n"); + + // when + replaceCustomChange.execute(database); + + // then + verify(statement).executeUpdate("UPDATE some_table SET address= replace(address, '|', E'\\n')"); + verify(statement).executeUpdate("UPDATE some_table SET remark= replace(remark, '|', E'\\n')"); + } + + @Test + public void updatesForH2() throws Exception { + // given + given(database.getDatabaseProductName()).willReturn(H2_DATABASE_PRODUCT_NAME); + final ReplaceCustomChange replaceCustomChange = givenReplaceCustomChange("some_table", "address,remark", "|", "\\n"); + + // when + replaceCustomChange.execute(database); + + // then + verify(statement).executeUpdate("UPDATE some_table SET address= replace(address, '|', STRINGDECODE('\\n'))"); + verify(statement).executeUpdate("UPDATE some_table SET remark= replace(remark, '|', STRINGDECODE('\\n'))"); + } + + @Test + public void getConfirmationMessage() throws Exception { + // given + final ReplaceCustomChange replaceCustomChange = givenReplaceCustomChange("some_table", "address,remark", "|", "\\n"); + + // when + final String actual = replaceCustomChange.getConfirmationMessage(); + + // then + assertThat(actual).isEqualTo("in table some_table / columns address,remark: replaced all '|' to '\\n'"); + } + + @Test + public void onDatabaseExceptionThrowsCustomChangeException() throws Exception { + // given + given(database.getDatabaseProductName()).willReturn(POSTGRES_DATABASE_PRODUCT_NAME); + final ReplaceCustomChange replaceCustomChange = givenReplaceCustomChange("some_table", "address,remark", "|", "\\n"); + final Exception givenCausingException = new DatabaseException("dummy"); + given(connection.createStatement()).willThrow(givenCausingException); + + // when + final Throwable actual = catchThrowable(() -> replaceCustomChange.execute(database)); + + // then + assertThat(actual).isInstanceOfSatisfying( + CustomChangeException.class, + (cce) -> assertThat(cce.getCause()).isSameAs(givenCausingException)); + } + + @Test + public void onSQLExceptionThrowsCustomChangeException() throws Exception { + // given + given(database.getDatabaseProductName()).willReturn(POSTGRES_DATABASE_PRODUCT_NAME); + final ReplaceCustomChange replaceCustomChange = givenReplaceCustomChange("some_table", "address,remark", "|", "\\n"); + final Exception givenCausingException = new SQLException("dummy"); + given(statement.executeUpdate(anyString())).willThrow(givenCausingException); + + // when + final Throwable actual = catchThrowable(() -> replaceCustomChange.execute(database)); + + // then + assertThat(actual).isInstanceOfSatisfying( + CustomChangeException.class, + (cce) -> assertThat(cce.getCause()).isSameAs(givenCausingException)); + } + + @Test + public void setFileOpenerDoesNothing() { + new ReplaceCustomChange().setFileOpener(null); + } + + @Test + public void validateDoesNothing() { + new ReplaceCustomChange().validate(null); + } + + // --- only test fixture below --- + + private ReplaceCustomChange givenReplaceCustomChange( + final String some_table, + final String columns, + final String searchFor, + final String replaceWith) throws SetupException { + final ReplaceCustomChange replaceCustomChange = new ReplaceCustomChange(); + replaceCustomChange.setUp(); + replaceCustomChange.setTableName(some_table); + replaceCustomChange.setColumnNames(columns); + replaceCustomChange.setSearchFor(searchFor); + replaceCustomChange.setReplaceWith(replaceWith); + return replaceCustomChange; + } +}