{-# LANGUAGE OverloadedStrings #-} module Main where import Control.Monad (unless) import Data.Time import Hedgehog import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import System.Exit (exitFailure) import System.IO (BufferMode (..), hSetBuffering, stderr, stdout) import qualified Web.JWT as JWT import Web.JWT.ASAP nominalYear :: NominalDiffTime nominalYear = nominalDay * 365 nominalDecade :: NominalDiffTime nominalDecade = nominalYear * 10 genInDecade :: Gen NominalDiffTime genInDecade = Gen.realFrac_ (Range.constant 0 nominalDecade) genMaxAge :: Gen MaxAge genMaxAge = MaxAge <$> Gen.realFrac_ (Range.constant 0 (9 * 60)) isExpiredProp :: Property isExpiredProp = property $ do maxAge@(MaxAge maxAgeTime) <- forAll genMaxAge iat <- forAll genInDecade -- numericDate rounds so we have to + 1 to make a later time assert $ maybe False (\iat' -> laterThanMaxAge maxAge iat' (iat + maxAgeTime + 1)) (JWT.numericDate iat) main :: IO () main = do hSetBuffering stdout LineBuffering hSetBuffering stderr LineBuffering results <- checkParallel $ Group "ASAP" [ ("laterThanMaxAge", isExpiredProp) ] unless results exitFailure