| License | BSD3 |
|---|---|
| Maintainer | Nickolay Kudasov <[email protected]> |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Servant.Swagger.Test
Description
Automatic tests for servant API against Swagger spec.
Documentation
validateEveryToJSON :: forall proxy api. TMap (Every `[Typeable, Show, Arbitrary, ToJSON, ToSchema]`) (BodyTypes JSON api) => proxy api -> Spec Source
Verify that every type used with content type in a servant API
has compatible JSON and ToJSON instances using ToSchema.validateToJSON
will produce one validateEveryToJSON specification for every type in the API.
Each type only gets one test, even if it occurs multiple times in the API.prop
>>>data User = User { name :: String, age :: Maybe Int } deriving (Show, Generic, Typeable)>>>newtype UserId = UserId String deriving (Show, Generic, Typeable, ToJSON, Arbitrary)>>>instance ToJSON User>>>instance ToSchema User>>>instance ToSchema UserId>>>instance Arbitrary User where arbitrary = User <$> arbitrary <*> arbitrary>>>type UserAPI = (Capture "user_id" UserId :> Get '[JSON] User) :<|> (ReqBody '[JSON] User :> Post '[JSON] UserId)
>>>hspec $ context "ToJSON matches ToSchema" $ validateEveryToJSON (Proxy :: Proxy UserAPI)ToJSON matches ToSchema User UserId Finished in ... seconds 2 examples, 0 failures
For the test to compile all body types should have the following instances:
andToJSONare used to perform the validation;ToSchemais used to name the test for each type;Typeableis used to display value for whichShowdoes not satisfyToJSON.ToSchemais used to arbitrarily generate values.Arbitrary
If any of the instances is missing, you'll get a descriptive type error:
>>>data Contact = Contact { fullname :: String, phone :: Integer } deriving (Show, Generic)>>>instance ToJSON Contact>>>instance ToSchema Contact>>>type ContactAPI = Get '[JSON] Contact>>>hspec $ validateEveryToJSON (Proxy :: Proxy ContactAPI)... No instance for (Arbitrary Contact) arising from a use of ‘validateEveryToJSON’ ...