content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TypeFamilies #-}
  
  module Web.Spock.Internal.SessionVaultSpec (spec) where
  
  import Control.Concurrent.STM
  import Test.Hspec
  import Web.Spock.Internal.SessionVault
  
  data DummySession = DummySession
    { ds_key :: Int,
      ds_value :: Int
    }
    deriving (Show, Eq)
  
  instance IsSession DummySession where
    type SessionKey DummySession = Int
    getSessionKey = ds_key
  
  spec :: Spec
  spec =
    describe "SessionVault" $
      do
        it "insert works correctly" $
          do
            let sess = DummySession 1 1
            vault <- atomically newSessionVault
            atomically $ storeSession sess vault
            atomically (loadSession (ds_key sess) vault) `shouldReturn` Just sess
        it "update works correctly" $
          do
            let sess = DummySession 1 1
                sess2 = DummySession 1 2
            vault <- atomically newSessionVault
            atomically $ storeSession sess vault
            atomically (loadSession (ds_key sess) vault) `shouldReturn` Just sess
            atomically $ storeSession sess2 vault
            atomically (loadSession (ds_key sess) vault) `shouldReturn` Just sess2
        it "filter and toList works correctly" $
          do
            let sess = DummySession 1 1
                sess2 = DummySession 2 2
                sess3 = DummySession 3 3
            vault <- atomically newSessionVault
            atomically $ mapM_ (`storeSession` vault) [sess, sess2, sess3]
            atomically (toList vault) `shouldReturn` [sess, sess2, sess3]
            atomically $ filterSessions (\s -> ds_value s > 2) vault
            atomically (toList vault) `shouldReturn` [sess3]
  