scalaplayframeworkslick-3.0playframework-evolutions

How to apply manually evolutions in tests with Slick and Play! 2.4


I would like to manually run my evolution script at the beginning of each test file. I'm working with Play! 2.4 and Slick 3.

According to the documentation, the way to go seems to be:

Evolutions.applyEvolutions(database)

but I don't manage to get an instance of my database. In the documentation play.api.db.Databases is imported in order to get a database instance but if I try to import it, I get this error: object Databases is not a member of package play.api.db

How can I get an instance of my database in order to run the evolution script?

Edit: as asked in the comments, here is the entire source code giving the error:

import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases

class TestAddressModel extends PlaySpec with OneAppPerSuite {
   lazy val appBuilder = new GuiceApplicationBuilder()
   lazy val injector = appBuilder.injector()
   lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]

  def beforeAll() = {
    //val database: Database = ???
    //Evolutions.applyEvolutions(database)
  }

  "test" must { 
     "test" in { } 
  } 
}

Solution

  • I finally found this solution. I inject with Guice:

    lazy val appBuilder = new GuiceApplicationBuilder()
    
    lazy val injector = appBuilder.injector()
    
    lazy val databaseApi = injector.instanceOf[DBApi] //here is the important line
    

    (You have to import play.api.db.DBApi.)

    And in my tests, I simply do the following (actually I use an other database for my tests):

    override def beforeAll() = {
      Evolutions.applyEvolutions(databaseApi.database("default"))
    }
    
    override def afterAll() = {
      Evolutions.cleanupEvolutions(databaseApi.database("default"))
    }