Skip to content

Commit

Permalink
Merge pull request #128 from grandbora/master
Browse files Browse the repository at this point in the history
Adding shortcut methods to common http statuses
  • Loading branch information
twoism committed Mar 26, 2014
2 parents 3a2e368 + f241e26 commit d14624f
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 27 deletions.
38 changes: 25 additions & 13 deletions src/main/scala/com/twitter/finatra/ResponseBuilder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ package com.twitter.finatra
import org.jboss.netty.handler.codec.http._
import org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import com.twitter.finagle.http.{Response => FinagleResponse, Cookie}
import com.twitter.finagle.http.{Response => FinagleResponse, Cookie, Status}
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.util.Future
import com.fasterxml.jackson.databind.ObjectMapper
Expand All @@ -27,7 +27,7 @@ import com.fasterxml.jackson.module.scala.DefaultScalaModule
import org.apache.commons.io.IOUtils
import java.io.File
import org.jboss.netty.handler.codec.http.DefaultCookie
import org.jboss.netty.handler.codec.http.{Cookie => NettyCookie}
import org.jboss.netty.handler.codec.http.{Cookie => NettyCookie, HttpResponseStatus}

object ResponseBuilder {
def apply(body: String): FinagleResponse =
Expand All @@ -40,7 +40,7 @@ object ResponseBuilder {
new ResponseBuilder().body(body).status(status).headers(headers).build
}

class ResponseBuilder {
class ResponseBuilder extends CommonStatuses {
private var status: Option[Int] = None
private var headers: Map[String, String] = Map()
private var strBody: Option[String] = None
Expand Down Expand Up @@ -108,16 +108,6 @@ class ResponseBuilder {
this
}

def ok: ResponseBuilder = {
status(200)
this
}

def notFound: ResponseBuilder = {
status(404)
this
}

def body(s: String): ResponseBuilder = {
this.strBody = Some(s)
this
Expand Down Expand Up @@ -235,3 +225,25 @@ class ResponseBuilder {
}

}

trait CommonStatuses { self: ResponseBuilder =>
def ok: ResponseBuilder = buildFromStatus(Status.Ok)
def movedPermanently: ResponseBuilder = buildFromStatus(Status.MovedPermanently)
def found: ResponseBuilder = buildFromStatus(Status.Found)
def notModified: ResponseBuilder = buildFromStatus(Status.NotModified)
def temporaryRedirect: ResponseBuilder = buildFromStatus(Status.TemporaryRedirect)
def badRequest: ResponseBuilder = buildFromStatus(Status.BadRequest)
def unauthorized: ResponseBuilder = buildFromStatus(Status.Unauthorized)
def forbidden: ResponseBuilder = buildFromStatus(Status.Forbidden)
def notFound: ResponseBuilder = buildFromStatus(Status.NotFound)
def gone: ResponseBuilder = buildFromStatus(Status.Gone)
def internalServerError: ResponseBuilder = buildFromStatus(Status.InternalServerError)
def notImplemented: ResponseBuilder = buildFromStatus(Status.NotImplemented)
def serviceUnavailable: ResponseBuilder = buildFromStatus(Status.ServiceUnavailable)

private def buildFromStatus(st: HttpResponseStatus): ResponseBuilder = {
status(st.getCode)
this
}

}
44 changes: 30 additions & 14 deletions src/test/scala/com/twitter/finatra/ResponseBuilderSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.jboss.netty.util.CharsetUtil.UTF_8

import com.twitter.finatra.ResponseBuilder
import com.twitter.finatra.View
import com.twitter.finagle.http.Status

class MockView(val title:String) extends View {
val template = "mock.mustache"
Expand All @@ -28,20 +29,6 @@ class ResponseBuilderSpec extends ShouldSpec {
def resp = new ResponseBuilder
def view = new MockView("howdy view")

".ok" should "return a 200 response" in {
val built = resp.ok.build

built.statusCode should equal(200)
built.headerMap.get("Content-Length").get.toInt should equal (0)
}

".notFound" should "return a 404 response" in {
val built = resp.notFound.build

built.statusCode should equal (404)
built.headerMap.get("Content-Length").get.toInt should equal (0)
}

".status(201)" should "return a 201 response" in {
val built = resp.status(201).build

Expand Down Expand Up @@ -120,3 +107,32 @@ class ResponseBuilderSpec extends ShouldSpec {
built.headerMap.get("Content-Length").get.toInt should equal (422488)
}
}


class CommonStatusesSpec extends ShouldSpec {
def resp = new ResponseBuilder

Seq(

(".ok", resp.ok, Status.Ok),
(".movedPermanently", resp.movedPermanently, Status.MovedPermanently),
(".found", resp.found, Status.Found),
(".notModified", resp.notModified, Status.NotModified),
(".temporaryRedirect", resp.temporaryRedirect, Status.TemporaryRedirect),
(".badRequest", resp.badRequest, Status.BadRequest),
(".unauthorized", resp.unauthorized, Status.Unauthorized),
(".forbidden", resp.forbidden, Status.Forbidden),
(".notFound", resp.notFound, Status.NotFound),
(".gone", resp.gone, Status.Gone),
(".internalServerError", resp.internalServerError, Status.InternalServerError),
(".notImplemented", resp.notImplemented, Status.NotImplemented),
(".serviceUnavailable", resp.serviceUnavailable, Status.ServiceUnavailable)

).foreach { case (actionName, actualResponseBuilder, expectedStatus) =>
val testMessage = "return a %s response" format expectedStatus
actionName should testMessage in {
val built = actualResponseBuilder.build
built.status should equal(expectedStatus)
}
}
}

0 comments on commit d14624f

Please sign in to comment.