verify-0.0.0: test-suite/CJ/Auth/TokenSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module CJ.Auth.TokenSpec (spec) where
import Test.Hspec
import Test.QuickCheck
import qualified Web.JWT as JWT
import qualified Data.Text as T
import Data.String (fromString)
import CJ.Auth.Token
instance Arbitrary T.Text where
arbitrary = fromString <$> arbitrary
spec :: Spec
spec = do
describe "UserBearerToken" $ do
describe "encodeToken / decodeToken" $
it "decode . encode = id" $
property $ \x y ->
let token = UserBearerToken{ _bearerUserId = x
, _bearerAppId = y }
secret = JWT.secret ""
encoded = encodeToken secret token 100
decoded = decodeToken secret encoded 0
in decoded == Just token
describe "decodeToken" $
it "returns Nothing if the token is expired" $
property $ \x y ->
let token = UserBearerToken{ _bearerUserId = x, _bearerAppId = y }
secret = JWT.secret ""
time = 0
encoded = encodeToken secret token time
decoded = decodeToken secret encoded 100 :: (Maybe UserBearerToken)
in decoded `shouldBe` Nothing
describe "decodeToken" $
it "returns Nothing if token is garbage" $ do
shouldBe (decodeToken (JWT.secret "secret") "" 123) (Nothing :: Maybe TClaim)
shouldBe (decodeToken (JWT.secret "secret") "xyz.abc.123" 123) (Nothing :: Maybe TClaim)
shouldBe (decodeToken (JWT.secret "secret") "ybGcJ9.eyJzWV9.TJVAFh7HgQ" 123) (Nothing :: Maybe TClaim)
shouldBe (decodeToken (JWT.secret "secret") "eyJvbmUiOiIxIiwiYWxnIjoiSFMyNTYifQ" 123) (Nothing :: Maybe TClaim)
shouldBe (decodeToken (JWT.secret "secret") "eyJvbmUiOiIxIiwiYWxnIjoiSFMyNTYifQ.eyJvbmUiOiIxIiwiYWxnIjoiSFMyNTYifQ" 123) (Nothing :: Maybe TClaim)
data TClaim = TClaim
deriving (Eq, Show)
instance JSONToken TClaim where
toClaims _ = JWT.def
fromClaims _ = Just TClaim