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]