@@ -1,23 +1,26 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE FlexibleContexts #-}
2+{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE LambdaCase #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE OverloadedStrings #-}
5−{-# LANGUAGE TypeOperators #-}
6+{-# LANGUAGE TypeOperators #-}
6module Rollbar.Item.MissingHeaders.Test where
7module Rollbar.Item.MissingHeaders.Test where
8−import Control.Lens ((&), (^@..))
9+import Data.Aeson (Value (Object), decode', encode,
11+import Data.Functor (void)
13+import Data.HashSet (HashSet)
14+import Data.Text (Text)
10−import Data.Aeson (encode, toJSON)
16+import Prelude hiding (error)
11−import Data.Aeson.Lens (members)
13−import Prelude hiding (error)
18+import Rollbar.Item.MissingHeaders (MissingHeaders (..))
19+import Rollbar.QuickCheck ()
15−import Rollbar.Item.MissingHeaders (MissingHeaders(..))
21+import Test.QuickCheck (conjoin, quickCheck)
16−import Rollbar.QuickCheck ()
18−import Test.QuickCheck (conjoin, quickCheck)
23+import qualified Data.HashSet
22props :: IO ()
25props :: IO ()
@@ -38,48 +41,56 @@ props = do
39prop_valueAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
42prop_valueAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
40prop_valueAuthorizationIsRemoved hs =
43prop_valueAuthorizationIsRemoved hs =
41− "Authorization" `S.notMember` actual
44+ "Authorization" `notMember` actual
43− actual = toJSON hs ^@.. members & fmap fst & S.fromList
46+ actual = keys (toJSON hs)
45prop_encodingAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
48prop_encodingAuthorizationIsRemoved :: MissingHeaders '["Authorization"] -> Bool
46prop_encodingAuthorizationIsRemoved hs =
49prop_encodingAuthorizationIsRemoved hs =
47− "Authorization" `S.notMember` actual
50+ "Authorization" `notMember` actual
49− actual = encode hs ^@.. members & fmap fst & S.fromList
52+ actual = foldMap keys (decode' $ encode hs)
51prop_valueX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
54prop_valueX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
52prop_valueX_AccessTokenIsRemoved hs =
55prop_valueX_AccessTokenIsRemoved hs =
53− "X-AccessToken" `S.notMember` actual
56+ "X-AccessToken" `notMember` actual
55− actual = toJSON hs ^@.. members & fmap fst & S.fromList
58+ actual = keys (toJSON hs)
57prop_encodingX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
60prop_encodingX_AccessTokenIsRemoved :: MissingHeaders '["X-AccessToken"] -> Bool
58prop_encodingX_AccessTokenIsRemoved hs =
61prop_encodingX_AccessTokenIsRemoved hs =
59− "X-AccessToken" `S.notMember` actual
62+ "X-AccessToken" `notMember` actual
61− actual = encode hs ^@.. members & fmap fst & S.fromList
64+ actual = foldMap keys (decode' $ encode hs)
63prop_valueAllHeadersAreRemoved
66prop_valueAllHeadersAreRemoved
64 :: MissingHeaders
67 :: MissingHeaders
65 '["Authorization", "this is made up", "Server", "X-AccessToken"]
68 '["Authorization", "this is made up", "Server", "X-AccessToken"]
67prop_valueAllHeadersAreRemoved hs =
70prop_valueAllHeadersAreRemoved hs =
68− "Authorization" `S.notMember` actual
71+ "Authorization" `notMember` actual
69− && "this is made up" `S.notMember` actual
72+ && "this is made up" `notMember` actual
70− && "Server" `S.notMember` actual
73+ && "Server" `notMember` actual
71− && "X-AccessToken" `S.notMember` actual
74+ && "X-AccessToken" `notMember` actual
73− actual = toJSON hs ^@.. members & fmap fst & S.fromList
76+ actual = keys (toJSON hs)
75prop_encodingAllHeadersAreRemoved
78prop_encodingAllHeadersAreRemoved
76 :: MissingHeaders
79 :: MissingHeaders
77 '["Authorization", "this is made up", "Server", "X-AccessToken"]
80 '["Authorization", "this is made up", "Server", "X-AccessToken"]
79prop_encodingAllHeadersAreRemoved hs =
82prop_encodingAllHeadersAreRemoved hs =
80− "Authorization" `S.notMember` actual
83+ "Authorization" `notMember` actual
81− && "this is made up" `S.notMember` actual
84+ && "this is made up" `notMember` actual
82− && "Server" `S.notMember` actual
85+ && "Server" `notMember` actual
83− && "X-AccessToken" `S.notMember` actual
86+ && "X-AccessToken" `notMember` actual
85− actual = encode hs ^@.. members & fmap fst & S.fromList
88+ actual = foldMap keys (decode' $ encode hs)
90+keys :: Value -> HashSet Text
92+ Object o -> Data.HashSet.fromMap (void o)
95+notMember :: (Eq a, Hashable a) => a -> HashSet a -> Bool
96+notMember x = not . Data.HashSet.member x