-- 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}