packages feed

sqlite-simple-0.4.16.0: test/UserInstances.hs

{-# LANGUAGE DeriveDataTypeable #-}

module UserInstances (
   testUserFromField
  ,testSQLDataFromField
  ) where

import           Common
import           Data.Int (Int64)
import           Data.Typeable (Typeable)
import qualified Data.Text as T
import           Database.SQLite.Simple.FromField
import           Database.SQLite.Simple.Ok
import           Database.SQLite.Simple.ToField

newtype MyType = MyType String deriving (Eq, Show, Typeable)

instance FromField MyType where
  fromField f = cvt f . fieldData $ f where
    -- Prefix with "fromField " to really ensure we got here
    cvt _ (SQLText s) = Ok $ MyType ("fromField "++(T.unpack s))
    cvt f _           = returnError ConversionFailed f "expecting SQLText type"

instance ToField MyType where
  -- Prefix with "toField " to really ensure we got here
  toField (MyType s) = SQLText . T.pack $ ("toField " ++ s)

testUserFromField :: TestEnv -> Test
testUserFromField TestEnv{..} = TestCase $ do
  execute_ conn "CREATE TABLE fromfield (t TEXT)"
  execute conn "INSERT INTO fromfield (t) VALUES (?)" (Only ("test string" :: String))
  [Only r] <- query_ conn "SELECT t FROM fromfield" :: IO [(Only MyType)]
  (MyType "fromField test string") @=? r
  execute_ conn "DELETE FROM fromfield"
  execute conn "INSERT INTO fromfield (t) VALUES (?)" (Only (MyType "test2"))
  [Only r] <- query_ conn "SELECT t FROM fromfield" :: IO [(Only String)]
  "toField test2" @=? r

testSQLDataFromField :: TestEnv -> Test
testSQLDataFromField TestEnv{..} = TestCase $ do
  execute_ conn "CREATE TABLE sqldatafromfield (t TEXT, i INT, b BOOLEAN, f FLOAT)"
  execute conn "INSERT INTO sqldatafromfield (t,i,b,f) VALUES (?,?,?,?)" (("test string" :: T.Text,
                                                                    1 :: Int64,
                                                                    True :: Bool,
                                                                    1.11 :: Double))
  execute conn "INSERT INTO sqldatafromfield (t,i,b) VALUES (?,?,?)" (("test string2" :: T.Text,
                                                                    2 :: Int64,
                                                                    False :: Bool))
  r <- query_ conn "SELECT * FROM sqldatafromfield" :: IO [[SQLData]]
  let testData = [[SQLText "test string",
                   SQLInteger 1,
                   SQLInteger 1,
                   SQLFloat 1.11],
                  [SQLText "test string2",
                   SQLInteger 2,
                   SQLInteger 0,
                   SQLNull]]
  testData @=? r