Real http server for stubbing and expectations in Scala
- Stubbing HTTP requests at real Http Server
- responds always OK for any methods and paths
- supported methods: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
- Expecting HTTP requests as AccessLog
- asserts AccessLog about methods and counts
import httpmock._
val server = HttpMock.start()
server.port // => 37781 (automatically set by default)
// send requests to "http://127.0.0.1:37781" (or server.url)
server.stop
val server = HttpMock.start(9000)
server.port // => 9000
- HttpMock is immutable
val server = HttpMock.start(9000) // GET: ok
val stopped = server.stop() // GET: error
val restarted = stopped.start() // GET: ok
run()
ensuresserver.stop()
after action
HttpMock.run() { server => ... }
HttpMock.run(port) { server => ... }
Setting(port).run() { server => ... }
- default: accept all methods
val server = Setting(methods = Set(GET, POST)).start()
/*
GET => 200
POST => 200
PUT => 404
*/
val server = Setting(handler = {
case h: RequestHeader if h.version == "HTTP/1.0" => Results.HttpVersionNotSupported
})
/*
GET => 200
GET with HTTP/1.0 => 505
*/
- implemented expectations:
- method, body, header, count
import httpmock._
import scala.concurrent.duration._
val server = HttpMock.start(9000)
curl http://127.0.0.1:9000/
server.logs.expect(GET , count = 1)(1.second) // (PASS)
server.logs.expect(GET , count = 2)(1.second) // java.lang.AssertionError
server.logs.expect(POST, count = 1)(1.second) // java.lang.AssertionError
server.stop()
curl -X POST -H "Content-type: application/octet-stream" http://127.0.0.1:9000/ -d foo
curl -X POST -H "Content-type: application/octet-stream" http://127.0.0.1:9000/ -d bar
curl -X POST -H "Content-type: application/octet-stream" -H "X-ID: 1" http://127.0.0.1:9000/ -d bar
server.logs.expect(POST).body("foo")(1.second) // (PASS)
server.logs.expect(POST).body("bar")(1.second) // java.lang.AssertionError
server.logs.expect(POST).body("bar").count(2)(1.second) // (PASS)
server.logs.expect(POST).body("baz")(1.second) // java.lang.AssertionError
server.logs.expect(POST).header("X-ID", "1")(1.second) // (PASS)
server.stop()
curl -X POST -H "Content-type: application/octet-stream" http://127.0.0.1:9000/ -d foo
curl -X POST -H "Content-type: application/octet-stream" http://127.0.0.1:9000/ -d bar
curl -X POST -H "Content-type: application/octet-stream" -H "X-ID: 1" http://127.0.0.1:9000/ -d bar
server.logs.expect(POST).bodies(Set("foo", "bar"))(1.second) // (PASS)
server.logs.expect(POST).bodies(Set("bar", "foo"))(1.second) // (PASS)
server.logs.expect(POST).bodies(Set("foo", "XXX"))(1.second) // java.lang.AssertionError
server.stop()
import httpmock._
import scala.concurrent.duration._
import org.scalatest.FunSpec
class FooSpec extends FunSpec {
describe("foo") {
it("test with real httpd") {
HttpMock.run { server =>
// your application logic to `server.url`
...
// assert your requests like this
server.logs.expect(POST, count = 2)(3.seconds)
}
}
}
}