@@ -5,14 +5,17 @@ module Web.Internal.HttpApiDataSpec (spec) where
5import Control.Applicative
5import Control.Applicative
6import qualified Data.Fixed as F
6import qualified Data.Fixed as F
7import Data.Int
7import Data.Int
8import Data.Word
9import Data.Word
9import Data.Time
10import Data.Time
10import qualified Data.Text as T
11import qualified Data.Text as T
12+import qualified Data.Text.Encoding as TE
11import qualified Data.Text.Lazy as L
13import qualified Data.Text.Lazy as L
12import qualified Data.ByteString as BS
14import qualified Data.ByteString as BS
13import Data.ByteString.Builder (toLazyByteString)
15import Data.ByteString.Builder (toLazyByteString)
14import Data.Version
16import Data.Version
15import qualified Data.UUID.Types as UUID
17import qualified Data.UUID.Types as UUID
18+import Web.Cookie (SetCookie, defaultSetCookie, setCookieName, setCookieValue)
17import Data.Proxy
20import Data.Proxy
@@ -40,30 +43,24 @@ import Web.Internal.TestInstances
40encodedUrlPieceProp :: ToHttpApiData a => a -> Property
43encodedUrlPieceProp :: ToHttpApiData a => a -> Property
41encodedUrlPieceProp x = toLazyByteString (toEncodedUrlPiece (toUrlPiece x)) === toLazyByteString (toEncodedUrlPiece x)
44encodedUrlPieceProp x = toLazyByteString (toEncodedUrlPiece (toUrlPiece x)) === toLazyByteString (toEncodedUrlPiece x)
43−
46+-- | Check 'ToHttpApiData' and 'FromHttpApiData' compatibility
44checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
47checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
45−checkUrlPiece _ name = prop name (toUrlPiece <=> parseUrlPiece :: a -> Property)
48+checkUrlPiece _ = checkUrlPiece' (arbitrary :: Gen a)
47−-- | Check with given generator
48checkUrlPiece' :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a) => Gen a -> String -> Spec
50checkUrlPiece' :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a) => Gen a -> String -> Spec
51+checkUrlPiece' gen name = describe name $ do
49−checkUrlPiece' gen name = prop name $ forAll gen (toUrlPiece <=> parseUrlPiece)
52+ prop "toUrlPiece <=> parseUrlPiece" $ forAll gen (toUrlPiece <=> parseUrlPiece :: a -> Property)
53+ prop "toQueryParam <=> parseQueryParam" $ forAll gen (toQueryParam <=> parseQueryParam :: a -> Property)
54+ prop "toHeader <=> parseHeader" $ forAll gen (toHeader <=> parseHeader :: a -> Property)
55+ prop "toEncodedUrlPiece encodes correctly" $ forAll gen encodedUrlPieceProp
51-- | Check case insensitivity for @parseUrlPiece@.
57-- | Check case insensitivity for @parseUrlPiece@.
52checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
58checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
53checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
59checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
55−-- | Check that 'toEncodedUrlPiece' is equivallent to default implementation.
56−checkEncodedUrlPiece :: forall a. (Show a, ToHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
57−checkEncodedUrlPiece _ = checkEncodedUrlPiece' (arbitrary :: Gen a)
59−-- | Check that 'toEncodedUrlPiece' is equivallent to default implementation.
60−-- Use a given generator.
61−checkEncodedUrlPiece' :: forall a. (Show a, ToHttpApiData a) => Gen a -> String -> Spec
62−checkEncodedUrlPiece' gen name = prop name $ forAll gen encodedUrlPieceProp
64spec :: Spec
61spec :: Spec
66− describe "toUrlPiece <=> parseUrlPiece" $ do
63+ describe "Instances" $ do
67 checkUrlPiece (Proxy :: Proxy ()) "()"
64 checkUrlPiece (Proxy :: Proxy ()) "()"
68 checkUrlPiece (Proxy :: Proxy Char) "Char"
65 checkUrlPiece (Proxy :: Proxy Char) "Char"
69 checkUrlPieceI (Proxy :: Proxy Bool) "Bool"
66 checkUrlPieceI (Proxy :: Proxy Bool) "Bool"
@@ -90,6 +87,15 @@ spec = do
90 checkUrlPiece' nominalDiffTimeGen "NominalDiffTime"
87 checkUrlPiece' nominalDiffTimeGen "NominalDiffTime"
91 checkUrlPiece (Proxy :: Proxy Version) "Version"
88 checkUrlPiece (Proxy :: Proxy Version) "Version"
92 checkUrlPiece' uuidGen "UUID"
89 checkUrlPiece' uuidGen "UUID"
90+ checkUrlPiece' setCookieGen "Cookie"
92+ checkUrlPiece (Proxy :: Proxy F.Uni) "Uni"
93+ checkUrlPiece (Proxy :: Proxy F.Deci) "Deci"
94+ checkUrlPiece (Proxy :: Proxy F.Centi) "Centi"
95+ checkUrlPiece (Proxy :: Proxy F.Milli) "Milli"
96+ checkUrlPiece (Proxy :: Proxy F.Micro) "Micro"
97+ checkUrlPiece (Proxy :: Proxy F.Nano) "Nano"
98+ checkUrlPiece (Proxy :: Proxy F.Pico) "Pico"
94 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
100 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
95 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
101 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
@@ -100,51 +106,6 @@ spec = do
100 checkUrlPiece (Proxy :: Proxy Natural) "Natural"
106 checkUrlPiece (Proxy :: Proxy Natural) "Natural"
103− describe "toEncodedUrlPiece encodes correctly" $ do
104− checkEncodedUrlPiece (Proxy :: Proxy ()) "()"
105− checkEncodedUrlPiece (Proxy :: Proxy Char) "Char"
106− checkEncodedUrlPiece (Proxy :: Proxy Bool) "Bool"
107− checkEncodedUrlPiece (Proxy :: Proxy Ordering) "Ordering"
108− checkEncodedUrlPiece (Proxy :: Proxy Int) "Int"
109− checkEncodedUrlPiece (Proxy :: Proxy Int8) "Int8"
110− checkEncodedUrlPiece (Proxy :: Proxy Int16) "Int16"
111− checkEncodedUrlPiece (Proxy :: Proxy Int32) "Int32"
112− checkEncodedUrlPiece (Proxy :: Proxy Int64) "Int64"
113− checkEncodedUrlPiece (Proxy :: Proxy Integer) "Integer"
114− checkEncodedUrlPiece (Proxy :: Proxy Word) "Word"
115− checkEncodedUrlPiece (Proxy :: Proxy Word8) "Word8"
116− checkEncodedUrlPiece (Proxy :: Proxy Word16) "Word16"
117− checkEncodedUrlPiece (Proxy :: Proxy Word32) "Word32"
118− checkEncodedUrlPiece (Proxy :: Proxy Word64) "Word64"
119− checkEncodedUrlPiece (Proxy :: Proxy String) "String"
120− checkEncodedUrlPiece (Proxy :: Proxy T.Text) "Text.Strict"
121− checkEncodedUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy"
122− checkEncodedUrlPiece (Proxy :: Proxy Day) "Day"
123− checkEncodedUrlPiece' timeOfDayGen "TimeOfDay"
124− checkEncodedUrlPiece' localTimeGen "LocalTime"
125− checkEncodedUrlPiece' zonedTimeGen "ZonedTime"
126− checkEncodedUrlPiece' utcTimeGen "UTCTime"
127− checkEncodedUrlPiece' nominalDiffTimeGen "NominalDiffTime"
128− checkEncodedUrlPiece (Proxy :: Proxy Version) "Version"
129− checkEncodedUrlPiece' uuidGen "UUID"
131− checkEncodedUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
132− checkEncodedUrlPiece (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
133− checkEncodedUrlPiece (Proxy :: Proxy (Either Integer T.Text)) "Either Integer Text"
134− checkEncodedUrlPiece (Proxy :: Proxy (Either Version Day)) "Either Version Day"
136−#if MIN_VERSION_base(4,8,0)
137− checkEncodedUrlPiece (Proxy :: Proxy Natural) "Natural"
140− checkEncodedUrlPiece (Proxy :: Proxy F.Uni) "Uni"
141− checkEncodedUrlPiece (Proxy :: Proxy F.Deci) "Deci"
142− checkEncodedUrlPiece (Proxy :: Proxy F.Centi) "Centi"
143− checkEncodedUrlPiece (Proxy :: Proxy F.Milli) "Milli"
144− checkEncodedUrlPiece (Proxy :: Proxy F.Micro) "Micro"
145− checkEncodedUrlPiece (Proxy :: Proxy F.Nano) "Nano"
146− checkEncodedUrlPiece (Proxy :: Proxy F.Pico) "Pico"
148 it "bad integers are rejected" $ do
109 it "bad integers are rejected" $ do
149 parseUrlPieceMaybe (T.pack "123hello") `shouldBe` (Nothing :: Maybe Int)
110 parseUrlPieceMaybe (T.pack "123hello") `shouldBe` (Nothing :: Maybe Int)
@@ -179,3 +140,9 @@ utcTimeGen = UTCTime <$> arbitrary <*> fmap fromInteger (choose (0, 86400))
180nominalDiffTimeGen :: Gen NominalDiffTime
141nominalDiffTimeGen :: Gen NominalDiffTime
181nominalDiffTimeGen = fromInteger <$> arbitrary
142nominalDiffTimeGen = fromInteger <$> arbitrary
144+setCookieGen :: Gen SetCookie
146+ n <- TE.encodeUtf8 . T.pack . filter isAlphaNum <$> arbitrary
147+ v <- TE.encodeUtf8 . T.pack . filter isAlphaNum <$> arbitrary
148+ return $ defaultSetCookie { setCookieName = n, setCookieValue = v }