9
votes

I am using slick 3 and I am trying to perform some integration tests with some inserts, some code that uses the db and then I want to rollback all the insert or deletion at the end of the test itself but I cannot find any documentation about it.

Is it possible? How can I achieve it?

2
See here : stackoverflow.com/questions/34905455/… Also take a look at this discussion . They are discussing the same issye you are facing.Som Bhattacharyya
Did you get any help ?Som Bhattacharyya
Yes, it seems the best answer I got. Unfortunately it seems that slick is a great library but incomplete for some features.Matroska
@Matroska Stephen's answer is correct, see here: github.com/slick/slick/commit/… (documentation added as part of 3.2, but IIUC correct since 3.0)nafg

2 Answers

2
votes

You need to use . transactionally around the DBIOAction

eg

val a = (for {
  ns <- coffees.filter(_.name.startsWith("ESPRESSO")).map(_.name).result
  _ <- DBIO.seq(ns.map(n => coffees.filter(_.name === n).delete): _*)
} yield ()).transactionally

val f: Future[Unit] = db.run(a)

For more see http://slick.typesafe.com/doc/3.1.1/dbio.html#transactions-and-pinned-sessions

1
votes

I can advice to drop and create table schema before and after test using BeforeAndAfter scala-test trait with next code:

def createTable(): Future[Unit] = {
        db.run(DBIO.seq(
          MTable.getTables.map(tables =>
            if (!tables.exists(_.name.name == table.baseTableRow.tableName))
              db.run(table.schema.create)
          )
        ))
}

def dropTable(): Future[Unit] = db.run(table.schema.drop)