packages feed

asap-0.0.1: test/Main.hs

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