All Downloads are FREE. Search and download functionalities are using the official Maven repository.

skinny.test.MockControllerBase.scala Maven / Gradle / Ivy

The newest version!
package skinny.test

import javax.servlet.http._
import javax.servlet.ServletContext
import org.json4s._
import org.mockito.Mockito._
import skinny.SkinnyEnv
import skinny.micro.{ UnstableAccessValidation, SkinnyMicroParams }
import skinny.micro.context.SkinnyContext
import skinny.json.JSONStringOps
import scala.collection.concurrent.TrieMap
import skinny.controller.SkinnyControllerBase
import skinny.controller.feature.{ JSONParamsAutoBinderFeature, RequestScopeFeature }
import javax.servlet.http.HttpServletResponse

/**
 * Mock Controller Base.
 */
trait MockControllerBase extends SkinnyControllerBase with JSONParamsAutoBinderFeature {

  case class RenderCall(path: String)

  private val _requestScope = TrieMap[String, Any]()

  override def skipHaltingWhenRedirection = SkinnyEnv.isTest()

  override def contextPath = ""

  override def initParameter(name: String): Option[String] = None

  private[this] lazy val mockRequest = {
    val req = new MockHttpServletRequest
    req.setAttribute(RequestScopeFeature.REQUEST_SCOPE_KEY, _requestScope)
    req
  }

  private[this] lazy val mockResponse = {
    new MockHttpServletResponse
  }

  override def request(implicit ctx: SkinnyContext = context): HttpServletRequest = mockRequest

  override def response(implicit ctx: SkinnyContext = context): HttpServletResponse = mockResponse

  override implicit def servletContext: ServletContext = mock(classOf[ServletContext])

  override implicit def skinnyContext(implicit ctx: ServletContext): SkinnyContext = {
    SkinnyContext.build(ctx, mockRequest, mockResponse, UnstableAccessValidation(true, false))
  }

  override def halt[T: Manifest](
    status: Integer = null,
    body: T = (),
    headers: Map[String, String] = Map.empty,
    reason: String = null
  ): Nothing = {

    throw new MockHaltException(
      status = Option(status).map(_.intValue()),
      reason = Option(reason),
      headers = headers,
      body = body
    )
  }

  def getOutputStreamContents: String = {
    response.getOutputStream.toString
  }

  def getOutputStreamContents(charset: String): String = {
    response
      .getOutputStream
      .asInstanceOf[MockServletOutputStream]
      .toString(charset)
  }

  private[this] val _params = TrieMap[String, Seq[String]]()

  override def params(implicit ctx: SkinnyContext) = {
    val mergedParams = (super.params(ctx) ++ new SkinnyMicroParams(_params.toMap)).mapValues(v => Seq(v))
    new SkinnyMicroParams(if (_parsedBody.isDefined) {
      getMergedMultiParams(mergedParams, parsedBody(ctx).extract[Map[String, String]].mapValues(v => Seq(v)))
    } else {
      mergedParams
    })
  }

  def prepareParams(params: (String, String)*) = {
    params.foreach {
      case (k, v) =>
        _params += (k -> (_params.getOrElse(k, Seq[String]()) :+ v))
    }
  }

  override def multiParams(implicit ctx: SkinnyContext) = {
    _params.foldLeft(super.multiParams(ctx)) { (params, kv) =>
      params + (kv._1 -> params.get(kv._1).map(_ ++ kv._2).getOrElse(kv._2))
    }
  }

  private[this] var _parsedBody: Option[JValue] = None
  override def parsedBody(implicit ctx: SkinnyContext): JValue = {
    _parsedBody.getOrElse(JNothing)
  }

  def prepareJSONBodyRequest(json: String): Unit = {
    _parsedBody = JSONStringOps.fromJSONStringToJValue(json).toOption
  }

  // initialize this controller

  initializeRequestScopeAttributes(skinnyContext)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy