purescript-httpurple/Test/HTTPure/ServerSpec.purs
2017-07-10 12:06:14 -07:00

63 lines
1.8 KiB
Haskell

module HTTPure.ServerSpec where
import Prelude (bind, discard, pure, unit, ($))
import Control.Monad.Eff.Class as EffClass
import Data.Maybe as Maybe
import Node.Encoding as Encoding
import Node.StreamBuffer as StreamBuffer
import Test.Spec as Spec
import Test.Spec.Assertions as Assertions
import HTTPure.SpecHelpers as SpecHelpers
import HTTPure.Server as Server
import HTTPure.Route as Route
routes :: forall e. Array (Route.Route e)
routes =
[ Route.Get "/test1"
{ status: \_ -> 200
, headers: \_ -> []
, body: \_ -> "test1"
}
, Route.Get "/test2"
{ status: \_ -> 200
, headers: \_ -> []
, body: \_ -> "test2"
}
]
handleRequestSpec :: SpecHelpers.Test
handleRequestSpec = Spec.describe "handleRequest" $
Spec.it "matches and runs a route" do
body <- EffClass.liftEff do
buf <- StreamBuffer.writable
Server.handleRequest routes mockRequest $ SpecHelpers.mockHTTPResponse buf
StreamBuffer.contents Encoding.UTF8 buf
body `Assertions.shouldEqual` "test1"
where
mockRequest = SpecHelpers.mockHTTPRequest "/test1"
bootSpec :: SpecHelpers.Test
bootSpec = Spec.describe "boot" $
Spec.it "boots a server with the given options" do
EffClass.liftEff $ Server.boot options routes $ pure unit
out <- SpecHelpers.get "http://localhost:7900/test1"
out `Assertions.shouldEqual` "test1"
where
options = { port: 7900, hostname: "localhost", backlog: Maybe.Nothing }
serveSpec :: SpecHelpers.Test
serveSpec = Spec.describe "serve" $
Spec.it "boots a server on the given port" do
EffClass.liftEff $ Server.serve 7901 routes $ pure unit
out <- SpecHelpers.get "http://localhost:7901/test2"
out `Assertions.shouldEqual` "test2"
serverSpec :: SpecHelpers.Test
serverSpec = Spec.describe "Server" do
handleRequestSpec
bootSpec
serveSpec