module TestPathInfo where
import Data.Text (Text)
import Data.ByteString (ByteString)
import Network.HTTP.Client (method)
import Servant
import Servant.API.PathInfo
import Test.QuickCheck.Monadic (PropertyM (..), assert, monadicIO)
import Test.Tasty
import TestLib (returns400, success)
import qualified Network.HTTP.Simple as S
import qualified Test.Tasty.QuickCheck as QC
type PathInfoAPI =
"merlin" :> "check-path-info" :> PathInfo :> Get '[JSON] NoContent
:<|> "check-path-info" :> PathInfo :> Get '[JSON] NoContent
pathInfoServer :: Server PathInfoAPI
pathInfoServer = pathInfo :<|> pathInfo
where
pathInfo :: [Text] -> Handler NoContent
pathInfo pInfo = do
case elem "merlin" pInfo of
False -> throwError err400 {errBody = "Merlin was not found in the path info list."}
True -> pure NoContent
pathInfoProps :: Int -> TestTree
pathInfoProps port =
testGroup
"PathInfo"
[ QC.testProperty "Requests to the merlin/check-path-info should succeed with a 200" $
monadicIO $ do
result <- (fetchEndpoint port "/merlin") >>= success
assert $ result == True
, QC.testProperty "Requests to just /check-path-info should fail with a 400" $
monadicIO $ do
result <- (fetchEndpoint port "") >>= returns400
assert $ result == True
]
where
fetchEndpoint :: Int -> String -> PropertyM IO (S.Response ByteString)
fetchEndpoint port' urlPrefix = do
let initReq =
S.parseRequest_ $
"http://localhost:"
<> (show port')
<> urlPrefix
<> "/check-path-info"
req = initReq {method = "GET"}
in do
resp <- S.httpBS req
pure resp