packages feed

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

-- Adapted from https://github.com/hce/postgresql-session/blob/master/test/Spec.hs
{-# LANGUAGE BlockArguments      #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where

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

import           Network.Wai.Session.Redis

main :: IO ()
main = hspec spec

spec :: Spec
spec = describe "Network.Wai.Session.Redis" $ do
    it "Handles value insert" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      ((lookup, insert), mkSessionId) <- store Nothing
      sessionId <- mkSessionId

      insert "foo" "foo"
      lookup "foo" `shouldReturn` Just "foo"

    it "Handles value update" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      ((lookup, insert), mkSessionId) <- store Nothing
      sessionId <- mkSessionId

      insert "foo" "foo"
      lookup "foo" `shouldReturn` Just "foo"

      insert "foo" "bar"
      lookup "foo" `shouldReturn` Just "bar"

    it "Handles non-existing key" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      ((lookup, insert), mkSessionId) <- store Nothing
      sessionId <- mkSessionId

      lookup "foo" `shouldReturn` Nothing

    it "Handles valid sesson id" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      let invalidSessionId = "ImInvalidId"
      ((lookup, insert), mkSessionId) <- store $ Just invalidSessionId

      newSessionId <- mkSessionId
      newSessionId `shouldNotBe` invalidSessionId
      lookup "foo" `shouldReturn` Nothing
      insert "foo" "foo"

      ((lookup, insert), mkSessionId) <- store $ Just newSessionId
      newSessionId2 <- mkSessionId
      lookup "foo" `shouldReturn` Just "foo"
      newSessionId2 `shouldBe` newSessionId

    it "Handles invalid sesson id" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      let invalidSessionId = "ImInvalidId"
      ((lookup, insert), mkSessionId) <- store $ Just invalidSessionId
      newSessionId <- mkSessionId
      newSessionId `shouldNotBe` invalidSessionId
      lookup "foo" `shouldReturn` Nothing

    it "Timeouts session" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      ((lookup, insert), mkSessionId) <- store Nothing

      insert "foo" "foo"
      threadDelay 2000000
      lookup "foo" `shouldReturn` Nothing

    it "Clears sessions" do
      store :: SessionStore IO B.ByteString B.ByteString <- dbStore testSettings
      ((lookup, insert), mkSessionId) <- store Nothing

      insert "foo" "foo"
      lookup "foo" `shouldReturn` Just "foo"

      mkSessionId >>= clearSession testSettings
      lookup "foo" `shouldReturn` Nothing


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