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