{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} module TestImport ( module TestImport , module X ) where import qualified Data.Map.Strict as M import qualified System.Log.FastLogger as F import qualified Yesod import qualified Yesod.Default.Config2 as C import ClassyPrelude as X hiding (Handler, delete, deleteBy) import Data.CaseInsensitive (CI) import ExampleApp as X import Network.Wai.Test (SResponse(..)) import Test.Hspec as X import Yesod.Test as X import Yesod.Test.TransversingCSS (Query, findAttributeBySelector) withApp :: SpecWith (TestApp ExampleApp) -> Spec withApp = before $ do logF <- F.newStdoutLoggerSet 1 >>= C.makeYesodLogger pure (ExampleApp logF eStatic, Yesod.defaultMiddlewaresNoLogging) assertCSP :: HasCallStack => ByteString -> YesodExample site () assertCSP = assertHeader "Content-Security-Policy" lookupResponseHeader :: CI ByteString -> YesodExample site (Maybe ByteString) lookupResponseHeader k = (lookupHeader =<<) <$> getResponse where lookupHeader = lookup k . M.fromList . simpleHeaders getNonceFromCSP :: YesodExample site (Maybe ByteString) getNonceFromCSP = lookupResponseHeader "Content-Security-Policy" >>= \h -> pure $ filter (isPrefixOf "'nonce-") . words . decodeUtf8 <$> h >>= fmap (encodeUtf8 . dropEnd 1 . dropPrefix "'nonce-") . headMay getAttrFromResponseMatch :: Query -> Text -> YesodExample site (Maybe Text) getAttrFromResponseMatch q a = do body <- getAttr . simpleBody <<$>> getResponse pure $ body >>= either (const Nothing) headMay >>= headMay where getAttr b = findAttributeBySelector b q a infixl 4 <<$>> (<<$>>) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b) (<<$>>) = fmap . fmap