{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Concurrent (threadDelay)
import Data.Default (def)
import Database.PostgreSQL.Simple
import Network.Wai.Session.PostgreSQL
import Test.Hspec
import qualified Data.ByteString as B
main :: IO ()
main = hspec spec
spec :: Spec
spec = describe "Network.Wai.Session.PostgreSQL" $ it "handles sessions" $ do
conn <- dbconnect
conn' <- fromSimpleConnection conn
store <- dbStore conn' testSettings
purger conn' 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
dbconnect :: IO Connection
dbconnect = do
let connectInfo = ConnectInfo {
connectHost = "localhost"
, connectPort = 5432
, connectUser = "demo"
, connectPassword = "omed"
, connectDatabase = "demodb" }
connectPostgreSQL $ postgreSQLConnectionString connectInfo
testSettings :: StoreSettings
testSettings = def { storeSettingsSessionTimeout=1 }