aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Smith <zach@driver.xyz>2017-08-22 09:57:07 -0700
committerZach Smith <zach@driver.xyz>2017-08-22 09:57:07 -0700
commit90e756eb35a311c933876006a7b65e16e3fa2b65 (patch)
tree98174956a5d5a1a0e1902dace8f98089725399c6
parent311209b81f6224d55c3de28c5ed043168f9a31b8 (diff)
downloaddriver-core-90e756eb35a311c933876006a7b65e16e3fa2b65.tar.gz
driver-core-90e756eb35a311c933876006a7b65e16e3fa2b65.tar.bz2
driver-core-90e756eb35a311c933876006a7b65e16e3fa2b65.zip
Add new traits for postgres docker databases and inserting test data
-rw-r--r--build.sbt3
-rw-r--r--src/main/scala/xyz/driver/core/database/database.scala67
2 files changed, 69 insertions, 1 deletions
diff --git a/build.sbt b/build.sbt
index f0a0a73..dcb313a 100644
--- a/build.sbt
+++ b/build.sbt
@@ -21,5 +21,6 @@ lazy val core = (project in file("."))
"com.typesafe.slick" %% "slick" % "3.1.1",
"com.typesafe" % "config" % "1.2.1",
"com.typesafe.scala-logging" %% "scala-logging" % "3.5.0",
- "ch.qos.logback" % "logback-classic" % "1.1.3"
+ "ch.qos.logback" % "logback-classic" % "1.1.3",
+ "com.spotify" % "docker-client" % "8.9.0" classifier "shaded"
))
diff --git a/src/main/scala/xyz/driver/core/database/database.scala b/src/main/scala/xyz/driver/core/database/database.scala
index dd2ed88..ac695da 100644
--- a/src/main/scala/xyz/driver/core/database/database.scala
+++ b/src/main/scala/xyz/driver/core/database/database.scala
@@ -122,6 +122,53 @@ package database {
def naturalKeyMapper[T] = MappedColumnType.base[Id[T], String](_.value, Id[T](_))
}
+ trait PostgresDockerContainerDatabase {
+ import com.spotify.docker.client._
+ import com.spotify.docker.client.messages._
+
+ lazy val dockerClient: DockerClient = DefaultDockerClient.fromEnv().build()
+
+ @SuppressWarnings(Array("org.wartremover.warts.Var"))
+ var dockerId: Option[String] = None
+
+ def setupDockerDatabase(username: String = "postgres",
+ password: String = "postgres",
+ database: String = "postgres",
+ hostPort: Int = 15432): Unit = {
+ import collection.JavaConverters._
+ import sys.process._
+
+ // https://github.com/spotify/docker-client/issues/857
+ // dockerClient.pull("postgres")
+
+ "docker pull postgres" !
+
+ val portBindings: Map[String, List[PortBinding]] = Map("5432" -> List(PortBinding.of("0.0.0.0", hostPort)))
+ val portBindingsJava = portBindings.mapValues(_.asJava).asJava
+ val hostConfig = HostConfig.builder().portBindings(portBindingsJava).build()
+ val containerConfig =
+ ContainerConfig
+ .builder()
+ .hostConfig(hostConfig)
+ .image("postgres")
+ .exposedPorts("5432")
+ .env(
+ s"POSTGRES_USER=$username",
+ s"POSTGRES_DB=$database",
+ s"POSTGRES_PASSWORD=$password"
+ )
+ .build()
+
+ val creation = dockerClient.createContainer(containerConfig)
+ dockerClient.startContainer(creation.id())
+ dockerId = Some(creation.id())
+ }
+
+ def killDockerDatabase(): Unit = {
+ dockerId.foreach(dockerClient.killContainer)
+ }
+ }
+
trait CreateAndDropSchema {
val slickDal: xyz.driver.core.database.SlickDal
val tables: GeneratedTables
@@ -137,6 +184,26 @@ package database {
def dropSchema(): Unit = {
Await.result(slickDal.execute(tables.schema.drop >> tables.dropNamespaceSchema), Duration.Inf)
}
+ }
+
+ trait PostgresTestData {
+ val slickDal: xyz.driver.core.database.SlickDal
+ val tables: GeneratedTables
+
+ def insertTestData(database: xyz.driver.core.database.Database, filePath: String)(
+ implicit executionContext: ExecutionContext): Future[Int] = {
+ import database.profile.api.{DBIO => _, _}
+
+ val file = Paths.get(filePath)
+ val inserts = new String(Files.readAllBytes(file), "UTF-8")
+
+ slickDal.execute(sql"#$inserts".asUpdate)
+ }
+ }
+
+ trait HsqlTestData {
+ val slickDal: xyz.driver.core.database.SlickDal
+ val tables: GeneratedTables
def insertTestData(database: xyz.driver.core.database.Database, filePath: String)(
implicit executionContext: ExecutionContext): Future[Int] = {