packages feed

servant-validate-0.1.0.0: test/Spec.hs

{-# LANGUAGE DataKinds              #-}
{-# LANGUAGE TypeApplications       #-}
{-# LANGUAGE TypeOperators          #-}
{-# OPTIONS_GHC -fdefer-type-errors #-}

import Test.Hspec (hspec, describe, it)
import Test.ShouldNotTypecheck (shouldNotTypecheck)

import           Data.Proxy
import           Servant.API
import           Servant.Validate

type TestApi = "hello" :> Get '[] ()
          :<|> "ok" :> "bye" :> Get '[] ()
          :<|> "ok" :> "what" :> Get '[] ()
          :<|> "ok" :> "bye" :> Post '[] ()
          :<|> "ok" :> "bye" :> Get '[] ()

testApi :: Proxy TestApi
testApi = Proxy

validTestApi :: ValidApiTree TestApi
validTestApi = validApiTree testApi

data DeadlySinEnum = Lust | Gluttony | Greed | Sloth | Wrath | Envy | Pride

type MathApi  = "sin" :> ReqBody '[JSON] Double        :> Post '[JSON] NoContent
type SatanApi = "sin" :> ReqBody '[JSON] DeadlySinEnum :> Post '[JSON] NoContent

type MyApi = MathApi :<|> SatanApi

myApi :: Proxy MyApi
myApi = Proxy

validMyApi :: ValidApiTree MyApi
validMyApi = validApiTree myApi

main :: IO ()
main = hspec $ do
  describe "Servant" $ do
    it "should not allow overlapping routes" $
      shouldNotTypecheck validMyApi
    it "should not allow overlapping routes (nested)" $
      shouldNotTypecheck validTestApi