Embedded PostgreSQL provides a platform neutral way for running PostgreSQL binary in unit tests. It is an efficient database to write test cases as it supports all data types of PostgreSQL.
In this blog I will not dive deep in the features of Embedded PostgreSQL but rather focus on it’s integration with an Akka application. I have added a sample project for the better understanding.
Database testing sample:
https://www.techhub.knoldus.com/dashboard/projects/akka/60db2e45397f83a01374c34f
To start with test cases the first step is to add it’s library.
"com.opentable.components" % "otj-pg-embedded" % "0.13.3" % Test
Let’s start by assuming we have a student table with following details:
column | datatype |
student_id | VARCHAR |
VARCHAR | |
name | VARCHAR |
date_of_birth | TIMESTAMP |
marks | JSON |
address | JSON |
The next step is to create tables to execute test cases. In order to do that we have to add a create table query in a sql file and configure it with the Embedded PostgreSQL.
trait ConfigLoader extends LazyLogging {
val server: EmbeddedPostgres = EmbeddedPostgres
.builder()
.setPort(5332)
.start()
implicit val schema: String = SCHEMA_NAME
val driver = PostgresProfile
import driver.api.Database
implicit val db: Database = Database.forURL(url = server.getJdbcUrl(USER_NAME,DB_NAME),
driver = "org.postgresql.Driver")
private[this] val flyway = new Flyway()
flyway.setDataSource(server.getDatabase(USER_NAME,DB_NAME))
val path: String = System.getProperty("user.dir")
//path for SQL file
flyway.setLocations(s"filesystem:$path/src/test/resources/db.migration")
flyway.migrate()
}
After doing the configuration, you are good to write test cases for database operations.
def checkIfStudentExists(id: String): Future[Int] = {
db.run(
studentsQuery
.filter(col =>
col.email === id ||
col.studentId === id)
.size
.result)
}
I have added a method with slick query to check if student is valid/ Invalid. Below is the test case for the above method.
class StudentsDAOSpec extends AsyncWordSpecLike with ScalaFutures with Matchers with ConfigLoader {
implicit val defaultPatience: PatienceConfig =
PatienceConfig(timeout = Span(5, Seconds), interval = Span(500, Millis))
val studentsDAO = new StudentsDAO()
"StudentsDAO" should {
"able to check if student exits" in {
whenReady(studentsDAO.checkIfStudentExists("id")) { res =>
res shouldBe 0
}
}
}
}
So, this was an overview of how to integrate embedded PostgreSQL in your Akka project to test database operations.
For better understanding please check database testing sample:
https://www.techhub.knoldus.com/dashboard/projects/akka/60db2e45397f83a01374c34f