module Hydra.API.ClientInputSpec where import Hydra.Prelude import Test.Hydra.Prelude import Data.Aeson (Result (..), fromJSON) import Data.Aeson.Lens (key) import Hydra.API.ClientInput (ClientInput) import Hydra.Cardano.Api (serialiseToTextEnvelope) import Hydra.JSONSchema (prop_specIsComplete, prop_validateJSONSchema) import Hydra.Ledger.Cardano (Tx) import Test.Aeson.GenericSpecs ( Settings (..), defaultSettings, roundtripAndGoldenADTSpecsWithSettings, ) import Test.Hydra.API.ClientInput () import Test.Hydra.Tx.Gen () import Test.QuickCheck (counterexample, forAll, property, withMaxSuccess) spec :: Spec spec :: Spec spec = Spec -> Spec forall a. SpecWith a -> SpecWith a parallel (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do Settings -> Proxy (MinimumSized (ClientInput Tx)) -> Spec forall a. (Arbitrary a, ToADTArbitrary a, Eq a, Show a, ToJSON a, FromJSON a) => Settings -> Proxy a -> Spec roundtripAndGoldenADTSpecsWithSettings Settings defaultSettings{sampleSize = 1} (Proxy (MinimumSized (ClientInput Tx)) -> Spec) -> Proxy (MinimumSized (ClientInput Tx)) -> Spec forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @(MinimumSized (ClientInput Tx)) String -> Property -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "matches JSON schema" (Property -> Spec) -> Property -> Spec forall a b. (a -> b) -> a -> b $ forall a. (HasCallStack, ToJSON a, Arbitrary a, Show a) => String -> SchemaSelector -> Property prop_validateJSONSchema @(ClientInput Tx) String "api.json" (SchemaSelector -> Property) -> SchemaSelector -> Property forall a b. (a -> b) -> a -> b $ Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "components" ((Value -> f Value) -> Value -> f Value) -> ((Value -> f Value) -> Value -> f Value) -> (Value -> f Value) -> Value -> f Value forall b c a. (b -> c) -> (a -> b) -> a -> c . Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "schemas" ((Value -> f Value) -> Value -> f Value) -> ((Value -> f Value) -> Value -> f Value) -> (Value -> f Value) -> Value -> f Value forall b c a. (b -> c) -> (a -> b) -> a -> c . Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "ClientInput" String -> Property -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "schema covers all defined client inputs" (Property -> Spec) -> Property -> Spec forall a b. (a -> b) -> a -> b $ Int -> Property -> Property forall prop. Testable prop => Int -> prop -> Property withMaxSuccess Int 1 (Property -> Property) -> Property -> Property forall a b. (a -> b) -> a -> b $ forall a. (Arbitrary a, Show a) => String -> SchemaSelector -> Property prop_specIsComplete @(ClientInput Tx) String "api.json" (SchemaSelector -> Property) -> SchemaSelector -> Property forall a b. (a -> b) -> a -> b $ Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "channels" ((Value -> f Value) -> Value -> f Value) -> ((Value -> f Value) -> Value -> f Value) -> (Value -> f Value) -> Value -> f Value forall b c a. (b -> c) -> (a -> b) -> a -> c . Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "/" ((Value -> f Value) -> Value -> f Value) -> ((Value -> f Value) -> Value -> f Value) -> (Value -> f Value) -> Value -> f Value forall b c a. (b -> c) -> (a -> b) -> a -> c . Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "publish" ((Value -> f Value) -> Value -> f Value) -> ((Value -> f Value) -> Value -> f Value) -> (Value -> f Value) -> Value -> f Value forall b c a. (b -> c) -> (a -> b) -> a -> c . Key -> SchemaSelector forall t. AsValue t => Key -> Traversal' t Value key Key "message" String -> Spec -> Spec forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "FromJSON (ValidatedTx era)" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do String -> Property -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "accepts transactions produced via cardano-cli" (Property -> Spec) -> Property -> Spec forall a b. (a -> b) -> a -> b $ Gen Tx -> (Tx -> Property) -> Property forall a prop. (Show a, Testable prop) => Gen a -> (a -> prop) -> Property forAll (forall a. Arbitrary a => Gen a arbitrary @Tx) ((Tx -> Property) -> Property) -> (Tx -> Property) -> Property forall a b. (a -> b) -> a -> b $ \Tx tx -> let envelope :: Value envelope = TextEnvelope -> Value forall a. ToJSON a => a -> Value toJSON (TextEnvelope -> Value) -> TextEnvelope -> Value forall a b. (a -> b) -> a -> b $ Maybe TextEnvelopeDescr -> Tx -> TextEnvelope forall a. HasTextEnvelope a => Maybe TextEnvelopeDescr -> a -> TextEnvelope serialiseToTextEnvelope (TextEnvelopeDescr -> Maybe TextEnvelopeDescr forall a. a -> Maybe a Just TextEnvelopeDescr "Tx Babbage") Tx tx in case forall a. FromJSON a => Value -> Result a fromJSON @Tx Value envelope of Success{} -> Bool -> Property forall prop. Testable prop => prop -> Property property Bool True Error String e -> String -> Property -> Property forall prop. Testable prop => String -> prop -> Property counterexample (Text -> String forall a. ToString a => a -> String toString (Text -> String) -> Text -> String forall a b. (a -> b) -> a -> b $ String -> Text forall a. ToText a => a -> Text toText String e) (Property -> Property) -> Property -> Property forall a b. (a -> b) -> a -> b $ Bool -> Property forall prop. Testable prop => prop -> Property property Bool False