summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/test/Minilang/ServerSpec.hs')
-rw-r--r--lambda-calcul/haskell/test/Minilang/ServerSpec.hs20
1 files changed, 18 insertions, 2 deletions
diff --git a/lambda-calcul/haskell/test/Minilang/ServerSpec.hs b/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
index 309ded8..6a25ec5 100644
--- a/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
+++ b/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
@@ -1,15 +1,31 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+
module Minilang.ServerSpec where
+import Data.Aeson (eitherDecode, FromJSON)
+import Minilang.API (Score)
import Minilang.Server (serveAPI)
import Network.Wai (Application)
import Test.Hspec (Spec, it)
-import Test.Hspec.Wai (get, shouldRespondWith, with)
+import Test.Hspec.Wai (get, matchBody, shouldRespondWith, with)
+import Test.Hspec.Wai.Matcher (MatchBody (..))
+import Data.Data (Proxy (..))
spec :: Spec
spec = with app $
it "GET /api/leaderboard returns empty list of scores" $ do
get "/api/leaderboard"
- `shouldRespondWith` "[]"
+ `shouldRespondWith` 200 {matchBody = arrayOfLengthOf (Proxy @Score) 2}
+
+arrayOfLengthOf :: forall elem proxy . (FromJSON elem) => proxy elem -> Int -> MatchBody
+arrayOfLengthOf _ len = MatchBody $ \_ actual ->
+ case eitherDecode actual of
+ Right (scores :: [elem]) ->
+ if length scores == len
+ then Nothing
+ else Just $ "Expected array of length " ++ show len ++ ", but got " ++ show (length scores)
+ Left err -> Just $ "Failed to decode JSON: " ++ err
app :: IO Application
app = pure serveAPI