packages feed

rollbar-hs-0.3.1.0: test/Rollbar/Item/MissingHeaders/Test.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}
module Rollbar.Item.MissingHeaders.Test where

import           Data.Aeson                  (Value (Object), decode', encode,
                                              toJSON)
import           Data.Functor                (void)
import           Data.HashSet                (HashSet)
import           Data.Text                   (Text)

import           Prelude                     hiding (error)

import           Rollbar.Item.MissingHeaders (MissingHeaders (..))
import           Rollbar.QuickCheck          ()

import           Test.QuickCheck             (conjoin, quickCheck)

import qualified Data.HashSet

props :: IO ()
props = do
    quickCheck $ conjoin
        [ prop_valueAuthorizationIsRemoved
        , prop_encodingAuthorizationIsRemoved
        ]

    quickCheck $ conjoin
        [ prop_valueX_AccessTokenIsRemoved
        , prop_encodingX_AccessTokenIsRemoved
        ]

    quickCheck $ conjoin
        [ prop_valueAllHeadersAreRemoved
        , prop_encodingAllHeadersAreRemoved
        ]

prop_valueAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
prop_valueAuthorizationIsRemoved hs =
    "Authorization" `notMember` actual
    where
    actual = keys (toJSON hs)

prop_encodingAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
prop_encodingAuthorizationIsRemoved hs =
    "Authorization" `notMember` actual
    where
    actual = foldMap keys (decode' $ encode hs)

prop_valueX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
prop_valueX_AccessTokenIsRemoved hs =
    "X-AccessToken" `notMember` actual
    where
    actual = keys (toJSON hs)

prop_encodingX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
prop_encodingX_AccessTokenIsRemoved hs =
    "X-AccessToken" `notMember` actual
    where
    actual = foldMap keys (decode' $ encode hs)

prop_valueAllHeadersAreRemoved
    :: MissingHeaders
        '["Authorization", "this is made up", "Server", "X-AccessToken"]
    -> Bool
prop_valueAllHeadersAreRemoved hs =
    "Authorization" `notMember` actual
        && "this is made up" `notMember` actual
        && "Server" `notMember` actual
        && "X-AccessToken" `notMember` actual
    where
    actual = keys (toJSON hs)

prop_encodingAllHeadersAreRemoved
    :: MissingHeaders
        '["Authorization", "this is made up", "Server", "X-AccessToken"]
    -> Bool
prop_encodingAllHeadersAreRemoved hs =
    "Authorization" `notMember` actual
        && "this is made up" `notMember` actual
        && "Server" `notMember` actual
        && "X-AccessToken" `notMember` actual
    where
    actual = foldMap keys (decode' $ encode hs)

keys :: Value -> HashSet Text
keys = \case
  Object o -> Data.HashSet.fromMap (void o)
  _ -> mempty

notMember x = not . Data.HashSet.member x