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

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

The newest version!
/*
 * Copyright 2002-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package skinny.test

import java.io.BufferedReader
import java.security.Principal
import java.util._
import javax.servlet._
import javax.servlet.http._
import org.mockito.Mockito._
import scala.collection.JavaConverters._

class MockHttpServletRequest extends HttpServletRequest {

  var dispatcherType: DispatcherType = _

  override def getDispatcherType: DispatcherType = dispatcherType

  var asyncContext: AsyncContext = _
  var asyncSupported: Boolean = true
  var asyncStarted: Boolean = false

  override def getAsyncContext: AsyncContext = asyncContext
  override def isAsyncSupported: Boolean = asyncSupported
  override def isAsyncStarted: Boolean = asyncStarted
  override def startAsync(servletRequest: ServletRequest, servletResponse: ServletResponse): AsyncContext = asyncContext
  override def startAsync(): AsyncContext = asyncContext

  var servletContext: ServletContext = {
    val ctx = mock(classOf[ServletContext])
    when(ctx.getSessionCookieConfig).thenReturn(mock(classOf[SessionCookieConfig]))
    ctx
  }

  override def getServletContext: ServletContext = servletContext
  override def getRealPath(path: String): String = servletContext.getRealPath(path)

  var localPort: Int = 80
  var localAddr: String = "127.0.0.1"
  var localName: String = "localhost"

  override def getLocalPort: Int = localPort
  override def getLocalAddr: String = localAddr
  override def getLocalName: String = localName

  var serverPort: Int = 80
  var serverName: String = "localhost"

  override def getServerPort: Int = serverPort
  override def getServerName: String = serverName

  var remotePort: Int = 80
  var remoteHost = "localhost"
  var remoteAddr = "127.0.0.1"

  override def getRemotePort: Int = remotePort
  override def getRemoteHost: String = remoteHost
  override def getRemoteAddr: String = remoteAddr

  override def getRequestDispatcher(path: String): RequestDispatcher = mock(classOf[RequestDispatcher])

  var secure: Boolean = false
  override def isSecure: Boolean = secure

  var locales = new LinkedList[Locale]
  override def getLocales: java.util.Enumeration[Locale] = Collections.enumeration(locales)
  override def getLocale: Locale = if (locales.size() > 0) locales.get(0) else null

  var attributes = new LinkedHashMap[String, AnyRef]

  override def getAttributeNames: java.util.Enumeration[String] = Collections.enumeration(attributes.keySet)
  override def getAttribute(name: String): AnyRef = attributes.get(name)
  override def removeAttribute(name: String): Unit = attributes.remove(name)
  override def setAttribute(name: String, value: AnyRef): Unit = attributes.put(name, value)

  override def getReader: BufferedReader = mock(classOf[BufferedReader])
  override def getInputStream: ServletInputStream = mock(classOf[ServletInputStream])

  var scheme = "http"
  var protocol = "http"

  override def getScheme: String = scheme
  override def getProtocol: String = protocol

  var parameters = new LinkedHashMap[String, Array[String]]

  override def getParameterMap: java.util.Map[String, Array[String]] = Collections.unmodifiableMap(parameters)
  override def getParameterValues(name: String): Array[String] = Option(getParameterMap.get(name)).getOrElse(Array())
  override def getParameterNames: java.util.Enumeration[String] = Collections.enumeration(getParameterMap.keySet)
  override def getParameter(name: String): String = {
    val params = getParameterMap.get(name)
    if (params != null && params.size > 0) params(0) else null
  }

  var content: Array[Byte] = null
  var contentType: String = null
  var characterEncoding: String = null

  override def getContentType: String = contentType
  override def getContentLength: Int = if (content != null) content.length else -1
  override def setCharacterEncoding(env: String): Unit = {
    characterEncoding = env
    updateContentTypeHeader()
  }

  val CONTENT_TYPE_HEADER = "Content-Type"
  val CHARSET_PREFIX = "charset="

  def updateContentTypeHeader() {
    if (contentType != null) {
      val s = new StringBuilder(contentType)
      if (!contentType.toLowerCase.contains(CHARSET_PREFIX) && characterEncoding != null) {
        s.append(";").append(CHARSET_PREFIX).append(characterEncoding)
      }
      doAddHeaderValue(CONTENT_TYPE_HEADER, s.toString(), true)
    }
  }

  val headers = new LinkedHashMap[String, HeaderValueHolder]

  def doAddHeaderValue(name: String, value: AnyRef, replace: Boolean) {
    def replaceHeader(name: String): HeaderValueHolder = {
      val h = new HeaderValueHolder
      headers.put(name, h)
      h
    }
    val header = HeaderValueHolder.getByName(headers, name).map { h =>
      if (replace) replaceHeader(name) else h
    }.getOrElse { replaceHeader(name) }

    if (value.isInstanceOf[Collection[_]]) {
      value.asInstanceOf[Collection[AnyRef]].asScala.foreach { v => header.addValue(v) }
    } else if (value.getClass.isArray) {
      value.asInstanceOf[Collection[AnyRef]].asScala.foreach { v => header.addValue(v) }
    } else {
      header.addValue(value)
    }
  }

  override def getCharacterEncoding: String = characterEncoding

  val parts = new LinkedHashMap[String, Part]

  override def getPart(name: String): Part = null

  override def getParts: java.util.Collection[Part] = parts.values

  override def logout(): Unit = {
    userPrincipal = null
    remoteUser = null
    authType = null
  }

  override def login(username: String, password: String): Unit = throw new UnsupportedOperationException
  override def authenticate(response: HttpServletResponse): Boolean = throw new UnsupportedOperationException

  var requestedSessionIdFromURL: Boolean = false

  override def isRequestedSessionIdFromUrl: Boolean = requestedSessionIdFromURL
  override def isRequestedSessionIdFromURL: Boolean = requestedSessionIdFromURL

  var requestedSessionIdFromCookie: Boolean = true

  override def isRequestedSessionIdFromCookie: Boolean = requestedSessionIdFromCookie

  var requestedSessionIdValid: Boolean = true

  override def isRequestedSessionIdValid: Boolean = requestedSessionIdValid

  val session = new MockHttpSession

  override def getSession: HttpSession = session
  override def getSession(create: Boolean): HttpSession = session

  var servletPath: String = _
  override def getServletPath: String = servletPath

  override def getRequestURL: StringBuffer = {
    val url = new StringBuffer(this.scheme).append("://").append(this.serverName)
    if (this.serverPort > 0 &&
      (("http".equalsIgnoreCase(scheme) && this.serverPort != 80) || ("https".equalsIgnoreCase(scheme) && this.serverPort != 443))) {
      url.append(':').append(this.serverPort)
    }
    if (getRequestURI.exists(c => !Character.isWhitespace(c))) {
      url.append(getRequestURI)
    }
    url
  }

  var requestURI: String = _

  override def getRequestURI: String = requestURI

  var requestedSessionId: String = _

  override def getRequestedSessionId: String = requestedSessionId

  var userPrincipal: Principal = _

  override def getUserPrincipal: Principal = userPrincipal

  val userRoles = new HashSet[String]

  override def isUserInRole(role: String): Boolean = userRoles.contains(role)

  var remoteUser: String = _

  override def getRemoteUser: String = remoteUser

  var queryString: String = _

  override def getQueryString: String = queryString

  var contextPath: String = ""

  override def getContextPath: String = contextPath

  var pathInfo: String = _

  override def getPathInfo: String = pathInfo
  override def getPathTranslated: String = {
    if (pathInfo != null) getRealPath(pathInfo) else null
  }

  var method: String = _

  override def getMethod: String = method

  override def getIntHeader(name: String): Int = {
    HeaderValueHolder.getByName(headers, name).map { header =>
      val i: Int = header.getValue() match {
        case null => -1
        case n: Number => n.intValue
        case str: String => Integer.valueOf(str)
        case v => throw new NumberFormatException("Value for header '" + name + "' is not a Number: " + v)
      }
      i
    }.getOrElse(-1)
  }

  override def getHeaderNames: java.util.Enumeration[String] = Collections.enumeration(headers.keySet)

  override def getHeaders(name: String): java.util.Enumeration[String] = {
    HeaderValueHolder.getByName(headers, name).map { header =>
      Collections.enumeration(header.getStringValues)
    }.getOrElse {
      Collections.enumeration(new LinkedList[String])
    }
  }

  override def getHeader(name: String): String = {
    HeaderValueHolder.getByName(this.headers, name).map(_.getStringValue).orNull[String]
  }

  override def getDateHeader(name: String): Long = {
    HeaderValueHolder.getByName(this.headers, name).map { header =>
      header.getValue match {
        case null => -1L
        case d: Date => d.getTime
        case n: Number => n.longValue
        case v => throw new IllegalArgumentException("Value for header '" + name + "' is neither a Date nor a Number: " + v)
      }
    }.getOrElse(-1L)
  }

  var cookies = Array[Cookie]()

  override def getCookies: Array[Cookie] = cookies

  var authType: String = _

  override def getAuthType: String = authType

  override def changeSessionId(): String = throw new UnsupportedOperationException

  override def upgrade[T <: HttpUpgradeHandler](handlerClass: Class[T]): T = throw new UnsupportedOperationException

  override def getContentLengthLong: Long = getContentLength.toLong
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy