packages feed

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]]