Skip to content

Instantly share code, notes, and snippets.

@romansky
Created May 14, 2014 15:34
Show Gist options
  • Save romansky/af44a7f35ce59bcbe8c2 to your computer and use it in GitHub Desktop.
Save romansky/af44a7f35ce59bcbe8c2 to your computer and use it in GitHub Desktop.
// the test helper class
import akka.actor._
import akka.io.IO
import java.util.concurrent.atomic.AtomicInteger
import spray.can.Http
import spray.http.{Uri, HttpMethod, HttpResponse, HttpRequest}
object Helpers {
lazy implicit val testSystem = ActorSystem("helpers-test-system")
val lastPort = new AtomicInteger(20000)
type Replay = (HttpMethod,Uri.Path,String)
def webReplayer(replay : List[Replay]) : (ActorRef,Int) = {
val newPort = lastPort.addAndGet(1)
val newServer = testSystem.actorOf(Props(new Helpers.ReplayerActor(replay)))
IO(Http) ! Http.Bind(newServer, interface = "127.0.0.1", port = newPort)
(newServer,newPort)
}
object ShutTestServer
class ReplayerActor(var replay :List[Replay]) extends Actor {
var ioServer : ActorRef = null
override def receive: Receive = {
case _ : Http.Connected =>
sender ! Http.Register(self)
ioServer = sender()
case HttpRequest(method, uri,_,_,_) =>
if (!replay.isEmpty && replay.head._1 == method && uri.path == replay.head._2){
sender ! HttpResponse(entity = replay.head._3)
replay = replay.tail
} else {
sender ! HttpResponse(status = 400, entity = "was expecting a different request at this point")
}
case ShutTestServer => ioServer ! PoisonPill
case _ => //ignore
}
}
}
// how to use
val content =
s"""
|<html>
|<head>
|<title>sometitle</title>
|</head>
|<body>some body</body>
|</html>
""".stripMargin
// you pass a list of expected responses to "replay" with real nice native Spray objects
val (_testWebServer,port) = Helpers.webReplayer(
List(
(GET,Uri.Path("/somesite"),content)
)
)
// from another place you can now do
val whatEver = YourHTTPGetter.fetch(s"http://127.0.0.1:$port/somesite")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment