packages feed

wai-session-mysql-0.2.1.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Control.Concurrent (threadDelay)
import Control.Exception.Base (assert)
import Control.Monad
import Data.Default (def)
import Data.String (fromString)
import Data.Maybe (isNothing)
import Database.MySQL.Simple
import Network.Wai.Session (withSession, Session)
import Network.Wai.Session.MySQL

import qualified Data.ByteString as B
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE

main :: IO ()
main = do
    conn <- dbconnect
    conn' <- fromSimpleConnection conn
    store <- dbStore conn' testSettings
    purger conn' testSettings

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

    insertSess1 ("foo" :: B.ByteString) ("bar" :: B.ByteString)

    l1 <- lookupSess1 "foo"
    assert (l1 == Just "bar") it

    l2 <- lookupSess1 "bar"
    assert (isNothing l2) it

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

    l3 <- lookupSess2 "foo"
    assert (l3 == Just "bar") it

    assert (newsessid == sessid) it

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

    assert (newsessid2 /= newsessid) it
    assert (newsessid2 /= invalidsessid) it

    l4 <- lookupSess3 "foo"
    assert (isNothing l4) it

    ((lookupSess4, insertSess4), mknewsessid) <- store $ Just sessid
    l5 <- lookupSess4 "foo"
    assert (l5 == Just "bar") it

    threadDelay 6000000

    ((lookupSess5, insertSess5), mknewsessid) <- store $ Just sessid
    l6 <- lookupSess5 "foo"
    assert (isNothing l6) it

it :: IO ()
it = return ()

dbconnect :: IO Connection
dbconnect = connect defaultConnectInfo { connectDatabase = "test" }

testSettings :: StoreSettings
testSettings = def { storeSettingsSessionTimeout=5 }