{-# LANGUAGE DeriveAnyClass #-}
module EnumSpec
( test,
spec,
)
where
import Data.Convertible
import Database.GP.GenericPersistence
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:"
setupTableFor @Book SQLite conn
return conn
data Book = Book
{ bookID :: Int,
title :: String,
author :: String,
year :: Int,
category :: BookCategory
}
deriving (Generic, Show, Eq, Entity)
data BookCategory = Fiction | Travel | Arts | Science | History | Biography | Other
deriving (Generic, Show, Read, Eq)
instance Convertible BookCategory SqlValue where
safeConvert = Right . toSql . show
instance Convertible SqlValue BookCategory where
safeConvert = Right . read . fromSql
spec :: Spec
spec = do
describe "Handling of Enum Fields" $ do
it "works like a charm" $ do
conn <- prepareDB
let book = Book 1 "The Hobbit" "J.R.R. Tolkien" 1937 Fiction
_ <- insert conn book
allBooks <- select conn allEntries :: IO [Book]
allBooks `shouldBe` [book]