packages feed

aeson-openapi-record-as-tuple-0.1.0.0: tests/spec.hs

{-# LANGUAGE NoFieldSelectors #-}

import Data.Aeson qualified as JSON
import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)
import Data.Aeson.RecordAsTuple
import Data.ByteString.Builder qualified as Builder
import Generic.Random.DerivingVia (GenericArbitraryU (..))
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck (Arbitrary (..))

main :: IO ()
main = hspec spec

spec :: Spec
spec =
  describe "roundtrips" do
    prop "example via toJSON" prop_concocted
    prop "example via toEncoding" prop_concocted_toEncoding

prop_concocted :: A -> Bool
prop_concocted a =
  JSON.fromJSON (JSON.toJSON a) == JSON.Success a

prop_concocted_toEncoding :: A -> Bool
prop_concocted_toEncoding a =
  JSON.decode enc == Just a
  where
    enc = Builder.toLazyByteString (JSON.fromEncoding (JSON.toEncoding a))

data A = A {a, b, c, d :: Maybe B}
  deriving stock (Eq, Ord, Show, Generic)
  deriving (Arbitrary) via (GenericArbitraryU A)
  deriving (ToJSON, FromJSON) via (RecordAsTuple A)

data B = B {a, b, c, d :: Maybe C}
  deriving stock (Eq, Ord, Show, Generic)
  deriving (Arbitrary) via (GenericArbitraryU B)
  deriving (ToJSON, FromJSON) via (RecordAsTuple B)

data C = C {x, y, z, w, a, b, c, d :: Maybe Int}
  deriving stock (Eq, Ord, Show, Generic)
  deriving (Arbitrary) via (GenericArbitraryU C)
  deriving (ToJSON, FromJSON) via (RecordAsTuple C)