{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
import Test.Hspec.Monadic
import Test.Hspec.HUnit ()
import Test.HUnit
import Network.Wai
import Network.Wai.Handler.Warp (run)
import Network.HTTP.Conduit
import Control.Concurrent (forkIO, killThread)
import Network.HTTP.Types
import Control.Exception (try, SomeException)
import Network.HTTP.Conduit.ConnInfo
import CookieTest (cookieTest)
app :: Application
app req =
case pathInfo req of
[] -> return $ responseLBS status200 [] "homepage"
_ -> return $ responseLBS status404 [] "not found"
main :: IO ()
main = hspecX $ do
cookieTest
describe "simpleHttp" $ do
it "gets homepage" $ do
tid <- forkIO $ run 3000 app
lbs <- simpleHttp "http://localhost:3000/"
killThread tid
lbs @?= "homepage"
it "throws exception on 404" $ do
tid <- forkIO $ run 3001 app
elbs <- try $ simpleHttp "http://localhost:3001/404"
killThread tid
case elbs of
Left (_ :: SomeException) -> return ()
Right _ -> error "Expected an exception"
describe "manager" $ do
it "closes all connections" $ do
clearSocketsList
tid1 <- forkIO $ run 3002 app
tid2 <- forkIO $ run 3003 app
withManager $ \manager -> do
let Just req1 = parseUrl "http://localhost:3002/"
let Just req2 = parseUrl "http://localhost:3003/"
_res1a <- http req1 manager
_res1b <- http req1 manager
_res2 <- http req2 manager
return ()
requireAllSocketsClosed
killThread tid2
killThread tid1