Testkit

Colossus has a test kit that includes some classes for simplifying tests for servers. Testkit is built on ScalaTest.

Setup

Make sure you add colossus-testkit to your dependcies, using the same version as colossus itself. For example:

libraryDependencies += "com.tumblr" %% "colossus-testkit" % "LATEST_VERSION" % "test

Unit Testing

Testing Callbacks

colossus.testkit.CallbackAwait works similarly to Scala’s Await for futures.

Testing Request Handlers

You can use MockConnection to create a fake ServerContext and create an instance of a request handler:

object TestkitExample extends App {
  implicit val actorSystem = ActorSystem()
  implicit val ioSystem = IOSystem()

  HttpServer.start("example-server", 9000) {
    new Initializer(_) {
      override def onConnect = new MyHandler(_)
    }
  }
}

class MyHandler(context: ServerContext) extends RequestHandler(context) {
  override def handle: PartialHandler[Http] = {
    case request @ Get on Root / "foo" => request.ok("bar")
  }
}

Todo, fix the spec!

/*class TestkitExampleSpec extends WordSpec with MustMatchers {
  "request handler" must {
    "generate a response" in {
      val connection = MockConnection.server(new MyHandler(_))
      val response = connection.typedHandler.handle(HttpRequest.get("/foo"))
      CallbackAwait.result(response, 1.second).body.bytes.utf8String mustBe "hello"
    }
  }
}*/

Integration Testing

ColossusSpec is a scalatest-based integration testing suite that contains a bunch of useful functions that help with spinning up instances of a service for testing

withIOSystem(f: IOSystem => Unit) will spin up a new IOSystem for the duration of a test and shut it down at the end.

withServer(server: ServerRef)(f: => Unit) will shutdown the given server after the test completes