From 6bb6cad39d108aa3d2638642619b76b4881fbf60 Mon Sep 17 00:00:00 2001 From: eikek Date: Mon, 23 Aug 2021 21:47:54 +0200 Subject: [PATCH] Test db migrations for all supported databases --- build.sbt | 4 ++- .../scala/docspell/store/migrate/Docker.scala | 19 +++++++++++ .../store/migrate/H2MigrateTest.scala | 24 ++++++++++++++ .../store/migrate/MariaDbMigrateTest.scala | 33 +++++++++++++++++++ .../store/migrate/PostgresqlMigrateTest.scala | 33 +++++++++++++++++++ project/Dependencies.scala | 7 ++++ 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 modules/store/src/test/scala/docspell/store/migrate/Docker.scala create mode 100644 modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala create mode 100644 modules/store/src/test/scala/docspell/store/migrate/MariaDbMigrateTest.scala create mode 100644 modules/store/src/test/scala/docspell/store/migrate/PostgresqlMigrateTest.scala diff --git a/build.sbt b/build.sbt index b4818d8e..8f477e79 100644 --- a/build.sbt +++ b/build.sbt @@ -353,7 +353,9 @@ val store = project Dependencies.emil ++ Dependencies.emilDoobie ++ Dependencies.calevCore ++ - Dependencies.calevFs2 + Dependencies.calevFs2, + libraryDependencies ++= + Dependencies.testContainer.map(_ % Test) ) .dependsOn(common, query.jvm) diff --git a/modules/store/src/test/scala/docspell/store/migrate/Docker.scala b/modules/store/src/test/scala/docspell/store/migrate/Docker.scala new file mode 100644 index 00000000..e1af16f6 --- /dev/null +++ b/modules/store/src/test/scala/docspell/store/migrate/Docker.scala @@ -0,0 +1,19 @@ +/* + * Copyright 2020 Docspell Contributors + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package docspell.store.migrate +import cats.effect._ +import cats.effect.unsafe.implicits._ + +object Docker { + + def exists: IO[Boolean] = + IO(Runtime.getRuntime.exec(Array("docker", "--version")).waitFor() == 0).attempt + .map(_.fold(_ => false, identity)) + + def existsUnsafe: Boolean = + exists.unsafeRunSync() +} diff --git a/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala b/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala new file mode 100644 index 00000000..47fcb13b --- /dev/null +++ b/modules/store/src/test/scala/docspell/store/migrate/H2MigrateTest.scala @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Docspell Contributors + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package docspell.store.migrate + +import cats.effect.IO +import cats.effect.unsafe.implicits._ + +import docspell.store.StoreFixture + +import munit.FunSuite + +class H2MigrateTest extends FunSuite { + + test("h2 empty schema migration") { + val jdbc = StoreFixture.memoryDB("h2test") + val result = FlywayMigrate.run[IO](jdbc).unsafeRunSync() + assert(result.migrationsExecuted > 0) + } + +} diff --git a/modules/store/src/test/scala/docspell/store/migrate/MariaDbMigrateTest.scala b/modules/store/src/test/scala/docspell/store/migrate/MariaDbMigrateTest.scala new file mode 100644 index 00000000..ef96e7cb --- /dev/null +++ b/modules/store/src/test/scala/docspell/store/migrate/MariaDbMigrateTest.scala @@ -0,0 +1,33 @@ +/* + * Copyright 2020 Docspell Contributors + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package docspell.store.migrate + +import cats.effect._ +import cats.effect.unsafe.implicits._ + +import docspell.common.LenientUri +import docspell.store.JdbcConfig + +import com.dimafeng.testcontainers.MariaDBContainer +import com.dimafeng.testcontainers.munit.TestContainerForAll +import munit._ +import org.testcontainers.utility.DockerImageName + +class MariaDbMigrateTest extends FunSuite with TestContainerForAll { + override val containerDef: MariaDBContainer.Def = + MariaDBContainer.Def(DockerImageName.parse("mariadb:10.5")) + + test("mariadb empty schema migration") { + assume(Docker.existsUnsafe, "docker doesn't exist!") + withContainers { cnt => + val jdbc = + JdbcConfig(LenientUri.unsafe(cnt.jdbcUrl), cnt.dbUsername, cnt.dbPassword) + val result = FlywayMigrate.run[IO](jdbc).unsafeRunSync() + assert(result.migrationsExecuted > 0) + } + } +} diff --git a/modules/store/src/test/scala/docspell/store/migrate/PostgresqlMigrateTest.scala b/modules/store/src/test/scala/docspell/store/migrate/PostgresqlMigrateTest.scala new file mode 100644 index 00000000..a03eb1f2 --- /dev/null +++ b/modules/store/src/test/scala/docspell/store/migrate/PostgresqlMigrateTest.scala @@ -0,0 +1,33 @@ +/* + * Copyright 2020 Docspell Contributors + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package docspell.store.migrate + +import cats.effect._ +import cats.effect.unsafe.implicits._ + +import docspell.common.LenientUri +import docspell.store.JdbcConfig + +import com.dimafeng.testcontainers.PostgreSQLContainer +import com.dimafeng.testcontainers.munit.TestContainerForAll +import munit._ +import org.testcontainers.utility.DockerImageName + +class PostgresqlMigrateTest extends FunSuite with TestContainerForAll { + override val containerDef: PostgreSQLContainer.Def = + PostgreSQLContainer.Def(DockerImageName.parse("postgres:13")) + + test("postgres empty schema migration") { + assume(Docker.existsUnsafe, "docker doesn't exist!") + withContainers { cnt => + val jdbc = + JdbcConfig(LenientUri.unsafe(cnt.jdbcUrl), cnt.username, cnt.password) + val result = FlywayMigrate.run[IO](jdbc).unsafeRunSync() + assert(result.migrationsExecuted > 0) + } + } +} diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 170aa65f..fa391b75 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -41,10 +41,17 @@ object Dependencies { val TikaVersion = "2.0.0" val YamuscaVersion = "0.8.1" val SwaggerUIVersion = "3.51.2" + val TestContainerVersion = "0.39.6" val TwelveMonkeysVersion = "3.7.0" val JQueryVersion = "3.5.1" val ViewerJSVersion = "0.5.9" + val testContainer = Seq( + "com.dimafeng" %% "testcontainers-scala-munit" % TestContainerVersion, + "com.dimafeng" %% "testcontainers-scala-mariadb" % TestContainerVersion, + "com.dimafeng" %% "testcontainers-scala-postgresql" % TestContainerVersion + ) + val catsParse = Seq( "org.typelevel" %% "cats-parse" % CatsParseVersion )