diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index e19593aa..3cbd362f 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -6,7 +6,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [8, 11, 13, 14] + java: [8, 11, 13, 14, 15] steps: - name: Checkout project uses: actions/checkout@v1 diff --git a/pom.xml b/pom.xml index f1b54be6..4ec34632 100644 --- a/pom.xml +++ b/pom.xml @@ -158,10 +158,22 @@ org.junit.jupiter junit-jupiter-api - 5.6.2 + 5.7.0 provided true + + org.junit.vintage + junit-vintage-engine + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + test + org.slf4j @@ -179,6 +191,10 @@ + + maven-surefire-plugin + 2.22.2 + maven-pmd-plugin 3.13.0 @@ -239,7 +255,7 @@ - -Xdoclint:none + none diff --git a/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java b/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java index 5f525ff8..2cb49ce0 100644 --- a/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java +++ b/src/main/java/io/zonky/test/db/postgres/junit5/EmbeddedPostgresExtension.java @@ -14,7 +14,7 @@ package io.zonky.test.db.postgres.junit5; import io.zonky.test.db.postgres.embedded.DatabasePreparer; -import org.junit.rules.TestRule; +import org.junit.jupiter.api.extension.Extension; public final class EmbeddedPostgresExtension { @@ -28,7 +28,7 @@ public static SingleInstancePostgresExtension singleInstance() { } /** - * Returns a {@link TestRule} to create a Postgres cluster, shared amongst all test cases in this JVM. + * Returns a {@link Extension} to create a Postgres cluster, shared amongst all test cases in this JVM. * The rule contributes Config switches to configure each test case to get its own database. */ public static PreparedDbExtension preparedDatabase(DatabasePreparer preparer) diff --git a/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java b/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java index 70c108e1..81cf457f 100644 --- a/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java +++ b/src/main/java/io/zonky/test/db/postgres/junit5/PreparedDbExtension.java @@ -17,18 +17,17 @@ import io.zonky.test.db.postgres.embedded.DatabasePreparer; import io.zonky.test.db.postgres.embedded.EmbeddedPostgres; import io.zonky.test.db.postgres.embedded.PreparedDbProvider; -import org.junit.jupiter.api.extension.AfterAllCallback; -import org.junit.jupiter.api.extension.BeforeAllCallback; -import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.*; import javax.sql.DataSource; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; -public class PreparedDbExtension implements BeforeAllCallback, AfterAllCallback { +public class PreparedDbExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { private final DatabasePreparer preparer; + private boolean perClass = false; private volatile DataSource dataSource; private volatile PreparedDbProvider provider; private volatile ConnectionInfo connectionInfo; @@ -55,6 +54,7 @@ public void beforeAll(ExtensionContext extensionContext) throws Exception { provider = PreparedDbProvider.forPreparer(preparer, builderCustomizers); connectionInfo = provider.createNewDatabase(); dataSource = provider.createDataSourceFromConnectionInfo(connectionInfo); + perClass = true; } @Override @@ -62,6 +62,25 @@ public void afterAll(ExtensionContext extensionContext) { dataSource = null; connectionInfo = null; provider = null; + perClass = false; + } + + @Override + public void beforeEach(ExtensionContext extensionContext) throws Exception { + if (!perClass) { + provider = PreparedDbProvider.forPreparer(preparer, builderCustomizers); + connectionInfo = provider.createNewDatabase(); + dataSource = provider.createDataSourceFromConnectionInfo(connectionInfo); + } + } + + @Override + public void afterEach(ExtensionContext extensionContext) { + if (!perClass) { + dataSource = null; + connectionInfo = null; + provider = null; + } } public DataSource getTestDatabase() { diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java index 3ec8f921..b752dc5b 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java +++ b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java @@ -13,22 +13,23 @@ */ package io.zonky.test.db.postgres.embedded; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import java.nio.file.Files; +import java.nio.file.Path; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; public class EmbeddedPostgresTest { - @Rule - public TemporaryFolder tf = new TemporaryFolder(); + @TempDir + public Path tf; @Test public void testEmbeddedPg() throws Exception @@ -47,7 +48,7 @@ public void testEmbeddedPg() throws Exception public void testEmbeddedPgCreationWithNestedDataDirectory() throws Exception { try (EmbeddedPostgres pg = EmbeddedPostgres.builder() - .setDataDirectory(tf.newFolder("data-dir-parent") + "/data-dir") + .setDataDirectory(Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir"))) .start()) { // nothing to do } diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java b/src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java similarity index 90% rename from src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java index a159b8df..22aa3b3e 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/ConnectConfigTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/ConnectConfigTest.java @@ -1,7 +1,7 @@ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; +import io.zonky.test.db.postgres.embedded.ConnectionInfo; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; import org.junit.Rule; import org.junit.Test; import org.postgresql.ds.common.BaseDataSource; diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java similarity index 88% rename from src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java index 69c54e29..ff765eef 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/FlywayPreparerTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/FlywayPreparerTest.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; import static org.junit.Assert.assertEquals; @@ -19,12 +19,10 @@ import java.sql.ResultSet; import java.sql.Statement; +import io.zonky.test.db.postgres.embedded.FlywayPreparer; import org.junit.Rule; import org.junit.Test; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; - public class FlywayPreparerTest { @Rule public PreparedDbRule db = EmbeddedPostgresRules.preparedDatabase(FlywayPreparer.forClasspathLocation("db/testing")); diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java b/src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java similarity index 89% rename from src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java index b665684e..7184d23a 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/IsolationTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/IsolationTest.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; import java.sql.Connection; import java.sql.SQLException; @@ -20,9 +20,6 @@ import org.junit.Rule; import org.junit.Test; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.SingleInstancePostgresRule; - public class IsolationTest { @Rule diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java similarity index 89% rename from src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java index a633b774..d9b9908f 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerContextTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerContextTest.java @@ -11,10 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; +import io.zonky.test.db.postgres.embedded.LiquibasePreparer; import liquibase.Contexts; import org.junit.Rule; import org.junit.Test; diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java similarity index 88% rename from src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java index 395025dc..4c646ca5 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/LiquibasePreparerTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/LiquibasePreparerTest.java @@ -11,10 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; +import io.zonky.test.db.postgres.embedded.LiquibasePreparer; import org.junit.Rule; import org.junit.Test; diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java similarity index 92% rename from src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java index dbd1a484..41c0542c 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbCustomizerTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbCustomizerTest.java @@ -11,10 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; import org.junit.Rule; import org.junit.Test; diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java similarity index 93% rename from src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java index 486b2871..7b01c181 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/PreparedDbTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/PreparedDbTest.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; import static org.junit.Assert.assertEquals; @@ -24,12 +24,12 @@ import javax.sql.DataSource; +import io.zonky.test.db.postgres.embedded.ConnectionInfo; +import io.zonky.test.db.postgres.embedded.DatabaseConnectionPreparer; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; import org.junit.Rule; import org.junit.Test; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.PreparedDbRule; - public class PreparedDbTest { private final DatabasePreparer prepA = new SimplePreparer("a"); diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java b/src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java similarity index 88% rename from src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java rename to src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java index a11e5da4..d8ec7f21 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/SingleInstanceRuleTest.java +++ b/src/test/java/io/zonky/test/db/postgres/junit/SingleInstanceRuleTest.java @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.zonky.test.db.postgres.embedded; +package io.zonky.test.db.postgres.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -24,9 +24,6 @@ import org.junit.Rule; import org.junit.Test; -import io.zonky.test.db.postgres.junit.EmbeddedPostgresRules; -import io.zonky.test.db.postgres.junit.SingleInstancePostgresRule; - public class SingleInstanceRuleTest { @Rule diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java new file mode 100644 index 00000000..62e7865d --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/ConnectConfigTest.java @@ -0,0 +1,53 @@ +package io.zonky.test.db.postgres.junit5; + +import io.zonky.test.db.postgres.embedded.ConnectionInfo; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.postgresql.ds.common.BaseDataSource; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ConnectConfigTest { + + private final CapturingDatabasePreparer preparer = new CapturingDatabasePreparer(); + + @RegisterExtension + public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(preparer) + .customize(builder -> builder.setConnectConfig("connectTimeout", "20")); + + @Test + public void test() throws SQLException { + ConnectionInfo connectionInfo = db.getConnectionInfo(); + + Map properties = connectionInfo.getProperties(); + assertEquals(1, properties.size()); + assertEquals("20", properties.get("connectTimeout")); + + BaseDataSource testDatabase = (BaseDataSource) db.getTestDatabase(); + assertEquals("20", testDatabase.getProperty("connectTimeout")); + + BaseDataSource preparerDataSource = (BaseDataSource) preparer.getDataSource(); + assertEquals("20", preparerDataSource.getProperty("connectTimeout")); + } + + private class CapturingDatabasePreparer implements DatabasePreparer { + + private DataSource dataSource; + + @Override + public void prepare(DataSource ds) { + if (dataSource != null) + throw new IllegalStateException("database preparer has been called multiple times"); + dataSource = ds; + } + + public DataSource getDataSource() { + return dataSource; + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java new file mode 100644 index 00000000..a37eff69 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/DatabaseLifecycleTest.java @@ -0,0 +1,68 @@ +package io.zonky.test.db.postgres.junit5; + +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@TestMethodOrder(OrderAnnotation.class) +public class DatabaseLifecycleTest { + + @RegisterExtension + public static PreparedDbExtension staticExtension = EmbeddedPostgresExtension.preparedDatabase(ds -> {}); + + @RegisterExtension + public PreparedDbExtension instanceExtension = EmbeddedPostgresExtension.preparedDatabase(ds -> {}); + + @Test + @Order(1) + public void testCreate1() throws Exception + { + createTable(staticExtension, "table1"); + createTable(instanceExtension, "table2"); + } + + @Test + @Order(2) + public void testCreate2() throws Exception + { + assertTrue(existsTable(staticExtension, "table1")); + assertFalse(existsTable(instanceExtension, "table2")); + } + + @Test + @Order(3) + public void testCreate3() throws Exception + { + assertTrue(existsTable(staticExtension, "table1")); + assertFalse(existsTable(instanceExtension, "table2")); + } + + private void createTable(PreparedDbExtension extension, String table) throws SQLException + { + try (Connection connection = extension.getTestDatabase().getConnection(); + Statement statement = connection.createStatement()) { + statement.execute(String.format("CREATE TABLE public.%s (a INTEGER)", table)); + } + } + + private boolean existsTable(PreparedDbExtension extension, String table) throws SQLException + { + try (Connection connection = extension.getTestDatabase().getConnection(); + Statement statement = connection.createStatement()) { + String query = String.format("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = '%s')", table); + ResultSet resultSet = statement.executeQuery(query); + resultSet.next(); + return resultSet.getBoolean(1); + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java new file mode 100644 index 00000000..c5aa84b1 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/FlywayPreparerTest.java @@ -0,0 +1,39 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +import io.zonky.test.db.postgres.embedded.FlywayPreparer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class FlywayPreparerTest { + @RegisterExtension + public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(FlywayPreparer.forClasspathLocation("db/testing")); + + @Test + public void testTablesMade() throws Exception { + try (Connection c = db.getTestDatabase().getConnection(); + Statement s = c.createStatement()) { + ResultSet rs = s.executeQuery("SELECT * FROM foo"); + rs.next(); + assertEquals("bar", rs.getString(1)); + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java new file mode 100644 index 00000000..afe4d606 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/IsolationTest.java @@ -0,0 +1,52 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class IsolationTest +{ + @RegisterExtension + public SingleInstancePostgresExtension pg1 = EmbeddedPostgresExtension.singleInstance(); + + @RegisterExtension + public SingleInstancePostgresExtension pg2 = EmbeddedPostgresExtension.singleInstance(); + + @Test + public void testIsolation() throws Exception + { + try (Connection c = getConnection(pg1)) { + makeTable(c); + try (Connection c2 = getConnection(pg2)) { + makeTable(c2); + } + } + } + + private void makeTable(Connection c) throws SQLException + { + Statement s = c.createStatement(); + s.execute("CREATE TABLE public.foo (a INTEGER)"); + } + + private Connection getConnection(SingleInstancePostgresExtension epg) throws SQLException + { + return epg.getEmbeddedPostgres().getPostgresDatabase().getConnection(); + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java new file mode 100644 index 00000000..bd229daa --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerContextTest.java @@ -0,0 +1,41 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import io.zonky.test.db.postgres.embedded.LiquibasePreparer; +import liquibase.Contexts; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class LiquibasePreparerContextTest { + + @RegisterExtension + public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(LiquibasePreparer.forClasspathLocation("liqui/master-test.xml", new Contexts("test"))); + + @Test + public void testEmptyTables() throws Exception { + try (Connection c = db.getTestDatabase().getConnection(); + Statement s = c.createStatement()) { + ResultSet rs = s.executeQuery("SELECT COUNT(*) FROM foo"); + rs.next(); + assertEquals(0, rs.getInt(1)); + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java new file mode 100644 index 00000000..8653d488 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/LiquibasePreparerTest.java @@ -0,0 +1,40 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import io.zonky.test.db.postgres.embedded.LiquibasePreparer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class LiquibasePreparerTest { + + @RegisterExtension + public PreparedDbExtension db = EmbeddedPostgresExtension.preparedDatabase(LiquibasePreparer.forClasspathLocation("liqui/master.xml")); + + @Test + public void testTablesMade() throws Exception { + try (Connection c = db.getTestDatabase().getConnection(); + Statement s = c.createStatement()) { + ResultSet rs = s.executeQuery("SELECT * FROM foo"); + rs.next(); + assertEquals("bar", rs.getString(1)); + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java new file mode 100644 index 00000000..a5b9bdfa --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbCustomizerTest.java @@ -0,0 +1,56 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import io.zonky.test.db.postgres.embedded.DatabasePreparer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.time.Duration; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +public class PreparedDbCustomizerTest { + + private static final DatabasePreparer EMPTY_PREPARER = ds -> {}; + + @RegisterExtension + public PreparedDbExtension dbA1 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER); + @RegisterExtension + public PreparedDbExtension dbA2 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> {}); + @RegisterExtension + public PreparedDbExtension dbA3 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(10))); + @RegisterExtension + public PreparedDbExtension dbB1 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(11))); + @RegisterExtension + public PreparedDbExtension dbB2 = EmbeddedPostgresExtension.preparedDatabase(EMPTY_PREPARER).customize(builder -> builder.setPGStartupWait(Duration.ofSeconds(11))); + + @Test + public void testCustomizers() { + int dbA1Port = dbA1.getConnectionInfo().getPort(); + int dbA2Port = dbA2.getConnectionInfo().getPort(); + int dbA3Port = dbA3.getConnectionInfo().getPort(); + + assertEquals(dbA1Port, dbA2Port); + assertEquals(dbA1Port, dbA3Port); + + int dbB1Port = dbB1.getConnectionInfo().getPort(); + int dbB2Port = dbB2.getConnectionInfo().getPort(); + + assertEquals(dbB1Port, dbB2Port); + + assertNotEquals(dbA1Port, dbB2Port); + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java new file mode 100644 index 00000000..c4a75409 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/PreparedDbTest.java @@ -0,0 +1,103 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import javax.sql.DataSource; + +import io.zonky.test.db.postgres.embedded.ConnectionInfo; +import io.zonky.test.db.postgres.embedded.DatabaseConnectionPreparer; +import io.zonky.test.db.postgres.embedded.DatabasePreparer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class PreparedDbTest { + + private final DatabasePreparer prepA = new SimplePreparer("a"); + private final DatabasePreparer prepB = new SimplePreparer("b"); + + @RegisterExtension + public PreparedDbExtension dbA1 = EmbeddedPostgresExtension.preparedDatabase(prepA); + @RegisterExtension + public PreparedDbExtension dbA2 = EmbeddedPostgresExtension.preparedDatabase(prepA); + @RegisterExtension + public PreparedDbExtension dbB1 = EmbeddedPostgresExtension.preparedDatabase(prepB); + + @Test + public void testDbs() throws Exception { + try (Connection c = dbA1.getTestDatabase().getConnection(); + Statement stmt = c.createStatement()) { + commonAssertion(stmt); + } + try (Connection c = dbA2.getTestDatabase().getConnection(); + PreparedStatement stmt = c.prepareStatement("SELECT count(1) FROM a")) { + ResultSet rs = stmt.executeQuery(); + rs.next(); + assertEquals(0, rs.getInt(1)); + } + try (Connection c = dbB1.getTestDatabase().getConnection(); + PreparedStatement stmt = c.prepareStatement("SELECT * FROM b")) { + stmt.execute(); + } + } + + private void commonAssertion(final Statement stmt) throws SQLException { + stmt.execute("INSERT INTO a VALUES(1)"); + ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM a"); + rs.next(); + assertEquals(1, rs.getInt(1)); + } + + @Test + public void testEquivalentAccess() throws SQLException { + ConnectionInfo dbInfo = dbA1.getConnectionInfo(); + DataSource dataSource = dbA1.getTestDatabase(); + try (Connection c = dataSource.getConnection(); Statement stmt = c.createStatement()) { + commonAssertion(stmt); + assertEquals(dbInfo.getUser(), c.getMetaData().getUserName()); + } + } + + @Test + public void testDbUri() throws Exception { + try (Connection c = DriverManager.getConnection(dbA1.getDbProvider().createDatabase()); + Statement stmt = c.createStatement()) { + commonAssertion(stmt); + } + } + + static class SimplePreparer implements DatabaseConnectionPreparer { + private final String name; + + public SimplePreparer(String name) { + this.name = name; + } + + @Override + public void prepare(Connection conn) throws SQLException { + try (PreparedStatement stmt = conn.prepareStatement(String.format( + "CREATE TABLE %s (foo int)", name))) { + stmt.execute(); + } + } + } +} diff --git a/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java b/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java new file mode 100644 index 00000000..1df4c0f7 --- /dev/null +++ b/src/test/java/io/zonky/test/db/postgres/junit5/SingleInstanceRuleTest.java @@ -0,0 +1,42 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.zonky.test.db.postgres.junit5; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public class SingleInstanceRuleTest +{ + @RegisterExtension + public SingleInstancePostgresExtension epg = EmbeddedPostgresExtension.singleInstance(); + + @Test + public void testRule() throws Exception { + try (Connection c = epg.getEmbeddedPostgres().getPostgresDatabase().getConnection()) { + Statement s = c.createStatement(); + ResultSet rs = s.executeQuery("SELECT 1"); + assertTrue(rs.next()); + assertEquals(1, rs.getInt(1)); + assertFalse(rs.next()); + } + } +}