packages feed

stripe-haskell-0.1.4.1: tests/Test/Charge.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
module Test.Charge where

import           Control.Monad
import           Data.Either
import           Data.Text              (Text)
import           Test.Hspec
import           Web.Stripe
import           Web.Stripe.Charge
import           Web.Stripe.Customer

chargeTests :: StripeConfig -> Spec
chargeTests config =
  describe "Charge tests" $ do
    chargeCustomerTest
    retrieveChargeTest
    updateChargeTest
    retrieveExpandedChargeTest
    retrieveAllChargesTest
    captureChargeTest
  where
    cn  = CardNumber "4242424242424242"
    em  = ExpMonth 12
    ey  = ExpYear 2015
    cvc = CVC "123"
    chargeCustomerTest = 
      it "Charges a customer succesfully" $ do
        result <- stripe config $ do
          Customer { customerId = cid } <- createCustomerByCard cn em ey cvc
          charge <- chargeCustomer cid USD 100 Nothing
          void $ deleteCustomer cid
          return charge
        result `shouldSatisfy` isRight
    retrieveChargeTest = 
      it "Retrieves a charge succesfully" $ do
        result <- stripe config $ do
          Customer { customerId = cid } <- createCustomerByCard cn em ey cvc
          Charge { chargeId = chid } <- chargeCustomer cid USD 100 Nothing
          result <- getCharge chid
          void $ deleteCustomer cid
          return result
        result `shouldSatisfy` isRight
    updateChargeTest =
      it "Updates a charge succesfully" $ do
        result <- stripe config $ do
          Customer { customerId = cid } <- createCustomerByCard cn em ey cvc
          Charge { chargeId = chid } <- chargeCustomer cid USD 100 Nothing
          _ <- updateCharge chid "Cool" [("hi", "there")]
          result <- getCharge chid
          void $ deleteCustomer cid
          return result
        result `shouldSatisfy` isRight
        let Right Charge { chargeMetaData = cmd, chargeDescription = desc } = result
        cmd `shouldBe` [("hi", "there")]
        desc `shouldSatisfy` (==(Just "Cool" :: Maybe Text))
    retrieveExpandedChargeTest =
      it "Retrieves an expanded charge succesfully" $ do
        result <- stripe config $ do
          Customer { customerId = cid } <- createCustomerByCard cn em ey cvc
          Charge { chargeId = chid } <- chargeCustomer cid USD 100 Nothing
          result <- getChargeExpandable chid ["balance_transaction", "customer", "invoice"]
          void $ deleteCustomer cid
          return result
        result `shouldSatisfy` isRight
    retrieveAllChargesTest =
      it "Retrieves all charges" $ do
        result <- stripe config $ getCharges Nothing Nothing Nothing
        result `shouldSatisfy` isRight
    captureChargeTest = 
      it "Captures a charge - 2 Step Payment Flow" $ do
        result <- stripe config $ do
          Customer { customerId = cid } <- createCustomerByCard cn em ey cvc
          Charge { chargeId = chid } <- chargeBase 100 USD Nothing (Just cid)
                                        Nothing Nothing Nothing False 
                                        Nothing Nothing Nothing Nothing []
          result <- captureCharge chid Nothing Nothing
          void $ deleteCustomer cid
          return result
        result `shouldSatisfy` isRight
        let Right Charge { chargeCaptured = captured } = result
        captured `shouldBe` True