packages feed

generic-persistence-0.7.0.0: test/ConnSpec.hs

module ConnSpec
  ( test,
    spec,
  )
where

import           Database.GP
import           Database.HDBC
import           Database.HDBC.Sqlite3
import           GHC.Generics
import           Test.Hspec

-- `test` is here so that this module can be run from GHCi on its own.  It is
-- not needed for automatic spec discovery.
-- (start up stack repl --test to bring up ghci and have access to all the test functions)
test :: IO ()
test = hspec spec

prepareDB :: IO Conn
prepareDB = do
  conn <- connect AutoCommit <$> connectSqlite3 ":memory:"
  setupTable @Article conn defaultSqliteMapping
  return conn

data Article = Article
  { articleID :: Int,
    title     :: String,
    year      :: Int
  }
  deriving (Generic, Entity, Show, Eq)

spec :: Spec
spec = do
  describe "Connection Handling" $ do
    it "can work with embedded connection" $ do
      (Conn ic conn) <- prepareDB
      ic `shouldBe` True

      runRaw conn "DROP TABLE IF EXISTS Person;"
      let conn' = connect AutoCommit conn

      allArticles <- select conn' allEntries :: IO [Article]
      allArticles `shouldBe` []

    it "can handle rollback" $ do
      conn <- prepareDB
      let conn' = connect ExplicitCommit conn
      let article = Article 1 "Hello" 2023

      _ <- insert conn' article
      allArticles <- select conn' allEntries :: IO [Article]
      allArticles `shouldBe` [article]
      rollback conn'
      allArticles' <- select conn' allEntries :: IO [Article]
      allArticles' `shouldBe` []

    it "provide the IConnection methods" $ do
      conn <- prepareDB
      allTables <- getTables conn
      allTables `shouldContain` ["Article"]

      desc <- describeTable conn "Article"
      length desc `shouldBe` 3

      let driverName = hdbcDriverName conn
      driverName `shouldBe` "sqlite3"

      let clientVer = hdbcClientVer conn
      head clientVer `shouldBe` '3'

      let proxiedClient = proxiedClientName conn
      proxiedClient `shouldBe` "sqlite3"

      let proxiedClientVerion = proxiedClientVer conn
      head proxiedClientVerion `shouldBe` '3'

      let serverVer = dbServerVer conn
      head serverVer `shouldBe` '3'

      let txSupport = dbTransactionSupport conn
      txSupport `shouldBe` True

      let (Conn autoCommit _) = conn
      (Conn clonedAutoCommit _) <- clone conn
      clonedAutoCommit `shouldBe` autoCommit