import Test.Tasty
import Test.Tasty.HUnit
import Data.List
import Data.Ord
import Control.Lens (view, (&), (.~), (^.))
import Control.Monad.IO.Class (liftIO)
import qualified Data.Currency as Currency
import Data.Default (def)
import qualified Data.Time as Time
import qualified Fixtures
import Mollie.API.Types
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests"
[ paymentTests
, customerTests
, refundTests
, subscriptionTests
, mandateTests
, chargebackTests
]
paymentTests = testGroup "Payment tests"
[ testCase "Payment list count" $ do
paymentsList <- Fixtures.payments
paymentsList ^. count @?= 5
, testCase "Payment fields" $ do
[payment] <- fmap (view embedded) Fixtures.payments
payment ^. status @?= PaymentOpen
payment ^. mode @?= Test
payment ^. isCancelable @?= False
payment ^. amount @?= (def & value .~ "75.00" & currency .~ Currency.GBP)
payment ^. method @?= Just Ideal
]
customerTests = testGroup "Customer tests"
[ testCase "Customer list count" $ do
customersList <- Fixtures.customers
customersList ^. count @?= 1
, testCase "Customer fields" $ do
[customer] <- fmap (view embedded) Fixtures.customers
customer ^. name @?= Just "Customer A"
customer ^. email @?= Just "customer@example.org"
customer ^. recentlyUsedMethods @?= [Creditcard, Ideal]
]
refundTests = testGroup "Refund tests"
[ testCase "Refund list count" $ do
refundsList <- Fixtures.refunds
refundsList ^. count @?= 5
, testCase "Refund fields" $ do
[refund] <- fmap (view embedded) Fixtures.refunds
refund ^. amount @?= (def & value .~ "5.95")
refund ^. status @?= RefundPending
refund ^. paymentId @?= "tr_WDqYK6vllg"
]
subscriptionTests = testGroup "Subscription tests"
[ testCase "Subscription list count" $ do
subscriptionsList <- Fixtures.subscriptions
subscriptionsList ^. count @?= 3
, testCase "Subscription fields" $ do
[subscription] <- fmap (view embedded) Fixtures.subscriptions
subscription ^. mode @?= Live
subscription ^. status @?= SubscriptionActive
subscription ^. amount @?= (def & value .~ "25.00")
subscription ^. times @?= Just 4
subscription ^. interval @?= "3 months"
subscription ^. method @?= Just Creditcard
]
mandateTests = testGroup "Mandate tests"
[ testCase "Mandate list count" $ do
mandatesList <- Fixtures.mandates
mandatesList ^. count @?= 1
, testCase "Mandate fields" $ do
[mandate] <- fmap (view embedded) Fixtures.mandates
mandate ^. status @?= MandateValid
mandate ^. method @?= Directdebit
mandate ^. mandateReference @?= Nothing
mandate ^. signatureDate @?= Just "2018-05-07"
, testCase "Mandate details" $ do
[mandate] <- fmap (view embedded) Fixtures.mandates
-- TODO: figure out why `mandate ^. details` throws an infinite type error
let Just details = _mandateDetails mandate
details ^. consumerName @?= Just "John Doe"
details ^. consumerAccount @?= Just "NL55INGB0000000000"
details ^. consumerBic @?= Just "INGBNL2A"
]
chargebackTests = testGroup "Chargeback tests"
[ testCase "Chargeback list count" $ do
chargebackList <- Fixtures.chargebacks
chargebackList ^. count @?= 1
, testCase "Chargeback fields" $ do
[chargeback] <- fmap (view embedded) Fixtures.chargebacks
-- Resolves to 2018-03-14T17:00:52
let time = Time.UTCTime (Time.fromGregorian 2018 3 14) (17*60*60 + 0*60 + 52)
chargeback ^. amount @?= (def & value .~ "43.38" & currency .~ Currency.USD)
chargeback ^. settlementAmount @?= Just (def & value .~ "35.07")
chargeback ^. createdAt @?= time
chargeback ^. reversedAt @?= Nothing
chargeback ^. paymentId @?= "tr_WDqYK6vllg"
]