packages feed

poseidon-0.1.0.0: tests/Tests.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}

module Main (main) where

import Prelude
import GHC.Generics

import Data.Aeson as A
import Data.List ((!!))
import           Database.PostgreSQL.LibPQ
import Data.Poseidon
import Database.Poseidon

import Test.Hspec
import Data.Scientific
import Data.Time
import qualified Data.UUID as U
import Data.HashMap.Strict
import Data.ByteString as B
import Data.ByteString.Lazy as BSL
import Data.Text hiding (head)
import Data.Text.Encoding (encodeUtf8)

data User = User {
    first_name :: Text
  , is_admin :: Bool
  } deriving (Generic, Eq, Show)

data UserDetails = UserDetails {
    age :: Integer
  , extra_values :: Value
  } deriving (Generic, Eq, Show)

main :: IO ()
main = do
  conn <- connectdb . encodeUtf8 $ "service=test"
  hspec $ do
    describe "Single Value Deserialization tests" $ do
      it "Single Value Text deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST('Florian :)' AS TEXT);" mempty :: IO [PGText]
        let resultExpected = "Florian :)"
        resultExpected `shouldBe` (toText $ dataResult!!0)
      it "Single Value Bool deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST('t' AS BOOL);" mempty :: IO [PGBool]
        let resultExpected = True
        resultExpected `shouldBe` (toBool $ dataResult!!0)
      it "Single Value Timestamp With TZ deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST('2019-09-24 02:04:23+1' AS TIMESTAMPTZ);" mempty :: IO [PGTimestamp]
        let resultExpected = UTCTime (ModifiedJulianDay 58750) (secondsToDiffTime 3863)
        resultExpected `shouldBe` (toUTCTime $ dataResult!!0)
      it "Single Value UUID deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST('0cfa19ce-eed9-42f8-87b2-64f97dc27770' AS UUID);" mempty :: IO [PGUUID]
        let resultExpected = U.fromString "0cfa19ce-eed9-42f8-87b2-64f97dc27770"
        resultExpected `shouldBe` (Just (toUUID $ dataResult!!0))
      it "Single Value JSON deserialization" $ do
        jsonResult <- queryFromText conn "SELECT '{\"username\": \"florian728\", \"age\": 28}'::JSON ;" mempty :: IO [PGJsonValue]
        let resultExpected = A.Object . fromList $ [("username", "florian728"), ("age", A.Number ( read "28" :: Scientific ) )]
        resultExpected `shouldBe` (toValue $ jsonResult!!0)
      it "Single Value Strict Binary deserialization" $ do
        jsonResult <- queryFromText conn "SELECT CAST(E'\\120\\121' AS BYTEA) ;" mempty :: IO [PGByteString]
        let resultExpected = B.pack [80, 81]
        resultExpected `shouldBe` (toByteString $ jsonResult!!0)
      it "Single Value Lazy Binary deserialization" $ do
        jsonResult <- queryFromText conn "SELECT CAST(E'\\120\\121' AS BYTEA) ;" mempty :: IO [PGLazyByteString]
        let resultExpected = BSL.pack [80, 81]
        resultExpected `shouldBe` (toLazyByteString $ jsonResult!!0)
    describe "User Datatype Deserialization tests" $ do
      it "Full User deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST('Florian :)' AS TEXT), CAST('t' AS BOOL);" mempty :: IO [User]
        let resultExpected = User "Florian :)" True
        resultExpected `shouldBe` (dataResult!!0)
      it "Full UserDetails deserialization" $ do
        dataResult <- queryFromText conn "SELECT CAST(28 AS SMALLINT), CAST('{\"paid_user\": true, \"registered_at\": \"2019-08-27\"}' AS JSON);" mempty :: IO [UserDetails]
        let resultExpected = UserDetails 28 (A.Object . fromList $ [("paid_user", A.Bool True), ("registered_at", "2019-08-27")])
        resultExpected `shouldBe` (dataResult!!0)