Shredding a database using Slick in ScalaTest + Mockito and testing UPDATE

The documentation for unit testing a Scala application https://www.playframework.com/documentation/2.4.x/ScalaTestingWithScalaTest talks about taunting database access using Mockito. Although this method works very well for testing methods that receive information from the database, I don’t see a clear decision on how to test methods that insert, update, or delete data.

This is what I installed so far:

trait UserRepository { self: HasDatabaseConfig[JdbcProfile] =>
  import driver.api._

  class UserTable(tag: Tag) extends Table[userModel](tag, "users") {
     def id = column[Int]("id", O.PrimaryKey, O.AutoInc )
     def email = column[String]("email")
     def * = (id.?, email) <> (userModel.tupled, userModel.unapply _)
  }

  def allUsers() : Future[Seq[userModel]]
  def update(user: userModel) : Future[Int]
}

class SlickUserRepository extends UserRepository with HasDatabaseConfig[JdbcProfile] {
  import driver.api._
  protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)

  private val users = TableQuery[UserTable]

  override def allUsers(): Future[Seq[userModel]] = {
     db.run(users.result)
  }

  def update(user: userModel): Future[Int] = {
     db.run(userTableQuery.filter(_.id === user.id).update(user))          
  }
}

class UserService(userRepository: UserRepository) {
  def getUserById(id: Int): Future[Option[userModel]] = {
     userRepository.allUsers().map { users =>
        users.find(_.id.get == id)
  }

  // TODO, test this...
  def updateUser(user: userModel): Future[Int] = {
     userRepository.update(user)
  }
}

And then my tests:

class UserSpec extends PlaySpec with MockitoSugar with ScalaFutures {
  "UserService" should {
    val userRepository = mock[UserRepository]
    val user1 = userModel(Option(1), "user1@test.com")
    val user2 = userModel(Option(2), "user2@test.com")

    // mock the access and return our own results
    when(userRepository.allUsers) thenReturn Future {Seq(user1, user2)}

    val userService = new UserService(userRepository)

    "should find users correctly by id" in {
      val future = userService.getUserById(1)

      whenReady(future) { user =>
        user.get mustBe user1
      }
    }

    "should update user correctly" in {
       // TODO test this
    }
}

, "update" , . , Scala , . , ?

!

+4

All Articles