diff options
Diffstat (limited to 'lambda-calcul/haskell/test')
| -rw-r--r-- | lambda-calcul/haskell/test/Minilang/ServerSpec.hs | 38 |
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")] |
