packages feed

yesod-session-persist-0.0.0.0: tests/Yesod/Session/Manager/LoadSpec.hs

module Yesod.Session.Manager.LoadSpec
  ( spec
  ) where

import Test.Prelude

import Data.Sequence qualified as Seq
import Yesod.Session.Manager
import Yesod.Session.Manager.Load
import Yesod.Session.SessionType

spec :: Spec
spec = context "Session loading" $ do
  specify "may load a session"
    $ forAll (genMockInit id)
    $ \mockInit ->
      forAll (genSessionInit requireLive mockInit) $ \sessionInit ->
        forAll (genVectorOfRange (0, 5) $ genSessionInit id mockInit)
          $ \otherSessionInits ->
            ioProperty $ do
              mock@Mock {sessionManager} <- newMock id mockInit
              traverse_ (createArbitrarySession mock) otherSessionInits
              sessionKey <- createArbitrarySession mock sessionInit
              load <- loadSession sessionManager sessionKey
              pure $ counterexample (show load) $ didSessionLoad load

  context "may load nothing" $ do
    specify "when there is no session key"
      $ forAll (genMockInit id)
      $ \mockInit ->
        forAll (genVectorOfRange (0, 5) $ genSessionInit id mockInit)
          $ \sessionInits -> ioProperty $ do
            mock@Mock {sessionManager} <- newMock id mockInit
            traverse_ (createArbitrarySession mock) sessionInits
            load :: Load Session <- loadNothing sessionManager
            transcript <- takeTranscript mock.mockStorage
            pure
              $ counterexample (show load) (not $ didSessionLoad load)
              .&&. counterexample (show transcript) (transcript == Seq.empty)

    specify "when the key is not in storage"
      $ forAll (genMockInit id)
      $ \mockInit ->
        forAll (genVectorOfRange (0, 5) $ genSessionInit id mockInit)
          $ \sessionInits -> ioProperty $ do
            mock@Mock {sessionManager} <- newMock id mockInit
            traverse_ (createArbitrarySession mock) sessionInits
            sessionKey <- newSessionKey sessionManager
            load <- loadSession sessionManager sessionKey
            pure $ counterexample (show load) (not $ didSessionLoad load)

    specify "when the session is expired"
      $ forAll (genMockInit requireSomeTimeLimit)
      $ \mockInit ->
        forAll (genSessionInit requireExpired mockInit)
          $ \sessionInit -> ioProperty $ do
            mock@Mock {sessionManager} <- newMock id mockInit
            sessionKey <- createArbitrarySession mock sessionInit
            load <- loadSession sessionManager sessionKey
            pure $ counterexample (show load) (not $ didSessionLoad load)