Skip to content

Commit

Permalink
alerts-server: Integrate playsonifytest library for testing
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexITC committed Feb 25, 2018
1 parent da31eb3 commit 790cf6a
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 94 deletions.
1 change: 1 addition & 0 deletions alerts-server/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ libraryDependencies += "com.github.bitsoex" % "bitso-java" % "v3.0.5"
libraryDependencies += "com.pauldijou" %% "jwt-core" % "0.14.1"

libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.0" % Test
libraryDependencies += "com.alexitc" %% "playsonifytest" % "1.0.0" % Test

libraryDependencies ++= Seq(
"com.spotify" % "docker-client" % "8.9.1",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
package com.alexitc.coinalerts.commons

import java.net.URLEncoder

import com.alexitc.coinalerts.core.{AuthorizationToken, PaginatedQuery}
import com.alexitc.coinalerts.data._
import com.alexitc.coinalerts.modules.{ExchangeCurrencySeederTaskModule, FixedPriceAlertsTaskModule}
import com.alexitc.coinalerts.services.external.ReCaptchaService
import com.alexitc.coinalerts.services.{EmailServiceTrait, JWTService}
import org.scalatest.concurrent.ScalaFutures
import org.scalatestplus.play.PlaySpec
import com.alexitc.playsonify.test.PlayAPISpec
import org.slf4j.LoggerFactory
import play.api.db.{DBApi, Database, Databases}
import play.api.inject.bind
import play.api.inject.guice.GuiceApplicationBuilder
import play.api.mvc.Result
import play.api.test.FakeRequest
import play.api.test.Helpers._
import play.api.{Application, Configuration, Environment, Mode}
import play.api.{Configuration, Environment, Mode}

import scala.concurrent.Future

Expand All @@ -25,7 +22,7 @@ import scala.concurrent.Future
* without depending on a database but custom implementations
* for the data layer.
*/
trait PlayAPISpec extends PlaySpec with ScalaFutures {
trait CustomPlayAPISpec extends PlayAPISpec {

private val logger = LoggerFactory.getLogger(this.getClass)

Expand Down Expand Up @@ -60,7 +57,7 @@ trait PlayAPISpec extends PlaySpec with ScalaFutures {
implicit val exchangeCurrencyDataHandler: ExchangeCurrencyBlockingDataHandler = new ExchangeCurrencyInMemoryDataHandler {}
CurrencySeeder.seed

val guiceApplicationBuilder: GuiceApplicationBuilder = GuiceApplicationBuilder(loadConfiguration = loadConfigWithoutEvolutions)
override val guiceApplicationBuilder: GuiceApplicationBuilder = GuiceApplicationBuilder(loadConfiguration = loadConfigWithoutEvolutions)
.in(Mode.Test)
.disable(classOf[FixedPriceAlertsTaskModule])
.disable(classOf[ExchangeCurrencySeederTaskModule])
Expand All @@ -71,88 +68,21 @@ trait PlayAPISpec extends PlaySpec with ScalaFutures {
.overrides(bind[UserBlockingDataHandler].to(userDataHandler))
.overrides(bind[ExchangeCurrencyBlockingDataHandler].to(exchangeCurrencyDataHandler))

def application: Application

lazy val jwtService = application.injector.instanceOf[JWTService]


/***********************************************************************/

private val JsonHeader = CONTENT_TYPE -> "application/json"
private val EmptyJson = "{}"

private def logRequestResponse[T](request: FakeRequest[T], response: Future[Result]) = {
override protected def log[T](request: FakeRequest[T], response: Future[Result]) = {
logger.info(s"REQUEST > $request, headers = ${request.headers}; RESPONSE < status = ${status(response)}, body = ${contentAsString(response)}")
}
}

/** Syntactic sugar for calling APIs **/
def POST(url: String, jsonBody: Option[String], extraHeaders: (String, String)*): Future[Result] = {
val headers = JsonHeader :: extraHeaders.toList
val json = jsonBody.getOrElse(EmptyJson)
val request = FakeRequest("POST", url)
.withHeaders(headers: _*)
.withBody(json)

val response = route(application, request).get
logRequestResponse(request, response)
response
}

def POST(url: String, extraHeaders: (String, String)*): Future[Result] = {
POST(url, None, extraHeaders: _*)
}

def GET(url: String, extraHeaders: (String, String)*): Future[Result] = {
val headers = JsonHeader :: extraHeaders.toList
val request = FakeRequest("GET", url)
.withHeaders(headers: _*)

val response = route(application, request).get
logRequestResponse(request, response)
response
}

def DELETE(url: String, extraHeaders: (String, String)*): Future[Result] = {
val headers = JsonHeader :: extraHeaders.toList
val request = FakeRequest("DELETE", url)
.withHeaders(headers: _*)

val response = route(application, request).get
logRequestResponse(request, response)

response
}
object CustomPlayAPISpec {

def PUT(url: String, jsonBody: Option[String], extraHeaders: (String, String)*): Future[Result] = {
val headers = JsonHeader :: extraHeaders.toList
val json = jsonBody.getOrElse(EmptyJson)
val request = FakeRequest("PUT", url)
.withHeaders(headers: _*)
.withBody(json)
import PlayAPISpec.Implicits._

val response = route(application, request).get
logRequestResponse(request, response)
response
}
}

object PlayAPISpec {
implicit class AuthorizationTokenExt(val token: AuthorizationToken) extends AnyVal {
def toHeader: (String, String) = AUTHORIZATION -> s"Bearer ${token.string}"
}

implicit class HttpExt(val params: List[(String, String)]) extends AnyVal {
def toQueryString: String = {
params
.map { case (key, value) =>
val encodedKey = URLEncoder.encode(key, "UTF-8")
val encodedValue = URLEncoder.encode(value, "UTF-8")
List(encodedKey, encodedValue).mkString("=")
}
.mkString("&")
}
}

implicit class PaginatedQueryExt(val query: PaginatedQuery) extends AnyVal {
def toHttpQueryString: String = {
val params = List(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.alexitc.coinalerts.controllers

import java.time.OffsetDateTime

import com.alexitc.coinalerts.commons.{DataHelper, PlayAPISpec, RandomDataGenerator}
import com.alexitc.coinalerts.commons.{CustomPlayAPISpec, DataHelper, RandomDataGenerator}
import com.alexitc.coinalerts.core.{Limit, Offset, PaginatedQuery}
import com.alexitc.coinalerts.data.{DailyPriceAlertBlockingDataHandler, DailyPriceAlertInMemoryDataHandler}
import com.alexitc.coinalerts.models._
Expand All @@ -11,9 +11,9 @@ import play.api.inject.bind
import play.api.libs.json.JsValue
import play.api.test.Helpers._

class DailyPriceAlertsControllerSpec extends PlayAPISpec {
class DailyPriceAlertsControllerSpec extends CustomPlayAPISpec {

import PlayAPISpec._
import CustomPlayAPISpec._

implicit val dailyPriceAlertDataHandler: DailyPriceAlertBlockingDataHandler = new DailyPriceAlertInMemoryDataHandler {}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.alexitc.coinalerts.controllers

import com.alexitc.coinalerts.commons.PlayAPISpec
import com.alexitc.coinalerts.commons.CustomPlayAPISpec
import com.alexitc.coinalerts.models.{Exchange, ExchangeCurrencyId, Market}
import play.api.Application
import play.api.libs.json.JsValue
import play.api.test.Helpers._

class ExchangeCurrenciesControllerSpec extends PlayAPISpec {
class ExchangeCurrenciesControllerSpec extends CustomPlayAPISpec {

val application: Application = guiceApplicationBuilder
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.alexitc.coinalerts.controllers
import java.time.OffsetDateTime

import com.alexitc.coinalerts.commons.DataHelper._
import com.alexitc.coinalerts.commons.{PlayAPISpec, RandomDataGenerator}
import com.alexitc.coinalerts.commons.{CustomPlayAPISpec, RandomDataGenerator}
import com.alexitc.coinalerts.core.{Limit, Offset, PaginatedQuery}
import com.alexitc.coinalerts.data.{FixedPriceAlertBlockingDataHandler, FixedPriceAlertInMemoryDataHandler}
import com.alexitc.coinalerts.models.FixedPriceAlertId
Expand All @@ -12,9 +12,9 @@ import play.api.inject.bind
import play.api.libs.json.JsValue
import play.api.test.Helpers._

class FixedPriceAlertsControllerSpec extends PlayAPISpec {
class FixedPriceAlertsControllerSpec extends CustomPlayAPISpec {

import PlayAPISpec._
import CustomPlayAPISpec._

implicit val alertDataHandler: FixedPriceAlertBlockingDataHandler = new FixedPriceAlertInMemoryDataHandler {
override def exchangeCurrencyBlocingDataHandler = Some(exchangeCurrencyDataHandler)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.alexitc.coinalerts.controllers

import com.alexitc.coinalerts.commons.PlayAPISpec
import com.alexitc.coinalerts.commons.CustomPlayAPISpec
import play.api.Application
import play.api.test.Helpers._

class HealthControllerSpec extends PlayAPISpec {
class HealthControllerSpec extends CustomPlayAPISpec {

val application: Application = guiceApplicationBuilder.build()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.alexitc.coinalerts.controllers

import com.alexitc.coinalerts.commons.{DataHelper, PlayAPISpec}
import com.alexitc.coinalerts.commons.{CustomPlayAPISpec, DataHelper}
import com.alexitc.coinalerts.data.{NewCurrencyAlertBlockingDataHandler, NewCurrencyAlertInMemoryDataHandler}
import com.alexitc.coinalerts.models.Exchange
import play.api.Application
import play.api.inject.bind
import play.api.libs.json.JsValue
import play.api.test.Helpers._

class NewCurrencyAlertsControllerSpec extends PlayAPISpec {
class NewCurrencyAlertsControllerSpec extends CustomPlayAPISpec {

import PlayAPISpec._
import CustomPlayAPISpec._

val dataHandler = new NewCurrencyAlertInMemoryDataHandler {}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.alexitc.coinalerts.controllers

import com.alexitc.coinalerts.commons.PlayAPISpec.AuthorizationTokenExt
import com.alexitc.coinalerts.commons.{DataHelper, PlayAPISpec, RandomDataGenerator}
import com.alexitc.coinalerts.commons.{CustomPlayAPISpec, DataHelper, RandomDataGenerator}
import com.alexitc.coinalerts.models._
import play.api.Application
import play.api.i18n.Lang
import play.api.libs.json.JsValue
import play.api.test.Helpers._

class UsersControllerSpec extends PlayAPISpec {
class UsersControllerSpec extends CustomPlayAPISpec {

import CustomPlayAPISpec._

val application: Application = guiceApplicationBuilder.build()

Expand Down

0 comments on commit 790cf6a

Please sign in to comment.