packages feed

paypal-adaptive-hoops-0.8.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

unitParser :: Test
unitParser = testGroup "parsers"
  [ testCase "correctly encodes a SendPayment"            serializeSendPayment
  , testCase "correctly encodes a CreatePayment"          serializeCreatePayment
  , testCase "correctly decodes a SendPayment response"   parseSendResp
  , testCase "correctly decodes a CreatePayment response" parseCreateResp
  , 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

serializeSendPayment :: Assertion
serializeSendPayment = "tests/Local/json/serializeSendPayment.json" `eqSerialized` a
  where
    a = def
      { _spReceiverList = rl
      , _spSenderEmail  = "payments@mail.com"
      }
    rl = ReceiverList
      { _rlAmount = USD 100
      , _rlEmail  = "user@mail.com"
      }

serializeCreatePayment :: Assertion
serializeCreatePayment = "tests/Local/json/serializeCreatePayment.json" `eqSerialized` a
  where
    a = def
      { _cpReceiverList = rl
      , _cpSenderEmail  = "user@mail.com"
      }
    rl = ReceiverList
      { _rlAmount = USD 100
      , _rlEmail  = "payments@mail.com"
      }

parseSendResp :: Assertion
parseSendResp = expected `eqParsed` "tests/Local/json/parseSendResp.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"
      }

parseCreateResp :: Assertion
parseCreateResp = expected `eqParsed` "tests/Local/json/parseCreateResp.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]