servant-aeson-specs-0.5.1.1: generic tests for aeson serialization in servant

Copyright(c) Plow Technologies, 2016
LicenseMIT
Maintainersoenkehahn@gmail.com, mchaver@gmail.com
StabilityAlpha
Safe HaskellNone
LanguageHaskell2010

Servant.Aeson.GenericSpecs

Contents

Description

If you're using servant with either servant-client or servant-server there will be types included in your APIs that servant will convert to and from JSON. (At least for most common APIs.) This module allows you to generically obtain test-suites for JSON serialization and deserialization of those types.

Here's an example:

>>> :set -XTypeOperators
>>> :set -XDataKinds
>>> :set -XDeriveGeneric
>>> import Servant.API
>>> import Test.Hspec (hspec)
>>> import GHC.Generics (Generic)
>>> import Data.Aeson (ToJSON, FromJSON)
>>> import Test.QuickCheck (Arbitrary(..), oneof)
>>> data Foo = Foo { a :: String, b :: Int } deriving (Eq, Show, Generic)
>>> instance FromJSON Foo
>>> instance ToJSON Foo
>>> :{
  instance Arbitrary Foo where
    arbitrary = Foo <$> arbitrary <*> arbitrary
:}
>>> data Bar = BarA | BarB { bar :: Bool } deriving (Eq, Show, Generic)
>>> instance FromJSON Bar
>>> instance ToJSON Bar
>>> :{
  instance Arbitrary Bar where
    arbitrary = oneof $
      pure BarA :
      (BarB <$> arbitrary) :
      []
:}
>>> type Api = "post" :> ReqBody '[JSON] Foo :> Get '[JSON] Bar
>>> let api = Proxy :: Proxy Api
>>> hspec $ apiRoundtripSpecs api

JSON encoding of Bar
  allows to encode values with aeson and read them back
JSON encoding of Foo
  allows to encode values with aeson and read them back

Finished in ... seconds
2 examples, 0 failures

Synopsis

Documentation

apiRoundtripSpecs :: HasGenericSpecs api => Proxy api -> Spec Source #

Allows to obtain roundtrip tests for JSON serialization for all types used in a servant api. It uses settings are not used in roundtripSpecs. There is no need to let the user pass cusomt settings. It automatically uses defaultSettings.

See also roundtripSpecs.

apiGoldenSpecs :: HasGenericSpecs api => Proxy api -> Spec Source #

Allows to obtain golden tests for JSON serialization for all types used in a servant api.

See also goldenSpecs.

apiGoldenSpecsWithSettings :: HasGenericSpecs api => Settings -> Proxy api -> Spec Source #

Same as apiGoldenSpecs, but allows custom settings.

apiSpecsWithSettings :: HasGenericSpecs api => Settings -> Proxy api -> Spec Source #

Same as apiSpecs, but allows custom settings.

usedTypes :: HasGenericSpecs api => Proxy api -> [TypeRep] Source #

Allows to retrieve a list of all used types in a servant api as TypeReps.

re-exports

data Proxy k t :: forall k. k -> * #

A concrete, poly-kinded proxy type

Constructors

Proxy 

Instances

Monad (Proxy *) 

Methods

(>>=) :: Proxy * a -> (a -> Proxy * b) -> Proxy * b #

(>>) :: Proxy * a -> Proxy * b -> Proxy * b #

return :: a -> Proxy * a #

fail :: String -> Proxy * a #

Functor (Proxy *) 

Methods

fmap :: (a -> b) -> Proxy * a -> Proxy * b #

(<$) :: a -> Proxy * b -> Proxy * a #

Applicative (Proxy *) 

Methods

pure :: a -> Proxy * a #

(<*>) :: Proxy * (a -> b) -> Proxy * a -> Proxy * b #

(*>) :: Proxy * a -> Proxy * b -> Proxy * b #

(<*) :: Proxy * a -> Proxy * b -> Proxy * a #

Foldable (Proxy *) 

Methods

fold :: Monoid m => Proxy * m -> m #

foldMap :: Monoid m => (a -> m) -> Proxy * a -> m #

foldr :: (a -> b -> b) -> b -> Proxy * a -> b #

foldr' :: (a -> b -> b) -> b -> Proxy * a -> b #

foldl :: (b -> a -> b) -> b -> Proxy * a -> b #

foldl' :: (b -> a -> b) -> b -> Proxy * a -> b #

foldr1 :: (a -> a -> a) -> Proxy * a -> a #

foldl1 :: (a -> a -> a) -> Proxy * a -> a #

toList :: Proxy * a -> [a] #

null :: Proxy * a -> Bool #

length :: Proxy * a -> Int #

elem :: Eq a => a -> Proxy * a -> Bool #

maximum :: Ord a => Proxy * a -> a #

minimum :: Ord a => Proxy * a -> a #

sum :: Num a => Proxy * a -> a #

product :: Num a => Proxy * a -> a #

Generic1 (Proxy *) 

Associated Types

type Rep1 (Proxy * :: * -> *) :: * -> * #

Methods

from1 :: Proxy * a -> Rep1 (Proxy *) a #

to1 :: Rep1 (Proxy *) a -> Proxy * a #

Alternative (Proxy *) 

Methods

empty :: Proxy * a #

(<|>) :: Proxy * a -> Proxy * a -> Proxy * a #

some :: Proxy * a -> Proxy * [a] #

many :: Proxy * a -> Proxy * [a] #

MonadPlus (Proxy *) 

Methods

mzero :: Proxy * a #

mplus :: Proxy * a -> Proxy * a -> Proxy * a #

Eq1 (Proxy *)

Since: 4.9.0.0

Methods

liftEq :: (a -> b -> Bool) -> Proxy * a -> Proxy * b -> Bool #

Ord1 (Proxy *)

Since: 4.9.0.0

Methods

liftCompare :: (a -> b -> Ordering) -> Proxy * a -> Proxy * b -> Ordering #

Read1 (Proxy *)

Since: 4.9.0.0

Methods

liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (Proxy * a) #

liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [Proxy * a] #

Show1 (Proxy *)

Since: 4.9.0.0

Methods

liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Proxy * a -> ShowS #

liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Proxy * a] -> ShowS #

Bounded (Proxy k s) 

Methods

minBound :: Proxy k s #

maxBound :: Proxy k s #

Enum (Proxy k s) 

Methods

succ :: Proxy k s -> Proxy k s #

pred :: Proxy k s -> Proxy k s #

toEnum :: Int -> Proxy k s #

fromEnum :: Proxy k s -> Int #

enumFrom :: Proxy k s -> [Proxy k s] #

enumFromThen :: Proxy k s -> Proxy k s -> [Proxy k s] #

enumFromTo :: Proxy k s -> Proxy k s -> [Proxy k s] #

enumFromThenTo :: Proxy k s -> Proxy k s -> Proxy k s -> [Proxy k s] #

Eq (Proxy k s) 

Methods

(==) :: Proxy k s -> Proxy k s -> Bool #

(/=) :: Proxy k s -> Proxy k s -> Bool #

Ord (Proxy k s) 

Methods

compare :: Proxy k s -> Proxy k s -> Ordering #

(<) :: Proxy k s -> Proxy k s -> Bool #

(<=) :: Proxy k s -> Proxy k s -> Bool #

(>) :: Proxy k s -> Proxy k s -> Bool #

(>=) :: Proxy k s -> Proxy k s -> Bool #

max :: Proxy k s -> Proxy k s -> Proxy k s #

min :: Proxy k s -> Proxy k s -> Proxy k s #

Read (Proxy k s) 
Show (Proxy k s) 

Methods

showsPrec :: Int -> Proxy k s -> ShowS #

show :: Proxy k s -> String #

showList :: [Proxy k s] -> ShowS #

Ix (Proxy k s) 

Methods

range :: (Proxy k s, Proxy k s) -> [Proxy k s] #

index :: (Proxy k s, Proxy k s) -> Proxy k s -> Int #

unsafeIndex :: (Proxy k s, Proxy k s) -> Proxy k s -> Int

inRange :: (Proxy k s, Proxy k s) -> Proxy k s -> Bool #

rangeSize :: (Proxy k s, Proxy k s) -> Int #

unsafeRangeSize :: (Proxy k s, Proxy k s) -> Int

Generic (Proxy k t) 

Associated Types

type Rep (Proxy k t) :: * -> * #

Methods

from :: Proxy k t -> Rep (Proxy k t) x #

to :: Rep (Proxy k t) x -> Proxy k t #

Monoid (Proxy k s) 

Methods

mempty :: Proxy k s #

mappend :: Proxy k s -> Proxy k s -> Proxy k s #

mconcat :: [Proxy k s] -> Proxy k s #

FromJSON (Proxy k a) 

Methods

parseJSON :: Value -> Parser (Proxy k a) #

parseJSONList :: Value -> Parser [Proxy k a] #

ToJSON (Proxy k a) 

Methods

toJSON :: Proxy k a -> Value #

toEncoding :: Proxy k a -> Encoding #

toJSONList :: [Proxy k a] -> Value #

toEncodingList :: [Proxy k a] -> Encoding #

type Rep1 (Proxy *) 
type Rep1 (Proxy *) = D1 (MetaData "Proxy" "Data.Proxy" "base" False) (C1 (MetaCons "Proxy" PrefixI False) U1)
type Rep (Proxy k t) 
type Rep (Proxy k t) = D1 (MetaData "Proxy" "Data.Proxy" "base" False) (C1 (MetaCons "Proxy" PrefixI False) U1)

data GoldenDirectoryOption :: * #

A custom directory name or a preselected directory name.

data Settings :: * #

Constructors

Settings 

Fields

defaultSettings :: Settings #

The default settings for general use cases.