content: module Snap.Snaplet.Auth.SpliceTests (
    tests
    ) where
  
  
  ------------------------------------------------------------------------------
  import           Control.Monad                  (replicateM_, when)
  import qualified Data.Map                       as Map
  import qualified Data.ByteString                as BS
  import           Test.Framework                 (Test, testGroup)
  import           Test.Framework.Providers.HUnit (testCase)
  import           Test.HUnit                     hiding (Test)
  ------------------------------------------------------------------------------
  import           Snap.Core                      as Core
  import           Snap.Snaplet                   (with)
  import qualified Snap.Test                      as ST
  import           Snap.Snaplet.Test              (runHandler,
                                                   withTemporaryFile)
  import           Snap.Snaplet.Auth              (Password(ClearText),
                                                   createUser, loginByUsername,
                                                   userISplices)
  import           Snap.Snaplet.Heist             (cRender, render,
                                                   withSplices)
  import           Snap.Snaplet.Test.Common.App   (appInit, auth)
  
  
  ------------------------------------------------------------------------------
  tests :: Test
  tests = testGroup "Snap.Snaplet.Auth.SpliceHelpers"
          [testCase "Render new user page"    $ renderNewUser False False
          ,testCase "New user login render"   $ renderNewUser True  False
          ,testCase "New user suspend render" $ renderNewUser False True
          ,testCase "cRender new user page"   $ cRenderNewUser
          ]
  
  
  ------------------------------------------------------------------------------
  renderNewUser :: Bool -> Bool -> Assertion
  renderNewUser login suspend = withTemporaryFile "users.json" $ do
    let hdl = with auth $ do
          usr <- createUser "foo" "foo"
          _ <- when login $
               loginByUsername "foo" (ClearText "foo") False >> return ()
          _ <- when suspend $ replicateM_ 4 $
               loginByUsername "foo" (ClearText "wrong") False
          either
            (\_ -> Core.modifyResponse $ Core.setResponseStatus 500 "Error")
            (\u -> withSplices (userISplices u) $ render "userpage")
            usr
    res <- runHandler Nothing (ST.get "" Map.empty) hdl appInit
    either (assertFailure . show) ST.assertSuccess res
  
  
  ------------------------------------------------------------------------------
  cRenderNewUser :: Assertion
  cRenderNewUser = withTemporaryFile "users.json" $ do
    let hdl = with auth $ do
          _ <- createUser "foo" "foo"
          _ <- loginByUsername "foo" (ClearText "foo") True
          cRender "userpage"
  
        assertValidRes r = do
          rStr <- ST.responseToString r
          assertBool "userpage should contain UserName foo splice" $
            "UserLogin foo" `BS.isInfixOf` rStr
  
    res <- runHandler Nothing (ST.get "" Map.empty) hdl appInit
    either (assertFailure . show) assertValidRes res
  