package liquibase.ext.spatial.sqlgenerator; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import static org.testng.Assert.*; import liquibase.database.Database; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * <code>WktConversionUtilsTest</code> tests {@link WktConversionUtils}. */ public class WktConversionUtilsTest { /** * Tests successful invocataions of * {@link WktConversionUtils#convertToFunction(String, String, Database, WktInsertOrUpdateGenerator)} * . * * @param wkt * the Well-Known Text * @param srid * the SRID * @param geomFromTextFunction * the geometry function name. * @param isSridRequired * <code>true</code> if the SRID is required. * @param expected * the expected result. */ @Test(dataProvider = "convertToFunctionTestData") public void testConvertToFunction(final String wkt, final String srid, final String geomFromTextFunction, final boolean isSridRequired, final String expected) { final Database database = mock(Database.class); final WktInsertOrUpdateGenerator generator = mock(WktInsertOrUpdateGenerator.class); when(generator.getGeomFromWktFunction()).thenReturn(geomFromTextFunction); when(generator.isSridRequiredInFunction(database)).thenReturn(isSridRequired); final String actual = WktConversionUtils.convertToFunction(wkt, srid, database, generator); assertEquals(actual, expected); } /** * Generates the test data for * {@link #testConvertToFunction(String, String, String, boolean, String)}. * * @return the test data. */ @DataProvider public Object[][] convertToFunctionTestData() { final String wkt1 = "POINT(0 0)"; final String wkt2 = "POINT (0 0)"; final String wkt3 = " POINT (0 0)"; final String wkt4 = " POINT ( 0 0 ) "; final String function = "ST_GeomFromText"; return new Object[][] { new Object[] { wkt1, null, function, false, function + "('" + wkt1 + "')" }, new Object[] { wkt2, null, function, false, function + "('" + wkt2 + "')" }, new Object[] { wkt3, null, function, false, function + "('" + wkt3 + "')" }, new Object[] { wkt4, null, function, false, function + "('" + wkt4 + "')" }, new Object[] { wkt1, "", function, false, function + "('" + wkt1 + "')" }, new Object[] { wkt1, "4326", function, false, function + "('" + wkt1 + "', 4326)" }, new Object[] { wkt1, "4326", function, true, function + "('" + wkt1 + "', 4326)" }, new Object[] { wkt2, "4326", function, true, function + "('" + wkt2 + "', 4326)" }, new Object[] { wkt3, "4326", function, true, function + "('" + wkt3 + "', 4326)" }, new Object[] { wkt4, "4326", function, true, function + "('" + wkt4 + "', 4326)" }, }; } /** * Tests exception paths through * {@link WktConversionUtils#convertToFunction(String, String, Database, WktInsertOrUpdateGenerator)} * . * * @param wkt * the Well-Known Text * @param srid * the SRID * @param database * the database instance. * @param generator * the generator instance. */ @Test(dataProvider = "convertToFunctionExceptionTestData", expectedExceptions = IllegalArgumentException.class) public void testConvertToFunctionException(final String wkt, final String srid, final Database database, final WktInsertOrUpdateGenerator generator) { final String actual = WktConversionUtils.convertToFunction(wkt, srid, database, generator); fail("convertToFunction returned " + actual); } /** * Generates the test data for * {@link #testConvertToFunctionException(String, String, Database, WktInsertOrUpdateGenerator)}. * * @return the test data. */ @DataProvider public Object[][] convertToFunctionExceptionTestData() { final Database database = mock(Database.class); final WktInsertOrUpdateGenerator generator = mock(WktInsertOrUpdateGenerator.class); when(generator.getGeomFromWktFunction()).thenReturn("ST_GeomFromText"); when(generator.isSridRequiredInFunction(database)).thenReturn(true); final String wkt = "POINT(0 0)"; final String srid = "4326"; return new Object[][] { new Object[] { null, srid, database, generator }, new Object[] { "", srid, database, generator }, new Object[] { wkt, null, database, generator }, new Object[] { wkt, "", database, generator }, new Object[] { wkt, srid, database, null }, }; } @Test(dataProvider = "handleColumnValueTestData") public void testHandleColumnValue(final Object oldValue, final Database database, final WktInsertOrUpdateGenerator generator, final Object expected) { final Object actual = WktConversionUtils.handleColumnValue(oldValue, database, generator); assertEquals(actual, expected); } @DataProvider public Object[][] handleColumnValueTestData() { final Database database = mock(Database.class); final WktInsertOrUpdateGenerator generator = mock(WktInsertOrUpdateGenerator.class); when(generator.convertToFunction(anyString(), anyString(), eq(database))).thenAnswer( new Answer<String>() { @Override public String answer(final InvocationOnMock invocation) throws Throwable { return invocation.getArguments()[0] + "," + invocation.getArguments()[1]; } }); final String wkt = "POINT(0 0)"; final String srid = "SRID=4326"; return new Object[][] { new Object[] { null, database, generator, null }, new Object[] { 12345, database, generator, 12345 }, new Object[] { "test", database, generator, "test" }, new Object[] { wkt, database, generator, wkt + ",null" }, new Object[] { srid + ";" + wkt, database, generator, wkt + ",4326" }, }; } }