All Downloads are FREE. Search and download functionalities are using the official Maven repository.

h4sm.testutil.DbFixtureSuite.scala Maven / Gradle / Ivy

package h4sm.testutil

import cats.effect.IO
import doobie.util.transactor.Transactor
import h4sm.db.config.DatabaseConfig
import org.scalatest._
import transactor._
import io.circe.config.parser

trait RandomDbCreation {
  implicit lazy val cs = IO.contextShift(scala.concurrent.ExecutionContext.Implicits.global)
  def randomSuffixLength: Int = 6
  def getRandomSuffix: String =
    scala.util.Random.alphanumeric.take(randomSuffixLength).mkString.toLowerCase()
  def classNameLength: Int = 6
  // Make sure the db name is only generated one time.
  def dbName: String =
    s"cttdb_${getClass.getSimpleName.toLowerCase.take(classNameLength)}_$getRandomSuffix"
  def config: DatabaseConfig = parser.decodePathF[IO, DatabaseConfig]("db").unsafeRunSync()
  def testConfig: DatabaseConfig = config.copy(databaseName = dbName)
}

trait DbFixtureBeforeAfter extends RandomDbCreation with BeforeAndAfterAll { self: Suite =>
  lazy val cfg = testConfig
  def schemaNames: Seq[String]

  private def beforeIO: IO[Unit] =
    for {
      _ <- createDb[IO](cfg)
      _ <- DatabaseConfig.initialize[IO](cfg)(schemaNames: _*)
    } yield ()

  override def beforeAll(): Unit = beforeIO.unsafeRunSync()

  override def afterAll(): Unit = dropDb[IO](cfg).unsafeRunSync()
}

trait DbFixtureSuite extends RandomDbCreation with funsuite.FixtureAnyFunSuiteLike {
  def schemaNames: Seq[String]
  case class FixtureParam(transactor: Transactor[IO])
  lazy val cfg = testConfig

  override def withFixture(test: OneArgTest) = {
    val transactor: IO[Transactor[IO]] = for {
      _ <- createDb[IO](cfg)
      tr <- getInitializedTransactor(cfg, schemaNames: _*)
    } yield tr

    try withFixture(test.toNoArgTest(FixtureParam(transactor.unsafeRunSync())))
    catch {
      case e: Throwable =>
        println(e)
        e.printStackTrace()
        fail("Failed to create test database")
    } finally dropDb[IO](cfg).unsafeRunSync()
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy