http-media-0.1.0: test/Network/HTTP/Media/Tests.hs
------------------------------------------------------------------------------
module Network.HTTP.Media.Tests (tests) where
------------------------------------------------------------------------------
import Control.Monad (replicateM)
import Data.ByteString.UTF8 (fromString)
import Data.List (intercalate)
import Data.Map (empty)
import Data.Maybe (isNothing)
import Data.Word (Word16)
import Distribution.TestSuite.QuickCheck
import Test.QuickCheck
------------------------------------------------------------------------------
import Network.HTTP.Media hiding (parameters, subType)
import Network.HTTP.Media.MediaType.Gen
import Network.HTTP.Media.MediaType.Internal
import Network.HTTP.Media.Quality
------------------------------------------------------------------------------
tests :: [Test]
tests =
[ testParse
, testMatch
, testMap
]
------------------------------------------------------------------------------
testParse :: Test
testParse = testGroup "parseAccept"
[ testProperty "Without quality" $ do
media <- medias
return $
parseAccept (group media) == Just (map maxQuality media)
, testProperty "With quality" $ do
media <- medias >>= mapM (flip fmap (choose (0, 1000)) . Quality)
return $ parseAccept (group media) == Just media
]
where
medias = listOf1 genMediaType
group media = fromString $ intercalate "," (map show media)
------------------------------------------------------------------------------
testMatch :: Test
testMatch = testGroup "match"
[ testProperty "Highest quality" $ do
server <- genServer
qs <- replicateM (length server) $ choose (1, 1000)
let client = zipWith Quality server qs
qmax v q = if qualityValue q > qualityValue v then q else v
return $ matchAccept server client ==
Just (qualityData $ foldr1 qmax client)
, testProperty "Most specific" $ do
media <- genConcreteMediaType
let client = map maxQuality
[ MediaType "*" "*" empty
, media { subType = "*" }
, media { parameters = empty }
, media
]
return $ matchAccept [media] client == Just media
, testProperty "Nothing" $ do
server <- genServer
client <- listOf1 $ genDiffMediaTypesWith genConcreteMediaType server
let client' = filter (not . flip any server . matches) client
return . isNothing $ matchAccept server (map maxQuality client')
, testProperty "Never chooses q=0" $ do
server <- genServer
return . isNothing $ matchAccept server (map minQuality server)
, testProperty "Left biased" $ do
server <- genServer
let client = map maxQuality server
return $ matchAccept server client == Just (head server)
, testProperty "Against */*" $ do
server <- genServer
return $ matchAccept server [maxQuality "*/*"] == Just (head server)
, testProperty "Against type/*" $ do
server <- genServer
let client = [maxQuality (subStarOf $ head server)]
return $ matchAccept server client == Just (head server)
]
------------------------------------------------------------------------------
testMap :: Test
testMap = testGroup "map"
[ testProperty "Matches" $ do
server <- genServer
qs <- replicateM (length server) $ choose (1, 1000 :: Word16)
let client = zipWith Quality server qs
qmax q v = if qualityValue q >= qualityValue v then q else v
zipped = zip server server
return $ mapAccept zipped client ==
Just (qualityData $ foldr1 qmax client)
, testProperty "Nothing" $ do
server <- genServer
client <- listOf1 $ genDiffMediaTypesWith genConcreteMediaType server
let zipped = zip server $ repeat ()
return . isNothing $ mapAccept zipped (map maxQuality client)
]
------------------------------------------------------------------------------
genServer :: Gen [MediaType]
genServer = listOf1 genConcreteMediaType