module Local.Parser (unitParser) where import Data.Aeson import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy.Char8 as BSC import Data.Char (isSpace) import PayPal.Adaptive import qualified PayPal.Adaptive.Deposit as DP import qualified PayPal.Adaptive.Withdrawal as WD import Test.Framework (Test, testGroup) import Test.Framework.Providers.HUnit (testCase) import Test.HUnit (Assertion, (@=?)) import Utils unitParser :: Test unitParser = testGroup "parsers" [ testCase "correctly encodes a Withdrawal" serializeWithdrawal , testCase "correctly encodes a Deposit" serializeDeposit , testCase "correctly decodes a Withdrawal response" parseWithdrawalResp , testCase "correctly decodes a Deposit response" parseDepositResp , testCase "correctly decodes a LookupPayment response" parseLookupResp , testCase "correctly decodes an error code response" parseErrResp ] eqSerialized :: (ToJSON a) => FilePath -> a -> Assertion eqSerialized x y = do expected <- B.readFile x let actual = encode y filterBS expected @=? filterBS actual where filterBS :: BSC.ByteString -> BSC.ByteString filterBS = BSC.filter (not . isSpace) eqParsed :: (Show a, Eq a, FromJSON a) => a -> FilePath -> Assertion eqParsed expected x = do b <- B.readFile x actual <- assertRight (eitherDecode b) expected @=? actual serializeWithdrawal :: Assertion serializeWithdrawal = "tests/Local/json/serializeWithdrawal.json" `eqSerialized` a where a :: WD.SerializeWithdrawal a = WD.SerializeWithdrawal b "payments@mail.com" b :: WD.Withdrawal b = WD.Withdrawal { WD._amount = USD 100 , WD._receiverEmail = "user@mail.com" } serializeDeposit :: Assertion serializeDeposit = "tests/Local/json/serializeDeposit.json" `eqSerialized` a where a :: DP.SerializeDeposit a = DP.SerializeDeposit b "payments@mail.com" b :: DP.Deposit b = DP.Deposit { DP._amount = USD 100 , DP._senderEmail = "user@mail.com" , DP._returnUrl = "https://example.com/" , DP._cancelUrl = "https://example.com/cancel" } parseWithdrawalResp :: Assertion parseWithdrawalResp = expected `eqParsed` "tests/Local/json/parseWithdrawalResp.json" where expected = PayResp { _prPayError = Nothing , _prPayExecStatus = PeCompleted , _prPayKey = PayKey "AP-21C62741YR509274N" , _prPayInfos = [p] } p = PayInfo { _piReceiver = r , _piSenderTransactionId = Just (TransactionId "7TU31598YN877045D") , _piTransactionStatus = Just TsCompleted , _piTransactionId = Just (TransactionId "1DG71997KF688883E") } r = Receiver { _reAmount = "1.00" , _reEmail = "user@mail.com" , _reAccountId = "69D9D7KVA6WAN" } parseDepositResp :: Assertion parseDepositResp = expected `eqParsed` "tests/Local/json/parseDepositResp.json" where expected = PayResp { _prPayError = Nothing , _prPayExecStatus = PeCreated , _prPayKey = PayKey "AP-3NL080742J1818731" , _prPayInfos = [] } parseLookupResp :: Assertion parseLookupResp = expected `eqParsed` "tests/Local/json/parseLookupResp.json" where expected = PayResp { _prPayError = Nothing , _prPayExecStatus = PeCompleted , _prPayKey = PayKey "AP-5XY65045XE4097324" , _prPayInfos = [p] } p = PayInfo { _piReceiver = r , _piSenderTransactionId = Just (TransactionId "9U084775U2533540T") , _piTransactionStatus = Just TsCompleted , _piTransactionId = Just (TransactionId "0CL88103PF900230J") } r = Receiver { _reAmount = "1.00" , _reEmail = "user@mail.com" , _reAccountId = "69D9D7KVA6WAN" } parseErrResp :: Assertion parseErrResp = expected `eqParsed` "tests/Local/json/parseErrResp.json" where expected = AeErrCodes [560022]