You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.5 KiB

4 years ago
  1. package controller
  2. import java.util.Properties
  3. import com.google.inject.Inject
  4. import org.flywaydb.core.Flyway
  5. import org.flywaydb.core.internal.jdbc.DriverDataSource
  6. import org.scalatestplus.play.FakeApplicationFactory
  7. import play.api.inject.guice.GuiceApplicationBuilder
  8. import play.api.inject.{Binding, Module}
  9. import play.api.{Application, Configuration, Environment}
  10. /**
  11. * Set up an application factory that runs flyways migrations on in memory database.
  12. */
  13. trait MyApplicationFactory extends FakeApplicationFactory {
  14. def fakeApplication(): Application = {
  15. new GuiceApplicationBuilder()
  16. .configure(Map("myapp.database.url" -> "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"))
  17. .bindings(new FlywayModule)
  18. .build()
  19. }
  20. }
  21. class FlywayModule extends Module {
  22. override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = {
  23. Seq(bind[FlywayMigrator].toSelf.eagerly() )
  24. }
  25. }
  26. class FlywayMigrator @Inject()(env: Environment, configuration: Configuration) {
  27. def onStart(): Unit = {
  28. val driver = configuration.get[String]("myapp.database.driver")
  29. val url = configuration.get[String]("myapp.database.url")
  30. val user = configuration.get[String]("myapp.database.user")
  31. val password = configuration.get[String]("myapp.database.password")
  32. Flyway.configure()
  33. .dataSource(new DriverDataSource(env.classLoader, driver, url, user, password, new Properties()))
  34. .locations("filesystem:modules/flyway/src/main/resources/db/migration")
  35. .load()
  36. .migrate()
  37. }
  38. onStart()
  39. }