packages feed

twain-2.1.0.0: test/TwainSpec.hs

module TwainSpec where

import Web.Twain
import Control.Monad (when)
import Control.Monad.IO.Class (liftIO)
import Data.String (fromString)
import Test.Hspec
import qualified Test.Hspec.Wai as Test

-- * Tests

spec :: Spec
spec = Test.with (pure app) $ do
  describe "GET" $ do
    describe "GET /" $ do
      it "responds with 200 & html 'hello world'" $
        Test.shouldRespondWith
          (Test.get "/")
          "Hello World!"
            { Test.matchStatus = 200
            , Test.matchHeaders = ["Content-Type" Test.<:> "text/html; charset=utf-8"]
            }

    describe "GET /json" $ do
      it "responds with Content-Type application/json" $
        Test.shouldRespondWith
          (Test.get "/json")
          "[true]"
            { Test.matchStatus = 200
            , Test.matchHeaders = ["Content-Type" Test.<:> "application/json; charset=utf-8"]
            }

    describe "GET /css" $ do
      it "responds with Content-Type text/css" $
        Test.shouldRespondWith
          (Test.get "/css")
          (fromString style)
            { Test.matchStatus = 200
            , Test.matchHeaders = ["Content-Type" Test.<:> "text/css; charset=utf-8"]
            }

    describe "GET /notfound" $ do
      it "responds with 404 / 'Not found...'" $
        Test.shouldRespondWith
          (Test.get "/notfound")
          "Not found..." { Test.matchStatus = 404 }

  describe "POST" $ do
    describe "POST /echo/James" $ do
      it "Without body - responds with 200 & 'Hello, James'" $
        Test.shouldRespondWith
          (Test.post "/echo/James" "")
          "Hello, James" { Test.matchStatus = 200 }

      it "With body - responds with 200 & 'Hello, Jameson'" $
        Test.shouldRespondWith
          (Test.postHtmlForm "/echo/James" [("bodyname", "Jameson")])
          "Hello, Jameson" { Test.matchStatus = 200 }

    describe "POST /echo/" $ do
      it "responds with 404 & 'Person not specified...' (next works correctly)" $
        Test.shouldRespondWith
          (Test.postHtmlForm "/echo/" [])
          "Person not specified..." { Test.matchStatus = 404 }

-- * App

app :: Application
app = foldr ($) (notFound missing) routes

routes :: [Middleware]
routes =
  [ get "/" index
  , get "/json" myjson
  , get "/css" (send $ css $ fromString style)
  , post "/echo/:name" echo
  , post "/echo/:name" missingPerson
  ]

index :: ResponderM a
index = send $ html "Hello World!"

myjson :: ResponderM a
myjson = send $ json [True]

style :: String
style = "body { width: 900px; margin: auto; }"

echo :: ResponderM a
echo = do
  name <- fmap (unwords . words) $ paramMaybe "bodyname" >>= maybe (param "name") pure
  when (null name) $ next
  send $ html $ "Hello, " <> fromString name

missing :: ResponderM a
missing = send $ html "Not found..."

missingPerson :: ResponderM a
missingPerson =
  send $
    raw status404 [("Content-Type", "text/html; charset=utf-8")] $
      "Person not specified..."