packages feed

wai-session-postgresql-0.2.1.3: test/Spec.hs

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