packages feed

servant-routes-0.1.0.0: test/Servant/API/Routes/ResponseSpec.hs

module Servant.API.Routes.ResponseSpec
  ( spec
  )
where

import qualified Data.Set as Set
import "this" Servant.API.Routes.HeaderSpec (sampleReps)
import Servant.API.Routes.Internal.Response
import "this" Servant.API.Routes.SomeSpec hiding (spec)
import Servant.API.Routes.Util
import Test.Hspec as H
import Test.Hspec.QuickCheck as H
import Test.QuickCheck as Q

{- hlint ignore "Monoid law, right identity" -}
{- hlint ignore "Monoid law, left identity" -}
{- hlint ignore "Use fold" -}

instance Q.Arbitrary Responses where
  arbitrary = Responses <$> genSome arbitrary
  shrink = unResponses (shrinkSome shrink)

instance Q.Arbitrary Response where
  arbitrary = do
    _responseType <- Q.elements [intTypeRep, strTypeRep, unitTypeRep]
    _responseHeaders <- Set.fromList <$> Q.sublistOf sampleReps
    pure Response {..}
  shrink =
    responseHeaders $
      fmap Set.fromList . Q.shrinkList (const []) . Set.toList

spec :: Spec
spec = do
  describe "Semigroup/Monoid laws" $ do
    prop "Associativity" $ do
      \(x :: Responses, y, z) -> x <> (y <> z) === (x <> y) <> z
    prop "Right identity" $
      \(x :: Responses) -> x <> mempty === x
    prop "Left identity" $ do
      \(x :: Responses) -> mempty <> x === x
    prop "Concatentation" $ do
      \(xs :: [Responses]) -> mconcat xs === foldr (<>) mempty xs