summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/test
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud@pankzsoft.com>2025-11-04 22:49:12 +0100
committerArnaud Bailly <arnaud@pankzsoft.com>2025-11-04 22:49:12 +0100
commit8a2727a05e0b61d300bb46e8e913c9e60ebd6328 (patch)
tree5286eefedb79d4341a8157cc1af705e4f7da433a /lambda-calcul/haskell/test
parent958cd52392185fc31333c1b208948046d7a9e635 (diff)
downloadlambda-nantes-8a2727a05e0b61d300bb46e8e913c9e60ebd6328.tar.gz
Can retrieve first challenge when registered
Diffstat (limited to 'lambda-calcul/haskell/test')
-rw-r--r--lambda-calcul/haskell/test/Minilang/ServerSpec.hs38
1 files changed, 27 insertions, 11 deletions
diff --git a/lambda-calcul/haskell/test/Minilang/ServerSpec.hs b/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
index 33fbd69..a7926d3 100644
--- a/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
+++ b/lambda-calcul/haskell/test/Minilang/ServerSpec.hs
@@ -3,26 +3,30 @@
module Minilang.ServerSpec where
-import Control.Concurrent.STM (newTVarIO)
import Control.Monad (void)
import Data.Aeson (FromJSON, eitherDecode, encode)
import Data.ByteString (isInfixOf, toStrict)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64.Lazy as Base64
import Data.ByteString.Lazy (ByteString)
+import qualified Data.ByteString.Lazy as LBS
import Data.Data (Proxy (..))
-import Minilang.API (Score, User (..), newToken)
-import Minilang.App (Env (..), makeEnv)
+import Data.Text.Lazy.Encoding (decodeUtf8)
+import Minilang.API (Challenge (..), Score, User (..), newToken)
+import Minilang.App (makeEnv)
import Minilang.Server (serveAPI)
import Network.Wai (Application)
import Network.Wai.Test (SResponse)
import System.Random (StdGen, mkStdGen64)
import Test.Hspec (Spec, it)
-import Test.Hspec.Wai (WaiSession, get, matchBody, post, request, shouldRespondWith, with)
+import Test.Hspec.Wai (WaiSession, get, matchBody, request, shouldRespondWith, with)
import Test.Hspec.Wai.Matcher (MatchBody (..))
spec :: Spec
spec = with (app testSeed) $ do
+ let token = Base64.encode (fst $ newToken testSeed)
+ alice = encode $ User "alice"
+
it "GET / returns 'index.html'" $ do
get "/"
`shouldRespondWith` 200
@@ -37,23 +41,35 @@ spec = with (app testSeed) $ do
`shouldRespondWith` 200 {matchBody = arrayOfLengthOf (Proxy @Score) 2}
it "POST /api/register returns registration token given user is not registered" $ do
- let token = "{\"token\":\"" <> Base64.encode (fst $ newToken testSeed) <> "\"}"
- let user = encode $ User "alice"
- postJSON "/api/register" user
+ postJSON "/api/register" alice
`shouldRespondWith` 201
{ matchBody = MatchBody $ \_ t ->
- if t == token
+ if t == encode (decodeUtf8 token)
then
Nothing
else Just ("Expected token " ++ show token ++ ", but got " ++ show t)
}
it "POST /api/register returns 400 given user is already registered" $ do
- let user = encode $ User "alice"
- void $ postJSON "/api/register" user
- postJSON "/api/register" user
+ void $ postJSON "/api/register" alice
+
+ postJSON "/api/register" alice
`shouldRespondWith` 400
+ it "GET /api/challenge returns next challenge given user is registered" $ do
+ let expected = encode $ Challenge {level = 1, expr = "x"}
+ postJSON "/api/register" alice
+ `shouldRespondWith` 201
+
+ get ("/api/challenge?token=" <> LBS.toStrict token)
+ `shouldRespondWith` 200
+ { matchBody = MatchBody $ \_ b ->
+ if b == expected
+ then
+ Nothing
+ else Just ("Expected challenge " ++ show expected ++ ", but got " ++ show b)
+ }
+
postJSON :: BS.ByteString -> ByteString -> WaiSession () SResponse
postJSON url = request "POST" url [("Content-Type", "application/json")]