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]