packages feed

paypal-adaptive-hoops-0.11.0.0: tests/Local/Parser.hs

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]