Ik weet dat dit een ouder bericht is, maar het lijkt erop dat er een paar jaar later nog steeds geen voor de hand liggende oplossing is. als kortetermijnoplossing kun je in play 2.4.x-2.5.x (tot nu toe alleen daar getest), de manier veranderen waarop evoluties worden toegepast tijdens tests door een aangepaste evolutieslezer te maken:
package support
import play.api.db.evolutions.{ClassLoaderEvolutionsReader, Evolutions, ResourceEvolutionsReader}
import java.io.{ByteArrayInputStream, InputStream}
import java.nio.charset.StandardCharsets
import scala.io.Source
import scala.util.Try
class EvolutionTransformingReader(
classLoader: ClassLoader = classOf[ClassLoaderEvolutionsReader].getClassLoader,
prefix: String = "")
extends ResourceEvolutionsReader {
def loadResource(db: String, revision: Int): Option[InputStream] =
for {
stream <- Option(classLoader.getResourceAsStream(prefix + Evolutions.resourceName(db, revision)))
lines <- Try(Source.fromInputStream(stream).getLines).toOption
updated = lines map convertPostgresLinesToH2
} yield convertLinesToInputStream(updated)
private val ColumnRename = """(?i)\s*ALTER TABLE (\w+) RENAME COLUMN (\w+) TO (\w+);""".r
private def convertPostgresLinesToH2(line: String): String =
line match {
case ColumnRename(tableName, oldColumn, newColumn) =>
s"""ALTER TABLE $tableName ALTER COLUMN $oldColumn RENAME TO $newColumn;"""
case _ => line
}
private def convertLinesToInputStream(lines: Iterator[String]): InputStream =
new ByteArrayInputStream(lines.mkString("\n").getBytes(StandardCharsets.UTF_8))
}
geef het dan door aan de plaats waar je evoluties toepast tijdens je tests:
Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())
merk op dat de lezer zich nog steeds in een vrij domme toestand bevindt (er wordt aangenomen dat de SQL-statements oneliners zijn, wat niet gegarandeerd is), maar dit zou genoeg moeten zijn om iedereen op weg te helpen.