mig-0.2.0.0: test/Test/Api.hs
module Test.Api (spec) where
import Data.Map.Strict qualified as Map
import Data.Text (Text)
import Mig.Core.Api
import Test.Hspec
spec :: Spec
spec = describe "api" $ do
checkRoutes
checkCaptures
checkFlatApi
notFound :: (Show a, Eq a) => Maybe a -> Expectation
notFound a = a `shouldBe` Nothing
-- static routes
checkRoutes :: Spec
checkRoutes = do
it "enter route (positive cases)" $ do
getPath ["api", "v1", "hello"] helloApi `shouldBe` Just ("hello", mempty)
getPath ["api", "v1", "bye"] helloApi `shouldBe` Just ("bye", mempty)
it "enter route (negative cases)" $
mapM_
notFound
[ getPath ["api", "v1"] helloApi
, getPath [] helloApi
, getPath ["api", "v1", "hello", "there"] helloApi
, getPath ["api", "v1"] (mempty @(Api Text))
, getPath [] (mempty @(Api Text))
]
helloApi :: Api Text
helloApi =
WithPath "api/v1" $
mconcat
[ WithPath "hello" (HandleRoute "hello")
, WithPath "bye" (HandleRoute "bye")
]
-- captures
checkCaptures :: Spec
checkCaptures = do
it "captures (positive cases)" $ do
getPath ["api", "capture1", "hello"] captureApi
`shouldBe` Just ("capture1", Map.fromList [("name1", "hello")])
getPath ["api", "capture2", "hello", "bye"] captureApi
`shouldBe` Just ("capture2", Map.fromList [("name1", "hello"), ("name2", "bye")])
it "captures (negative cases)" $
mapM_
(notFound . flip getPath captureApi)
[ ["api", "capture1"]
, ["api", "capture2", "hello"]
, ["api", "capture2", "hello", "bye", "error"]
]
captureApi :: Api Text
captureApi =
WithPath "api" $
mconcat
[ WithPath ("capture1" <> Path [CapturePath "name1"]) (HandleRoute "capture1")
, WithPath ("capture2" <> Path [CapturePath "name1", CapturePath "name2"]) (HandleRoute "capture2")
]
-- flat api
checkFlatApi :: Spec
checkFlatApi =
it "flat api" $
flatApi helloApi
`shouldBe` [ ("api/v1/hello", "hello")
, ("api/v1/bye", "bye")
]