packages feed

yesod-json-1.1.2.2: test/Spec.hs

{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, TypeFamilies, MultiParamTypeClasses #-}
import Yesod.Core
import Yesod.Json
import Test.Hspec
import qualified Data.Map as Map
import Network.Wai.Test
import Data.Text (Text)

data App = App

mkYesod "App" [parseRoutes|
/ HomeR GET
|]

instance Yesod App

getHomeR :: Handler RepPlain
getHomeR = do
    val <- parseJsonBody_
    case Map.lookup ("foo" :: Text) val of
        Nothing -> invalidArgs ["foo not found"]
        Just foo -> return $ RepPlain $ toContent (foo :: Text)

main :: IO ()
main = do
    app <- toWaiApp App
    hspec $ describe "Yesod.Json" $ do
        it "parses valid content" $ flip runSession app $ do
            sres <- srequest SRequest
                { simpleRequest = defaultRequest
                , simpleRequestBody = "{\"foo\":\"bar\"}"
                }
            assertStatus 200 sres
            assertBody "bar" sres
        it "400 for bad JSON" $ flip runSession app $ do
            sres <- srequest SRequest
                { simpleRequest = defaultRequest
                , simpleRequestBody = "{\"foo\":\"bar\""
                }
            assertStatus 400 sres
        it "400 for bad structure" $ flip runSession app $ do
            sres <- srequest SRequest
                { simpleRequest = defaultRequest
                , simpleRequestBody = "{\"foo2\":\"bar\"}"
                }
            assertStatus 400 sres
            assertBodyContains "foo not found" sres