yesod-json 1.1.2.1 → 1.1.2.2
raw patch · 3 files changed
+69/−4 lines, 3 filesdep +hspecdep +wai-testdep +yesod-jsondep ~basedep ~containersdep ~textPVP ok
version bump matches the API change (PVP)
Dependencies added: hspec, wai-test, yesod-json
Dependency ranges changed: base, containers, text, yesod-core
API changes (from Hackage documentation)
Files
- Yesod/Json.hs +8/−2
- test/Spec.hs +47/−0
- yesod-json.cabal +14/−2
Yesod/Json.hs view
@@ -45,7 +45,7 @@ import Data.Text.Lazy.Encoding (decodeUtf8) import Data.Text.Lazy.Builder (toLazyText) import qualified Blaze.ByteString.Builder.Char.Utf8 as Blaze-import Data.Conduit (($$))+import Data.Conduit import Network.Wai (requestBody, requestHeaders) import Network.Wai.Parse (parseHttpAccept) import qualified Data.ByteString.Char8 as B8@@ -88,7 +88,13 @@ parseJsonBody :: J.FromJSON a => GHandler sub master (J.Result a) parseJsonBody = do req <- waiRequest- fmap J.fromJSON $ lift $ requestBody req $$ sinkParser JP.value'+ eValue <- lift+ $ runExceptionT+ $ transPipe lift (requestBody req)+ $$ sinkParser JP.value'+ return $ case eValue of+ Left e -> J.Error $ show e+ Right value -> J.fromJSON value -- | Same as 'parseJsonBody', but return an invalid args response on a parse -- error.
+ test/Spec.hs view
@@ -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
yesod-json.cabal view
@@ -1,5 +1,5 @@ name: yesod-json-version: 1.1.2.1+version: 1.1.2.2 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>@@ -7,7 +7,7 @@ synopsis: Generate content for Yesod using the aeson package. category: Web, Yesod stability: Stable-cabal-version: >= 1.6+cabal-version: >= 1.8 build-type: Simple homepage: http://www.yesodweb.com/ description: Generate content for Yesod using the aeson package.@@ -31,6 +31,18 @@ , safe >= 0.2 exposed-modules: Yesod.Json ghc-options: -Wall++test-suite tests+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ hs-source-dirs: test+ build-depends: base+ , wai-test+ , hspec+ , yesod-json+ , yesod-core+ , text+ , containers source-repository head type: git