highjson-swagger-0.3.0.0: test/Data/HighJson/SwaggerSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.HighJson.SwaggerSpec
( spec )
where
import Data.HighJson
import Data.HighJson.Swagger
import Data.Swagger
import Test.Hspec
import Test.QuickCheck hiding (Success)
import qualified Data.Text as T
data SomeDummy
= SomeDummy
{ sd_int :: Int
, sd_bool :: Bool
, sd_text :: T.Text
, sd_either :: Either Bool T.Text
, sd_maybe :: Maybe Int
} deriving (Show, Eq)
someDummySpec :: HighSpec SomeDummy '[Int, Bool, T.Text, Either Bool T.Text, Maybe Int]
someDummySpec =
recSpec "Some Dummy" Nothing SomeDummy $
"int" .= sd_int
:+: "bool" .= sd_bool
:+: "text" .= sd_text
:+: "either" .= sd_either
:+: "maybe" .=? sd_maybe
:+: RFEmpty
instance ToJSON SomeDummy where
toJSON = jsonSerializer someDummySpec
toEncoding = jsonEncoder someDummySpec
newtype SomeText = SomeText { unSomeText :: T.Text }
instance Arbitrary SomeText where
arbitrary = SomeText . T.pack <$> listOf1 (choose ('A', 'Z'))
instance Arbitrary SomeDummy where
arbitrary =
SomeDummy
<$> arbitrary
<*> arbitrary
<*> (unSomeText <$> arbitrary)
<*> ebt
<*> arbitrary
where
ebt =
do v <- arbitrary
case v of
Left b -> pure (Left b)
Right (SomeText t) -> pure (Right t)
instance ToSchema SomeDummy where
declareNamedSchema p = makeDeclareNamedSchema someDummySpec p
spec :: Spec
spec =
it "schema and serializer match" $ property $ \(t :: SomeDummy) ->
validateToJSON t `shouldBe` []