diff --git a/schemacrawler-api/src/test/java/schemacrawler/test/ForeignKeyNamesTest.java b/schemacrawler-api/src/test/java/schemacrawler/test/ForeignKeyNamesTest.java index 16f0511a29..53998b6f4f 100644 --- a/schemacrawler-api/src/test/java/schemacrawler/test/ForeignKeyNamesTest.java +++ b/schemacrawler-api/src/test/java/schemacrawler/test/ForeignKeyNamesTest.java @@ -45,7 +45,7 @@ import schemacrawler.test.utility.WithTestDatabase; @ResolveTestContext -@WithTestDatabase(script = "fk_dupe_name.sql") +@WithTestDatabase(script = "/fk_dupe_name.sql") public class ForeignKeyNamesTest { private Catalog catalog; diff --git a/schemacrawler-api/src/test/java/schemacrawler/test/utility/TestDatabaseConnectionParameterResolver.java b/schemacrawler-api/src/test/java/schemacrawler/test/utility/TestDatabaseConnectionParameterResolver.java index 082fe95434..bb060a5762 100644 --- a/schemacrawler-api/src/test/java/schemacrawler/test/utility/TestDatabaseConnectionParameterResolver.java +++ b/schemacrawler-api/src/test/java/schemacrawler/test/utility/TestDatabaseConnectionParameterResolver.java @@ -28,16 +28,20 @@ package schemacrawler.test.utility; +import static org.junit.jupiter.api.Assertions.fail; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; -import static us.fatehi.utility.Utility.isBlank; - +import java.io.IOException; import java.lang.reflect.Parameter; +import java.nio.charset.StandardCharsets; import java.sql.Connection; +import java.sql.SQLException; import java.util.Optional; - import javax.sql.DataSource; - import org.apache.commons.dbcp2.BasicDataSource; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.RandomStringUtils; +import org.hsqldb.jdbc.JDBCDataSource; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; @@ -45,9 +49,7 @@ import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; import org.junit.jupiter.api.extension.ParameterResolver; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; - +import static us.fatehi.utility.Utility.isBlank; import schemacrawler.testdb.TestDatabase; import us.fatehi.utility.LoggingConfig; import us.fatehi.utility.datasource.DatabaseConnectionSource; @@ -130,35 +132,35 @@ public Object resolveParameter( final String script = locateAnnotation(extensionContext).getScript(); final Parameter parameter = parameterContext.getParameter(); - if (isBlank(script)) { - final DataSource ds = newDataSource(); - this.dataSource = DatabaseConnectionSources.fromDataSource(ds); - - if (isParameterConnection(parameter)) { - return dataSource.get(); - } else if (isParameterDatabaseConnectionInfo(parameter)) { - return new DatabaseConnectionInfo( - testDatabase.getHost(), - testDatabase.getPort(), - testDatabase.getDatabase(), - testDatabase.getConnectionUrl()); - } else if (isParameterDatabaseConnectionSource(parameter)) { - return dataSource; - } else { - throw new ParameterResolutionException("Could not resolve " + parameter); - } - } else { + if (!isBlank(script)) { final DataSource ds = newEmbeddedDatabase(script); - this.dataSource = DatabaseConnectionSources.fromDataSource(ds); + dataSource = DatabaseConnectionSources.fromDataSource(ds); if (isParameterConnection(parameter)) { return dataSource.get(); - } else if (isParameterDatabaseConnectionSource(parameter)) { + } + if (isParameterDatabaseConnectionSource(parameter)) { return dataSource; - } else { - throw new ParameterResolutionException("Could not resolve " + parameter); } + throw new ParameterResolutionException("Could not resolve " + parameter); + } + final DataSource ds = newDataSource(); + dataSource = DatabaseConnectionSources.fromDataSource(ds); + + if (isParameterConnection(parameter)) { + return dataSource.get(); } + if (isParameterDatabaseConnectionInfo(parameter)) { + return new DatabaseConnectionInfo( + testDatabase.getHost(), + testDatabase.getPort(), + testDatabase.getDatabase(), + testDatabase.getConnectionUrl()); + } + if (isParameterDatabaseConnectionSource(parameter)) { + return dataSource; + } + throw new ParameterResolutionException("Could not resolve " + parameter); } @Override @@ -209,14 +211,27 @@ private BasicDataSource newDataSource() { return ds; } - private EmbeddedDatabase newEmbeddedDatabase(final String script) { - final EmbeddedDatabase db = - new EmbeddedDatabaseBuilder() - .generateUniqueName(true) - .setScriptEncoding("UTF-8") - .ignoreFailedDrops(true) - .addScript(script) - .build(); - return db; + private DataSource newEmbeddedDatabase(final String script) { + try { + // Create data source + final String randomDatabaseName = RandomStringUtils.randomAlphabetic(7); + final JDBCDataSource hsqlDataSource = new JDBCDataSource(); + hsqlDataSource.setDatabase("jdbc:hsqldb:mem:" + randomDatabaseName); + // Read script + final String sql = IOUtils.resourceToString(script, StandardCharsets.UTF_8); + String[] statements = sql.split(";"); + // Create a QueryRunner to execute the SQL statements + final QueryRunner runner = new QueryRunner(hsqlDataSource); + for (String statement : statements) { + statement = statement.trim(); + System.out.println(statement); + if (!statement.isEmpty()) { + runner.update(statement); + } + } + return hsqlDataSource; + } catch (IOException | SQLException e) { + return fail("Could not create a data source", e); + } } } diff --git a/schemacrawler-api/src/test/resources/fk_dupe_name.sql b/schemacrawler-api/src/test/resources/fk_dupe_name.sql index 60cdd71532..ff88a3118b 100644 --- a/schemacrawler-api/src/test/resources/fk_dupe_name.sql +++ b/schemacrawler-api/src/test/resources/fk_dupe_name.sql @@ -1,7 +1,6 @@ CREATE SCHEMA "SCHEMA1" AUTHORIZATION DBA; -SET SCHEMA "SCHEMA1"; -CREATE TABLE TableA +CREATE TABLE SCHEMA1.TableA ( Id INTEGER NOT NULL, A VARCHAR(20) NOT NULL, @@ -9,7 +8,7 @@ CREATE TABLE TableA ) ; -CREATE TABLE TableB +CREATE TABLE SCHEMA1.TableB ( Id INTEGER NOT NULL, B VARCHAR(20) NOT NULL, @@ -18,9 +17,8 @@ CREATE TABLE TableB ; CREATE SCHEMA "SCHEMA2" AUTHORIZATION DBA; -SET SCHEMA "SCHEMA2"; -CREATE TABLE TableA +CREATE TABLE SCHEMA2.TableA ( Id INTEGER NOT NULL, A VARCHAR(20) NOT NULL, @@ -28,7 +26,7 @@ CREATE TABLE TableA ) ; -CREATE TABLE TableB +CREATE TABLE SCHEMA2.TableB ( Id INTEGER NOT NULL, B VARCHAR(20) NOT NULL, diff --git a/schemacrawler-diagram/src/test/java/schemacrawler/integration/test/DiagramRendererOptionsAdditionalSchemasTest.java b/schemacrawler-diagram/src/test/java/schemacrawler/integration/test/DiagramRendererOptionsAdditionalSchemasTest.java index dda0a4a277..7ec73bbd37 100644 --- a/schemacrawler-diagram/src/test/java/schemacrawler/integration/test/DiagramRendererOptionsAdditionalSchemasTest.java +++ b/schemacrawler-diagram/src/test/java/schemacrawler/integration/test/DiagramRendererOptionsAdditionalSchemasTest.java @@ -38,13 +38,10 @@ import static schemacrawler.test.utility.ExecutableTestUtility.hasSameContentAndTypeAs; import static schemacrawler.test.utility.FileHasContent.classpathResource; import static schemacrawler.test.utility.FileHasContent.outputOf; - import java.nio.file.Path; - import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; - import schemacrawler.inclusionrule.RegularExpressionExclusionRule; import schemacrawler.schemacrawler.FilterOptions; import schemacrawler.schemacrawler.FilterOptionsBuilder; @@ -68,7 +65,7 @@ import us.fatehi.utility.datasource.DatabaseConnectionSource; @ResolveTestContext -@WithTestDatabase(script = "table-chain.sql") +@WithTestDatabase(script = "/table-chain.sql") public class DiagramRendererOptionsAdditionalSchemasTest { private static final String ADDITIONAL_DIAGRAM_OPTIONS_OUTPUT = diff --git a/schemacrawler-parent/pom.xml b/schemacrawler-parent/pom.xml index 525188818f..4acbb044b3 100644 --- a/schemacrawler-parent/pom.xml +++ b/schemacrawler-parent/pom.xml @@ -198,6 +198,11 @@ 2.12.0 test + + commons-dbutils + commons-dbutils + 1.8.1 + org.testcontainers junit-jupiter