packages feed

dani-sqlite-0.1.0.0: test-query/UserInstances.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module UserInstances
  ( testUserFromField,
    testSqlDataFromField,
  )
where

import Common
import Data.Int (Int64)
import Data.Text qualified as T
import Sqlite.Query.FromField
import Sqlite.Query.Ok
import Sqlite.Query.ToField

newtype MyType = MyType String deriving (Eq, Show)

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 (?)" (MkSolo ("test string" :: String))
  [MkSolo r] <- select_ conn "SELECT t FROM fromfield" :: IO [(Solo MyType)]
  (MyType "fromField test string") @=? r
  execute_ conn "DELETE FROM fromfield"
  execute conn "INSERT INTO fromfield (t) VALUES (?)" (MkSolo (MyType "test2"))
  [MkSolo r] <- select_ conn "SELECT t FROM fromfield" :: IO [(Solo 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 <- select_ 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