diff --git a/build.sbt b/build.sbt index d3b541ca..83bb3c26 100644 --- a/build.sbt +++ b/build.sbt @@ -21,7 +21,7 @@ libraryDependencies += "org.apache.derby" % "derby" % "10.11.1 libraryDependencies += "org.hsqldb" % "hsqldb" % "2.5.0" % "test" -libraryDependencies += "org.postgresql" % "postgresql" % "42.2.14" % "test" +libraryDependencies += "org.postgresql" % "postgresql" % "42.2.14" % "test" libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.16" % "test" diff --git a/src/main/scala/slick/migration/api/TableMigration.scala b/src/main/scala/slick/migration/api/TableMigration.scala index de1a1d47..5fd393e2 100644 --- a/src/main/scala/slick/migration/api/TableMigration.scala +++ b/src/main/scala/slick/migration/api/TableMigration.scala @@ -10,27 +10,27 @@ object TableMigration { object Action { sealed abstract class Reversible(sort: Int) extends Action(sort) - case object DropTable extends Action(0) - case object CreateTable extends Reversible(1) - case class RenameTableTo(to: String) extends Reversible(2) - case class RenameTableFrom(from: String) extends Reversible(2) - case class AddColumn(info: ColumnInfo) extends Reversible(3) - case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(3) - case class DropColumn(info: ColumnInfo) extends Reversible(4) - case class DropColumnOfName(name: String) extends Action(4) - case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(5) - case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(5) - case class AlterColumnType(info: ColumnInfo) extends Action(6) - case class AlterColumnDefault(info: ColumnInfo) extends Action(6) - case class AlterColumnNullable(info: ColumnInfo) extends Action(6) - case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(7) - case class DropForeignKey(fk: ForeignKey) extends Reversible(7) + case object CreateTable extends Reversible(0) + case class RenameTableTo(to: String) extends Reversible(1) + case class AddColumn(info: ColumnInfo) extends Reversible(2) + case class AddColumnAndSetInitialValue(info: ColumnInfo, rawSqlExpr: String) extends Reversible(2) + case class RenameColumnTo(originalInfo: ColumnInfo, to: String) extends Reversible(2) + case class AlterColumnType(info: ColumnInfo) extends Action(3) + case class AlterColumnDefault(info: ColumnInfo) extends Action(3) + case class AlterColumnNullable(info: ColumnInfo) extends Action(3) + case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(4) + case class AddForeignKey(fk: ForeignKey) extends Reversible(4) + case class CreateIndex(info: IndexInfo) extends Reversible(5) + case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(5) + case class DropPrimaryKey(info: PrimaryKeyInfo) extends Reversible(6) + case class DropForeignKey(fk: ForeignKey) extends Reversible(6) case class DropIndex(info: IndexInfo) extends Reversible(7) - case class AddPrimaryKey(info: PrimaryKeyInfo) extends Reversible(8) - case class AddForeignKey(fk: ForeignKey) extends Reversible(8) - case class CreateIndex(info: IndexInfo) extends Reversible(8) - case class RenameIndexTo(originalInfo: IndexInfo, to: String) extends Reversible(9) - case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(9) + case class RenameColumnFrom(currentInfo: ColumnInfo, from: String) extends Reversible(8) + case class RenameIndexFrom(currentInfo: IndexInfo, from: String) extends Reversible(8) + case class RenameTableFrom(from: String) extends Reversible(8) + case class DropColumnOfName(name: String) extends Action(9) + case class DropColumn(info: ColumnInfo) extends Reversible(9) + case object DropTable extends Action(10) } sealed trait WithActions[A <: Action] { diff --git a/src/test/scala/slick/migration/api/DbTest.scala b/src/test/scala/slick/migration/api/DbTest.scala index e23ddc5f..8ebfb456 100644 --- a/src/test/scala/slick/migration/api/DbTest.scala +++ b/src/test/scala/slick/migration/api/DbTest.scala @@ -7,7 +7,7 @@ import scala.concurrent.Await import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration import scala.util.control.NonFatal -import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile} +import slick.jdbc.{HsqldbProfile, JdbcProfile, OracleProfile, PostgresProfile} import slick.jdbc.meta._ import slick.lifted.AbstractTable import com.typesafe.slick.testkit.util.JdbcTestDB @@ -245,6 +245,36 @@ abstract class DbTest[P <: JdbcProfile](val tdb: JdbcTestDB {val profile: P}) runMigration(tm.drop) } } + + test("reverse") { + val tm = TableMigration(TestTable) + val createTable = tm.create.addColumns(_.id, _.strWithDefault) + + assert(createTable.sql.size === 1) + assert(createTable.sql.head.contains("create table")) + + runMigration(createTable) + + val reversed = createTable.reverse + + assert(reversed.sql.size === 3) + assert(reversed.sql.head.contains("ID")) + assert(reversed.sql(1).contains("STR_WITH_DEFAULT")) + assert(reversed.sql(2).contains("drop table")) + + try withBeforeAndAfter(reversed)(getTables) { (before, after) => + // Only postgres can remove all columns from a table + if (this.profile.isInstanceOf[PostgresProfile]) { + assert(before.contains("TEST_TABLE")) + assert(!after.contains("TEST_TABLE")) + } + } catch { + case _: Throwable => + if (!this.profile.isInstanceOf[PostgresProfile]) { + runMigration(tm.drop) + } + } + } } trait CompleteDbTest { this: DbTest[_ <: JdbcProfile] =>