on master help sign in
Add test for FormUrlEncoded using Network.URL
commit4f91a28d57a83fc660a0883754bb477f19847cf5 authorTimo von Holtz <tvh@anchor.com.au> dateMon 23 Feb 2015, 16:54 (12 years ago) parent1d378e6
3 files changed+14−1
servant.cabal+1 src/Servant/API/ContentTypes.hs+2 test/Servant/API/ContentTypesSpec.hs+11−1
servant.cabal+1
@@ -94,3 +94,4 @@ test-suite spec
9494 , servant
9595 , string-conversions
9696 , text
97+ , url
src/Servant/API/ContentTypes.hs+2
@@ -261,6 +261,7 @@ encodeFormUrlEncoded xs =
261261 let escape :: TextS.Text -> ByteString
262262 escape = cs . escapeURIString isUnreserved . cs
263263 encodePair :: (TextS.Text, TextS.Text) -> ByteString
264+ encodePair (k, "") = escape k
264265 encodePair (k, v) = escape k <> "=" <> escape v
265266 in B.intercalate "&" $ map encodePair xs
266267
@@ -275,6 +276,7 @@ decodeFormUrlEncoded q = do
275276 [k,v] -> return ( unescape k
276277 , unescape v
277278 )
279+ [k] -> return ( unescape k, "" )
278280 _ -> Left $ "not a valid pair: " <> cs p
279281 unescape :: TextS.Text -> TextS.Text
280282 unescape = cs . unEscapeString . cs . TextS.intercalate "%20" . TextS.splitOn "+"
test/Servant/API/ContentTypesSpec.hs+11−1
@@ -6,11 +6,12 @@
66module Servant.API.ContentTypesSpec where
77
88import Control.Applicative
9+import Control.Arrow
910import Data.Aeson
1011import Data.Function (on)
1112import Data.Proxy
1213
13−import Data.ByteString.Char8
14+import Data.ByteString.Char8 (ByteString, append, pack)
1415import qualified Data.ByteString.Lazy as BSL
1516import Data.List (maximumBy)
1617import Data.Maybe (fromJust, isJust, isNothing)
@@ -19,6 +20,7 @@ import Data.String.Conversions (cs)
1920import qualified Data.Text as TextS
2021import qualified Data.Text.Lazy as TextL
2122import GHC.Generics
23+import Network.URL (importParams, exportParams)
2224import Test.Hspec
2325import Test.QuickCheck
2426import Test.QuickCheck.Instances ()
@@ -44,6 +46,14 @@ spec = describe "Servant.API.ContentTypes" $ do
4446 let p = Proxy :: Proxy FormUrlEncoded
4547 property $ \x -> fromByteString p (toByteString p x) == Right (x::[(TextS.Text,TextS.Text)])
4648
49+ it "has fromByteString reverse exportParams (Network.URL)" $ do
50+ let p = Proxy :: Proxy FormUrlEncoded
51+ property $ \x -> (fromByteString p . cs . exportParams . map (cs *** cs) $ x) == Right (x::[(TextS.Text,TextS.Text)])
52+
53+ it "has importParams (Network.URL) reverse toByteString" $ do
54+ let p = Proxy :: Proxy FormUrlEncoded
55+ property $ \x -> (fmap (map (cs *** cs)) . importParams . cs . toByteString p $ x) == Just (x::[(TextS.Text,TextS.Text)])
56+
4757 describe "The PlainText Content-Type type" $ do
4858
4959 it "has fromByteString reverse toByteString (lazy Text)" $ do