When running tests you might not want to start a full HTTP server and send requests using an HTTP client. Instead you can use the server in Hyper.Test.TestServer. It runs your middleware directly on Conn values, and collects the response using a Writer monad. You get back a TestResponse from which you can extract the status code, headers, and the response body.

it "responds with a friendly message" do
  conn <- { request: TestRequest defaultRequest
          , response: TestResponse Nothing [] []
          , components: {}
          # evalMiddleware app
          # testServer
  testStatus conn `shouldEqual` Just statusOK
  testStringBody conn `shouldEqual` "Hello there!"