festung-0.9.1.1: tests/Festung/Vault/VaultManagerSpec.hs
module Festung.Vault.VaultManagerSpec (spec) where
import Test.Hspec
import Control.Exception (bracket)
import Control.Monad (forM_)
import Festung.Vault.VaultManager
import qualified Festung.Vault.VaultHandler as V
import qualified Festung.Vault.Persistence as P
import TestUtils
withManager :: Int -> (VaultManager -> IO a) -> IO a
withManager timeout action = withConfig timeout $ \ config ->
bracket (newManager config) stopManager action
withManager_ :: (VaultManager -> IO a) -> IO a
withManager_ = withManager defaultTimeout
password1 :: P.Password
password1 = [0xDE, 0xAD]
password2 :: P.Password
password2 = [0xBE, 0xEF]
vault1 :: V.VaultOpener
vault1 = ("vault1.sqlcipher", password1, P.VaultParameters Nothing)
vault2 :: V.VaultOpener
vault2 = ("vault2.sqlcipher", password2, P.VaultParameters (Just 100))
spec :: Spec
spec =
describe "newManager" $ do
it "Can query vault" $ withManager_ $ \ manager -> do
let query' = query vault1 manager
query' "CREATE TABLE foo(bar int)"
dat <- noError =<< query' "SELECT bar FROM foo"
P.headers dat `shouldBe` [("bar", Just "int")]
it "Can query different vaults" $ withManager_ $ \ manager -> do
let dataShouldBe vault dat = do
dat' <- noError =<< query vault manager "SELECT bar FROM foo ORDER BY 1"
P.rows dat' `shouldBe` dat
forM_ [vault1, vault2] $ \ vault -> do
let query' = query vault manager
query' "CREATE TABLE foo(bar int)"
query' "INSERT INTO foo(bar) VALUES (1), (2)"
vault `dataShouldBe` [[P.IntValue 1], [P.IntValue 2]]
query vault1 manager "DELETE FROM foo WHERE bar = 1"
vault1 `dataShouldBe` [[P.IntValue 2]]
vault2 `dataShouldBe` [[P.IntValue 1], [P.IntValue 2]]