diff --git a/yesod-json/test/Spec.hs b/yesod-json/test/Spec.hs new file mode 100644 index 00000000..7ed8c3dd --- /dev/null +++ b/yesod-json/test/Spec.hs @@ -0,0 +1,47 @@ +{-# 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