@@ -1,23 +1,25 @@
1−{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE FlexibleContexts #-}
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE FlexibleContexts #-}
33{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE LambdaCase #-}
45{-# LANGUAGE OverloadedStrings #-}
5−{-# LANGUAGE TypeOperators #-}
6+{-# LANGUAGE TypeOperators #-}
67module Rollbar.Item.MissingHeaders.Test where
78
8−import Control.Lens ((&), (^@..))
9+import Data.Aeson (Value (Object), decode', encode,
10+ toJSON)
11+import Data.Functor (void)
12+import Data.HashSet (HashSet)
13+import Data.Text (Text)
914
10−import Data.Aeson (encode, toJSON)
11−import Data.Aeson.Lens (members)
15+import Prelude hiding (error)
1216
13−import Prelude hiding (error)
17+import Rollbar.Item.MissingHeaders (MissingHeaders (..))
18+import Rollbar.QuickCheck ()
1419
15−import Rollbar.Item.MissingHeaders (MissingHeaders(..))
16−import Rollbar.QuickCheck ()
20+import Test.QuickCheck (conjoin, quickCheck)
1721
18−import Test.QuickCheck (conjoin, quickCheck)
19−
20−import Data.Set as S
22+import qualified Data.HashSet
2123
2224props :: IO ()
2325props = do
@@ -38,48 +40,55 @@ props = do
3840
3941prop_valueAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
4042prop_valueAuthorizationIsRemoved hs =
41− "Authorization" `S.notMember` actual
43+ "Authorization" `notMember` actual
4244 where
43− actual = toJSON hs ^@.. members & fmap fst & S.fromList
45+ actual = keys (toJSON hs)
4446
4547prop_encodingAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
4648prop_encodingAuthorizationIsRemoved hs =
47− "Authorization" `S.notMember` actual
49+ "Authorization" `notMember` actual
4850 where
49− actual = encode hs ^@.. members & fmap fst & S.fromList
51+ actual = foldMap keys (decode' $ encode hs)
5052
5153prop_valueX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
5254prop_valueX_AccessTokenIsRemoved hs =
53− "X-AccessToken" `S.notMember` actual
55+ "X-AccessToken" `notMember` actual
5456 where
55− actual = toJSON hs ^@.. members & fmap fst & S.fromList
57+ actual = keys (toJSON hs)
5658
5759prop_encodingX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
5860prop_encodingX_AccessTokenIsRemoved hs =
59− "X-AccessToken" `S.notMember` actual
61+ "X-AccessToken" `notMember` actual
6062 where
61− actual = encode hs ^@.. members & fmap fst & S.fromList
63+ actual = foldMap keys (decode' $ encode hs)
6264
6365prop_valueAllHeadersAreRemoved
6466 :: MissingHeaders
6567 '["Authorization", "this is made up", "Server", "X-AccessToken"]
6668 -> Bool
6769prop_valueAllHeadersAreRemoved hs =
68− "Authorization" `S.notMember` actual
69− && "this is made up" `S.notMember` actual
70− && "Server" `S.notMember` actual
71− && "X-AccessToken" `S.notMember` actual
70+ "Authorization" `notMember` actual
71+ && "this is made up" `notMember` actual
72+ && "Server" `notMember` actual
73+ && "X-AccessToken" `notMember` actual
7274 where
73− actual = toJSON hs ^@.. members & fmap fst & S.fromList
75+ actual = keys (toJSON hs)
7476
7577prop_encodingAllHeadersAreRemoved
7678 :: MissingHeaders
7779 '["Authorization", "this is made up", "Server", "X-AccessToken"]
7880 -> Bool
7981prop_encodingAllHeadersAreRemoved hs =
80− "Authorization" `S.notMember` actual
81− && "this is made up" `S.notMember` actual
82− && "Server" `S.notMember` actual
83− && "X-AccessToken" `S.notMember` actual
82+ "Authorization" `notMember` actual
83+ && "this is made up" `notMember` actual
84+ && "Server" `notMember` actual
85+ && "X-AccessToken" `notMember` actual
8486 where
85− actual = encode hs ^@.. members & fmap fst & S.fromList
87+ actual = foldMap keys (decode' $ encode hs)
88+
89+keys :: Value -> HashSet Text
90+keys = \case
91+ Object o -> Data.HashSet.fromMap (void o)
92+ _ -> mempty
93+
94+notMember x = not . Data.HashSet.member x