purescript-pg/test/Test.Data.Postgres.Generic.purs
2024-04-02 15:58:34 -05:00

108 lines
3.6 KiB
Haskell

module Test.Data.Postgres.Custom where
import Prelude
import Control.Monad.Error.Class (liftEither)
import Control.Monad.Except (runExceptT)
import Data.Bifunctor (lmap)
import Data.DateTime (DateTime(..))
import Data.Generic.Rep (class Generic)
import Data.Maybe (Maybe(..))
import Data.Newtype (unwrap)
import Data.Postgres (deserialize, serialize, smash)
import Data.Postgres.Custom (class CustomDeserialize, class CustomSerialize, customDeserialize)
import Data.Postgres.Custom.Enum (class CustomEnum, create, enumDeserialize, enumPrintExpr, enumSerialize, genericEnumVariants, genericParseEnum, genericPrintEnum, parseEnum, printEnum)
import Data.Show.Generic (genericShow)
import Effect.Class (liftEffect)
import Test.Spec (Spec, describe, it)
import Test.Spec.Assertions (shouldEqual)
import Unsafe.Coerce (unsafeCoerce)
data Enum1 = E1A
derive instance Generic Enum1 _
derive instance Eq Enum1
instance Show Enum1 where
show = genericShow
instance CustomSerialize Enum1 "enum_1" where
customPrintExpr a = enumPrintExpr a
customSerialize a = enumSerialize a
instance CustomDeserialize Enum1 "enum_1" where
customDeserialize a = enumDeserialize a
instance CustomEnum Enum1 "enum_1" where
printEnum = genericPrintEnum
parseEnum = genericParseEnum
enumVariants = genericEnumVariants
data Enum2 = E2A | E2B
derive instance Generic Enum2 _
derive instance Eq Enum2
instance Show Enum2 where
show = genericShow
instance CustomSerialize Enum2 "enum_2" where
customPrintExpr a = enumPrintExpr a
customSerialize a = enumSerialize a
instance CustomDeserialize Enum2 "enum_2" where
customDeserialize a = enumDeserialize a
instance CustomEnum Enum2 "enum_2" where
printEnum a = genericPrintEnum a
parseEnum a = genericParseEnum a
enumVariants = genericEnumVariants
data Enum5 = E5A | E5B | E5C | E5D | E5E
derive instance Generic Enum5 _
derive instance Eq Enum5
instance Show Enum5 where
show = genericShow
instance CustomSerialize Enum5 "enum_5" where
customPrintExpr a = enumPrintExpr a
customSerialize a = enumSerialize a
instance CustomDeserialize Enum5 "enum_5" where
customDeserialize a = enumDeserialize a
instance CustomEnum Enum5 "enum_5" where
printEnum a = genericPrintEnum a
parseEnum a = genericParseEnum a
enumVariants = genericEnumVariants
spec :: Spec Unit
spec =
describe "Test.Data.Postgres.Custom" do
describe "Enum" do
it "serialize" do
act <- liftEffect $ smash $ serialize E5A
exp <- liftEffect $ smash $ serialize "E5A"
act `shouldEqual` exp
it "deserialize" do
act <- liftEffect $ smash $ deserialize $ unsafeCoerce "E5A"
act `shouldEqual` E5A
it "create" do
(_.text $ unwrap $ create @Enum1) `shouldEqual` "create type enum_1 as enum ('E1A');"
(_.text $ unwrap $ create @Enum2) `shouldEqual` "create type enum_2 as enum ('E2A', 'E2B');"
(_.text $ unwrap $ create @Enum5) `shouldEqual` "create type enum_5 as enum ('E5A', 'E5B', 'E5C', 'E5D', 'E5E');"
it "parseEnum" do
parseEnum "E1A" `shouldEqual` Just E1A
parseEnum "E2A" `shouldEqual` Just E2A
parseEnum "E2B" `shouldEqual` Just E2B
parseEnum "E5B" `shouldEqual` Just E5B
it "printEnum" do
printEnum E1A `shouldEqual` "E1A"
printEnum E2A `shouldEqual` "E2A"
printEnum E2B `shouldEqual` "E2B"
printEnum E5D `shouldEqual` "E5D"
it "enumPrintExpr" do
enumPrintExpr E1A `shouldEqual` Just "'E1A' :: enum_1"
enumPrintExpr E2A `shouldEqual` Just "'E2A' :: enum_2"
enumPrintExpr E2B `shouldEqual` Just "'E2B' :: enum_2"
enumPrintExpr E5D `shouldEqual` Just "'E5D' :: enum_5"