Skip to content

Commit

Permalink
refactor: remove duplicated code of db-specific TestContainers and Ru…
Browse files Browse the repository at this point in the history
…nnableSpecs (zio#706)
  • Loading branch information
jczuchnowski committed Jun 17, 2022
1 parent 55494d5 commit 8cc7f98
Show file tree
Hide file tree
Showing 15 changed files with 160 additions and 211 deletions.
15 changes: 10 additions & 5 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ addCommandAlias("check", "all scalafmtSbtCheck scalafmtCheck test:scalafmtCheck"
val zioVersion = "2.0.0-RC6"
val zioSchemaVersion = "0.1.9"
val testcontainersVersion = "1.17.2"
val testcontainersScalaVersion = "0.40.7"
val testcontainersScalaVersion = "0.40.8"
val logbackVersion = "1.2.11"

lazy val root = project
.in(file("."))
Expand Down Expand Up @@ -143,7 +144,8 @@ lazy val mysql = project
"org.testcontainers" % "jdbc" % testcontainersVersion % Test,
"org.testcontainers" % "mysql" % testcontainersVersion % Test,
"mysql" % "mysql-connector-java" % "8.0.29" % Test,
"com.dimafeng" %% "testcontainers-scala-mysql" % testcontainersScalaVersion % Test
"com.dimafeng" %% "testcontainers-scala-mysql" % testcontainersScalaVersion % Test,
"ch.qos.logback" % "logback-classic" % logbackVersion % Test
)
)
.settings(testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"))
Expand All @@ -161,7 +163,8 @@ lazy val oracle = project
"org.testcontainers" % "oracle-xe" % testcontainersVersion % Test,
"org.testcontainers" % "jdbc" % testcontainersVersion % Test,
"com.oracle.database.jdbc" % "ojdbc8" % "21.5.0.0" % Test,
"com.dimafeng" %% "testcontainers-scala-oracle-xe" % testcontainersScalaVersion % Test
"com.dimafeng" %% "testcontainers-scala-oracle-xe" % testcontainersScalaVersion % Test,
"ch.qos.logback" % "logback-classic" % logbackVersion % Test
)
)
.settings(testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"))
Expand All @@ -179,7 +182,8 @@ lazy val postgres = project
"org.testcontainers" % "postgresql" % testcontainersVersion % Test,
"org.testcontainers" % "jdbc" % testcontainersVersion % Test,
"org.postgresql" % "postgresql" % "42.3.6" % Compile,
"com.dimafeng" %% "testcontainers-scala-postgresql" % testcontainersScalaVersion % Test
"com.dimafeng" %% "testcontainers-scala-postgresql" % testcontainersScalaVersion % Test,
"ch.qos.logback" % "logback-classic" % logbackVersion % Test
)
)
.settings(testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"))
Expand All @@ -197,7 +201,8 @@ lazy val sqlserver = project
"org.testcontainers" % "mssqlserver" % testcontainersVersion % Test,
"org.testcontainers" % "jdbc" % testcontainersVersion % Test,
"com.microsoft.sqlserver" % "mssql-jdbc" % "9.4.0.jre8" % Test,
"com.dimafeng" %% "testcontainers-scala-mssqlserver" % testcontainersScalaVersion % Test
"com.dimafeng" %% "testcontainers-scala-mssqlserver" % testcontainersScalaVersion % Test,
"ch.qos.logback" % "logback-classic" % logbackVersion % Test
)
)
.settings(testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework"))
55 changes: 52 additions & 3 deletions jdbc/src/test/scala/zio/sql/JdbcRunnableSpec.scala
Original file line number Diff line number Diff line change
@@ -1,19 +1,68 @@
package zio.sql

import com.dimafeng.testcontainers.JdbcDatabaseContainer
import zio.test.TestEnvironment
import zio.ZLayer
import zio.{ Scope, ZIO, ZLayer }
import zio.test.ZIOSpecDefault
import com.dimafeng.testcontainers.SingleContainer
import java.util.Properties
import zio.test.Spec

/**
* Base trait for integration-style tests running on Testcontainers.
* Extending classes are expected to provide the container implementation
* this test suite will work on by implementing {@link getContainer}.
*
* Test suite should be implemented in {@link specLayered} and
* particular tests can depend on {@link SQLDriver} in the environment.
*/
trait JdbcRunnableSpec extends ZIOSpecDefault with Jdbc {

type JdbcEnvironment = TestEnvironment with SqlDriver

val poolConfigLayer: ZLayer[Any, Throwable, ConnectionPoolConfig]
def specLayered: Spec[JdbcEnvironment, Object]

final lazy val jdbcLayer: ZLayer[Any, Any, SqlDriver] =
protected def getContainer: SingleContainer[_] with JdbcDatabaseContainer

protected val autoCommit = false

override def spec: Spec[TestEnvironment, Any] =
specLayered.provideCustomShared(jdbcLayer)

private[this] def connProperties(user: String, password: String): Properties = {
val props = new Properties
props.setProperty("user", user)
props.setProperty("password", password)
props
}

private[this] val poolConfigLayer: ZLayer[Any, Throwable, ConnectionPoolConfig] =
ZLayer.scoped {
testContainer
.map(a =>
ConnectionPoolConfig(
url = a.jdbcUrl,
properties = connProperties(a.username, a.password),
autoCommit = autoCommit
)
)
}

private[this] final lazy val jdbcLayer: ZLayer[Any, Any, SqlDriver] =
ZLayer.make[SqlDriver](
poolConfigLayer.orDie,
ConnectionPool.live.orDie,
SqlDriver.live
)

private[this] def testContainer: ZIO[Scope, Throwable, SingleContainer[_] with JdbcDatabaseContainer] =
ZIO.acquireRelease {
ZIO.attemptBlocking {
val c = getContainer
c.start()
c
}
} { container =>
ZIO.attemptBlocking(container.stop()).orDie
}
}
14 changes: 14 additions & 0 deletions mysql/src/test/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT"/>
</root>

<logger name="org.testcontainers" level="INFO"/>
<logger name="com.github.dockerjava" level="WARN"/>
</configuration>
30 changes: 9 additions & 21 deletions mysql/src/test/scala/zio/sql/mysql/MysqlRunnableSpec.scala
Original file line number Diff line number Diff line change
@@ -1,29 +1,17 @@
package zio.sql.mysql

import java.util.Properties
import zio.sql.{ ConnectionPoolConfig, JdbcRunnableSpec }
import zio.test._
import zio.ZLayer
import com.dimafeng.testcontainers.{ JdbcDatabaseContainer, MySQLContainer, SingleContainer }
import org.testcontainers.utility.DockerImageName
import zio.sql.JdbcRunnableSpec

trait MysqlRunnableSpec extends JdbcRunnableSpec with MysqlJdbcModule {

private def connProperties(user: String, password: String): Properties = {
val props = new Properties
props.setProperty("user", user)
props.setProperty("password", password)
props
}

val poolConfigLayer: ZLayer[Any, Throwable, ConnectionPoolConfig] =
ZLayer.scoped {
TestContainer
.mysql()
.map(a => ConnectionPoolConfig(a.jdbcUrl, connProperties(a.username, a.password)))
override protected def getContainer: SingleContainer[_] with JdbcDatabaseContainer =
new MySQLContainer(
mysqlImageVersion = Option("mysql").map(DockerImageName.parse)
).configure { a =>
a.withInitScript("shop_schema.sql")
()
}

override def spec: Spec[TestEnvironment, Any] =
specLayered.provideCustomLayerShared(jdbcLayer)

def specLayered: Spec[JdbcEnvironment, Object]

}
22 changes: 0 additions & 22 deletions mysql/src/test/scala/zio/sql/mysql/TestContainer.scala

This file was deleted.

14 changes: 14 additions & 0 deletions oracle/src/test/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT"/>
</root>

<logger name="org.testcontainers" level="INFO"/>
<logger name="com.github.dockerjava" level="WARN"/>
</configuration>
37 changes: 10 additions & 27 deletions oracle/src/test/scala/zio/sql/oracle/OracleRunnableSpec.scala
Original file line number Diff line number Diff line change
@@ -1,34 +1,17 @@
package zio.sql.oracle

import zio.ZLayer
import zio.sql.{ ConnectionPoolConfig, JdbcRunnableSpec }
import zio.test.{ Spec, TestEnvironment }

import java.util.Properties
import com.dimafeng.testcontainers.{ JdbcDatabaseContainer, OracleContainer, SingleContainer }
import org.testcontainers.utility.DockerImageName
import zio.sql.JdbcRunnableSpec

trait OracleRunnableSpec extends JdbcRunnableSpec with OracleJdbcModule {

private def connProperties(user: String, password: String): Properties = {
val props = new Properties
props.setProperty("user", user)
props.setProperty("password", password)
props
}

val poolConfigLayer = ZLayer.scoped {
TestContainer
.oracle()
.map(container =>
ConnectionPoolConfig(
url = container.jdbcUrl,
properties = connProperties(container.username, container.password)
)
)
}

override def spec: Spec[TestEnvironment, Any] =
specLayered.provideCustomShared(jdbcLayer)

def specLayered: Spec[JdbcEnvironment, Object]
override protected def getContainer: SingleContainer[_] with JdbcDatabaseContainer =
new OracleContainer(
dockerImageName = DockerImageName.parse("gvenzl/oracle-xe")
).configure { container =>
container.withInitScript("shop_schema.sql")
()
}

}
22 changes: 0 additions & 22 deletions oracle/src/test/scala/zio/sql/oracle/TestContainer.scala

This file was deleted.

14 changes: 14 additions & 0 deletions postgres/src/test/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT"/>
</root>

<logger name="org.testcontainers" level="INFO"/>
<logger name="com.github.dockerjava" level="WARN"/>
</configuration>
Original file line number Diff line number Diff line change
@@ -1,36 +1,17 @@
package zio.sql.postgresql

import zio._
import zio.test._
import java.util.Properties
import zio.sql.{ ConnectionPoolConfig, JdbcRunnableSpec }
import com.dimafeng.testcontainers.{ JdbcDatabaseContainer, PostgreSQLContainer, SingleContainer }
import org.testcontainers.utility.DockerImageName
import zio.sql.JdbcRunnableSpec

trait PostgresRunnableSpec extends JdbcRunnableSpec with PostgresJdbcModule {

def autoCommit: Boolean = true

private def connProperties(user: String, password: String): Properties = {
val props = new Properties
props.setProperty("user", user)
props.setProperty("password", password)
props
}

val poolConfigLayer = ZLayer.scoped {
TestContainer
.postgres()
.map(a =>
ConnectionPoolConfig(
url = a.jdbcUrl,
properties = connProperties(a.username, a.password),
autoCommit = autoCommit
)
)
}

override def spec: Spec[TestEnvironment, Any] =
specLayered.provideCustomShared(jdbcLayer)

def specLayered: Spec[JdbcEnvironment, Object]
override protected def getContainer: SingleContainer[_] with JdbcDatabaseContainer =
new PostgreSQLContainer(
dockerImageNameOverride = Option("postgres:alpine").map(DockerImageName.parse)
).configure { a =>
a.withInitScript("db_schema.sql")
()
}

}
25 changes: 0 additions & 25 deletions postgres/src/test/scala/zio/sql/postgresql/TestContainer.scala

This file was deleted.

1 change: 1 addition & 0 deletions project/BuildHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ object BuildHelper {
compilerPlugin(("com.github.ghik" % "silencer-plugin" % SilencerVersion).cross(CrossVersion.full))
)
},
resolvers += Resolver.sonatypeRepo("snapshots"),
Test / parallelExecution := true,
incOptions ~= (_.withLogRecompileOnMacro(false)),
autoAPIMappings := true,
Expand Down
14 changes: 14 additions & 0 deletions sqlserver/src/test/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="STDOUT"/>
</root>

<logger name="org.testcontainers" level="INFO"/>
<logger name="com.github.dockerjava" level="WARN"/>
</configuration>
Loading

0 comments on commit 8cc7f98

Please sign in to comment.