@@ -8,14 +8,15 @@ module Servant.API.ContentTypesSpec where
88
99#if !MIN_VERSION_base(4,8,0)
1010import Control.Applicative
11+import Data.Monoid
1112#endif
1213import Control.Arrow
1314import Data.Aeson
1415import Data.Aeson.Parser (jstring)
1516import Data.Attoparsec.ByteString (parseOnly)
17+import Data.Either
1618import Data.Function (on)
1719import Data.Proxy
18−
1920import Data.ByteString.Char8 (ByteString, append, pack)
2021import qualified Data.ByteString.Lazy as BSL
2122import Data.List (maximumBy)
@@ -36,54 +37,56 @@ spec :: Spec
3637spec = describe "Servant.API.ContentTypes" $ do
3738
3839 describe "The JSON Content-Type type" $ do
40+ let p = Proxy :: Proxy JSON
41+
42+ it "handles whitespace at end of input" $ do
43+ mimeUnrender p "[1] " `shouldBe` Right [1 :: Int]
44+
45+ it "handles whitespace at beginning of input" $ do
46+ mimeUnrender p " [1] " `shouldBe` Right [1 :: Int]
47+
48+ it "does not like junk at end of input" $ do
49+ mimeUnrender p "[1] this probably shouldn't work"
50+ `shouldSatisfy` (isLeft :: Either a [Int] -> Bool)
3951
4052 it "has mimeUnrender reverse mimeRender for valid top-level json ([Int]) " $ do
41− let p = Proxy :: Proxy JSON
4253 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::[Int])
4354
4455 it "has mimeUnrender reverse mimeRender for valid top-level json " $ do
45− let p = Proxy :: Proxy JSON
4656 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::SomeData)
4757
4858 describe "The FormUrlEncoded Content-Type type" $ do
49−
50− let isNonNull ("", "") = False
51− isNonNull _ = True
59+ let p = Proxy :: Proxy FormUrlEncoded
5260
5361 it "has mimeUnrender reverse mimeRender" $ do
54− let p = Proxy :: Proxy FormUrlEncoded
55− property $ \x -> all isNonNull x
62+ property $ \x -> all (/= mempty) x
5663 ==> mimeUnrender p (mimeRender p x) == Right (x::[(TextS.Text,TextS.Text)])
5764
5865 it "has mimeUnrender reverse exportParams (Network.URL)" $ do
59− let p = Proxy :: Proxy FormUrlEncoded
60− property $ \x -> all isNonNull x
66+ property $ \x -> all (/= mempty) x
6167 ==> (mimeUnrender p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
6268
6369 it "has importParams (Network.URL) reverse mimeRender" $ do
64− let p = Proxy :: Proxy FormUrlEncoded
65− property $ \x -> all isNonNull x
70+ property $ \x -> all (/= mempty) x
6671 ==> (fmap (map (cs *** cs)) . importParams . cs . mimeRender p $ x) == Just (x::[(TextS.Text,TextS.Text)])
6772
6873 describe "The PlainText Content-Type type" $ do
74+ let p = Proxy :: Proxy PlainText
6975
7076 it "has mimeUnrender reverse mimeRender (lazy Text)" $ do
71− let p = Proxy :: Proxy PlainText
7277 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextL.Text)
7378
7479 it "has mimeUnrender reverse mimeRender (strict Text)" $ do
75− let p = Proxy :: Proxy PlainText
7680 property $ \x -> mimeUnrender p (mimeRender p x) == Right (x::TextS.Text)
7781
7882 describe "The OctetStream Content-Type type" $ do
83+ let p = Proxy :: Proxy OctetStream
7984
8085 it "is id (Lazy ByteString)" $ do
81− let p = Proxy :: Proxy OctetStream
8286 property $ \x -> mimeRender p x == (x :: BSL.ByteString)
8387 && mimeUnrender p x == Right x
8488
8589 it "is fromStrict/toStrict (Strict ByteString)" $ do
86− let p = Proxy :: Proxy OctetStream
8790 property $ \x -> mimeRender p x == BSL.fromStrict (x :: ByteString)
8891 && mimeUnrender p (BSL.fromStrict x) == Right x
8992