From e5974ec94d33bd6fce3a993a00ea2500eb67177b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Hahn?= Date: Sat, 16 Jan 2016 19:17:46 +0100 Subject: [PATCH] add ComprehensiveAPI to test whether we're missing instances Some of the combinators are commented atm, because we *are* missing combinators. --- servant-client/test/Servant/ClientSpec.hs | 3 ++ servant-docs/test/Servant/DocsSpec.hs | 18 ++++++++++- servant-js/test/Servant/JSSpec.hs | 7 ++++ servant-mock/servant-mock.cabal | 15 +++++++++ servant-mock/test/Servant/MockSpec.hs | 12 +++++++ servant-mock/test/Spec.hs | 1 + servant-server/test/Servant/ServerSpec.hs | 4 +++ servant/servant.cabal | 1 + .../API/Internal/Test/ComprehensiveAPI.hs | 32 +++++++++++++++++++ 9 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 servant-mock/test/Servant/MockSpec.hs create mode 100644 servant-mock/test/Spec.hs create mode 100644 servant/src/Servant/API/Internal/Test/ComprehensiveAPI.hs diff --git a/servant-client/test/Servant/ClientSpec.hs b/servant-client/test/Servant/ClientSpec.hs index 245a7216..06cf7caa 100644 --- a/servant-client/test/Servant/ClientSpec.hs +++ b/servant-client/test/Servant/ClientSpec.hs @@ -49,9 +49,12 @@ import Test.HUnit import Test.QuickCheck import Servant.API +import Servant.API.Internal.Test.ComprehensiveAPI import Servant.Client import Servant.Server +_ = client comprehensiveAPI + spec :: Spec spec = describe "Servant.Client" $ do sucessSpec diff --git a/servant-docs/test/Servant/DocsSpec.hs b/servant-docs/test/Servant/DocsSpec.hs index 2c7e87b0..e49aeaa1 100644 --- a/servant-docs/test/Servant/DocsSpec.hs +++ b/servant-docs/test/Servant/DocsSpec.hs @@ -1,7 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeOperators #-} @@ -18,8 +18,24 @@ import GHC.Generics import Test.Hspec import Servant.API +import Servant.API.Internal.Test.ComprehensiveAPI import Servant.Docs.Internal +-- * comprehensive api + +_ = docs comprehensiveAPI + +instance ToParam (QueryParam "foo" Int) where + toParam = error "unused" +instance ToParam (QueryParams "foo" Int) where + toParam = error "unused" +instance ToParam (QueryFlag "foo") where + toParam = error "unused" +instance ToCapture (Capture "foo" Int) where + toCapture = error "unused" + +-- * specs + spec :: Spec spec = describe "Servant.Docs" $ do diff --git a/servant-js/test/Servant/JSSpec.hs b/servant-js/test/Servant/JSSpec.hs index 23fe4326..4249e930 100644 --- a/servant-js/test/Servant/JSSpec.hs +++ b/servant-js/test/Servant/JSSpec.hs @@ -21,6 +21,7 @@ import qualified Data.Text as T import Language.ECMAScript3.Parser (program, parse) import Test.Hspec hiding (shouldContain, shouldNotContain) +import Servant.API.Internal.Test.ComprehensiveAPI import Servant.JS import Servant.JS.Internal import qualified Servant.JS.Angular as NG @@ -29,6 +30,12 @@ import qualified Servant.JS.JQuery as JQ import qualified Servant.JS.Vanilla as JS import Servant.JSSpec.CustomHeaders +-- * comprehensive api + +_ = (jsForAPI comprehensiveAPI vanillaJS :: Text) + +-- * specs + type TestAPI = "simple" :> ReqBody '[JSON,FormUrlEncoded] Text :> Post '[JSON] Bool :<|> "has.extension" :> Get '[FormUrlEncoded,JSON] Bool diff --git a/servant-mock/servant-mock.cabal b/servant-mock/servant-mock.cabal index af444527..5c2470a3 100644 --- a/servant-mock/servant-mock.cabal +++ b/servant-mock/servant-mock.cabal @@ -45,3 +45,18 @@ executable mock-app buildable: True else buildable: False + +test-suite spec + type: exitcode-stdio-1.0 + ghc-options: + -Wall -fno-warn-name-shadowing + default-language: Haskell2010 + hs-source-dirs: test + main-is: Spec.hs + other-modules: + Servant.MockSpec + build-depends: + base, + hspec, + servant, + servant-mock diff --git a/servant-mock/test/Servant/MockSpec.hs b/servant-mock/test/Servant/MockSpec.hs new file mode 100644 index 00000000..c7d08307 --- /dev/null +++ b/servant-mock/test/Servant/MockSpec.hs @@ -0,0 +1,12 @@ + +module Servant.MockSpec where + +import Test.Hspec + +import Servant.API.Internal.Test.ComprehensiveAPI +import Servant.Mock + +_ = mock comprehensiveAPI + +spec :: Spec +spec = return () diff --git a/servant-mock/test/Spec.hs b/servant-mock/test/Spec.hs new file mode 100644 index 00000000..a824f8c3 --- /dev/null +++ b/servant-mock/test/Spec.hs @@ -0,0 +1 @@ +{-# OPTIONS_GHC -F -pgmF hspec-discover #-} diff --git a/servant-server/test/Servant/ServerSpec.hs b/servant-server/test/Servant/ServerSpec.hs index e4069b0f..aee31d19 100644 --- a/servant-server/test/Servant/ServerSpec.hs +++ b/servant-server/test/Servant/ServerSpec.hs @@ -46,6 +46,7 @@ import Servant.API ((:<|>) (..), (:>), Capture, Delete, QueryFlag, QueryParam, QueryParams, Raw, RemoteHost, ReqBody, StdMethod (..), Verb, addHeader) +import Servant.API.Internal.Test.ComprehensiveAPI import Servant.Server (ServantErr (..), Server, err404, serve) import Test.Hspec (Spec, context, describe, it, @@ -60,6 +61,9 @@ import Servant.Server.Internal.Router (tweakResponse, runRouter, Router, Router'(LeafRouter)) +-- * comprehensive api test + +_ = serve comprehensiveAPI (error "unused") (error "unused") -- * Specs diff --git a/servant/servant.cabal b/servant/servant.cabal index 451eb166..527d5b00 100644 --- a/servant/servant.cabal +++ b/servant/servant.cabal @@ -31,6 +31,7 @@ library Servant.API.ContentTypes Servant.API.Header Servant.API.HttpVersion + Servant.API.Internal.Test.ComprehensiveAPI Servant.API.IsSecure Servant.API.QueryParam Servant.API.Raw diff --git a/servant/src/Servant/API/Internal/Test/ComprehensiveAPI.hs b/servant/src/Servant/API/Internal/Test/ComprehensiveAPI.hs new file mode 100644 index 00000000..1e5d9748 --- /dev/null +++ b/servant/src/Servant/API/Internal/Test/ComprehensiveAPI.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE TypeOperators #-} + +module Servant.API.Internal.Test.ComprehensiveAPI where + +import Data.Proxy + +import Servant.API + +type GET = Get '[JSON] () + +type ComprehensiveAPI = + GET :<|> + Get '[JSON] Int :<|> + Capture "foo" Int :> GET :<|> + Header "foo" Int :> GET :<|> +-- HttpVersion :> GET :<|> + IsSecure :> GET :<|> + QueryParam "foo" Int :> GET :<|> + QueryParams "foo" Int :> GET :<|> + QueryFlag "foo" :> GET :<|> +-- Raw :<|> +-- RemoteHost :<|> + ReqBody '[JSON] Int :> GET :<|> +-- Get '[JSON] (Headers '[Header "foo" Int] ()) :<|> + "foo" :> GET :<|> + Vault :> GET :<|> + Verb 'POST 204 '[JSON] () :<|> + Verb 'POST 204 '[JSON] Int + +comprehensiveAPI :: Proxy ComprehensiveAPI +comprehensiveAPI = Proxy