packages feed

paypal-adaptive-hoops-0.9.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 Data.Default
import Test.Framework (Test, testGroup)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit (Assertion, (@=?))
import Utils
import Web.PayPal.Adaptive
import Web.PayPal.Adaptive.Internal

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 :: SerializeWithdrawal
    a = SerializeWithdrawal b "payments@mail.com"

    b :: Withdrawal
    b = def
      { _wdAmount = USD 100
      , _wdReceiverEmail = "user@mail.com"
      }

serializeDeposit :: Assertion
serializeDeposit = "tests/Local/json/serializeDeposit.json" `eqSerialized` a
  where
    a :: SerializeDeposit
    a = SerializeDeposit b "payments@mail.com"

    b :: Deposit
    b = def
      { _dpAmount = USD 100
      , _dpSenderEmail  = "user@mail.com"
      }

parseWithdrawalResp :: Assertion
parseWithdrawalResp = expected `eqParsed` "tests/Local/json/parseWithdrawalResp.json"
  where
    expected = PayResp
      { _prPayError      = Nothing
      , _prPayExecStatus = PeCompleted
      , _prPayKey        = PayKey "AP-21C62741YR509274N"
      , _prPayInfo       = [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"
      , _prPayInfo       = []
      }

parseLookupResp :: Assertion
parseLookupResp = expected `eqParsed` "tests/Local/json/parseLookupResp.json"
  where
    expected = PayResp
      { _prPayError      = Nothing
      , _prPayExecStatus = PeCompleted
      , _prPayKey        = PayKey "AP-5XY65045XE4097324"
      , _prPayInfo       = [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]