packages feed

wai-session-redis-0.1.0.0: test/Spec.hs

-- Adapted from https://github.com/hce/postgresql-session/blob/master/test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}
module Main where

import           Control.Concurrent
import qualified Data.ByteString           as B
import           Data.Default
import           Test.Hspec

import           Network.Wai.Session.Redis

main :: IO ()
main = hspec spec

spec :: Spec
spec = describe "Network.Wai.Session.Redis" $ it "handles sessions" $ do
    store <- dbStore testSettings

    -- new session
    ((lookupSess1, insertSess1), mknewsessid) <- store Nothing
    sessid <- mknewsessid

    -- insert
    insertSess1 ("foo" :: B.ByteString) ("foo" :: B.ByteString)
    lookupSess1 "foo" `shouldReturn` Just "foo"

    -- update
    insertSess1 ("foo" :: B.ByteString) ("bar" :: B.ByteString)
    lookupSess1 "foo" `shouldReturn` Just "bar"

    -- non-existing key
    lookupSess1 "bar" `shouldReturn` Nothing

    -- existing session
    ((lookupSess2, insertSess2), mknewsessid) <- store $ Just sessid
    newsessid <- mknewsessid

    lookupSess2 "foo" `shouldReturn` Just "bar"

    newsessid `shouldBe` sessid

    -- invalid session
    let invalidsessid = "foobar"
    ((lookupSess3, insertSess3), mknewsessid) <- store $ Just invalidsessid
    newsessid2 <- mknewsessid

    newsessid2 `shouldNotBe` newsessid
    newsessid2 `shouldNotBe` invalidsessid

    lookupSess3 "foo" `shouldReturn` Nothing

    -- re-accessing session
    ((lookupSess4, insertSess4), mknewsessid) <- store $ Just sessid
    lookupSess4 "foo" `shouldReturn` Just "bar"

    -- purged session
    threadDelay 2000000
    ((lookupSess5, insertSess5), mknewsessid) <- store $ Just sessid
    lookupSess5 "foo" `shouldReturn` Nothing

testSettings :: SessionSettings
testSettings = def {expiratinTime = 1}