packages feed

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