{-# 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