{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RebindableSyntax  #-}
{-# LANGUAGE RecordWildCards   #-}
module Web.Stripe.Test.Refund where

import           Data.Either
import           Test.Hspec
import           Web.Stripe.Charge
import           Web.Stripe.Customer
import           Web.Stripe.Refund
import           Web.Stripe.Test.Prelude

------------------------------------------------------------------------------
-- | Card Info
cn :: CardNumber
cn  = CardNumber "4242424242424242"

em :: ExpMonth
em  = ExpMonth 12

ey :: ExpYear
ey  = ExpYear 2020

cvc :: CVC
cvc = CVC "123"

cardinfo :: NewCard
cardinfo = (mkNewCard cn em ey) { newCardCVC = Just cvc }

------------------------------------------------------------------------------
-- | Refund Tests
refundTests :: StripeSpec
refundTests stripe = do
    describe "Refund Tests" $ do
      it "Creates a refund succesfully" $ do
        result <- stripe $ do
          Customer { customerId = cid }  <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          refund <- createRefund chid
          void $ deleteCustomer cid
          return refund
        result `shouldSatisfy` isRight
      it "Retrieves a refund succesfully" $ do
        result <- stripe $ do
          Customer { customerId = cid  } <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          Refund   { refundId   = rid  } <- createRefund chid
          void $ deleteCustomer cid
          void $ getRefund chid rid
        result `shouldSatisfy` isRight
      it "Retrieves a refund succesfully with expansion" $ do
        result <- stripe $ do
          Customer { customerId = cid  } <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          Refund   { refundId   = rid  } <- createRefund chid
          r <- getRefund chid rid -&- ExpandParams  ["balance_transaction"]
          void $ deleteCustomer cid
          return r
        result `shouldSatisfy` isRight
      it "Updates a refund succesfully" $ do
        result <- stripe $ do
          Customer { customerId = cid  } <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          Refund   { refundId   = rid  } <- createRefund chid
          ref <- updateRefund chid rid -&- (MetaData [("hello","there")])
          void $ deleteCustomer cid
          return ref
        result `shouldSatisfy` isRight
        let Right Refund{..} = result
        refundMetaData `shouldBe` (MetaData [("hello","there")])
      it "Retrieves all refunds for a Charge" $ do
        result <- stripe $ do
          Customer { customerId = cid  } <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          Refund { } <- createRefund chid
          r <- getRefunds chid
          void $ deleteCustomer cid
          return r
        result `shouldSatisfy` isRight
        let Right StripeList {..} = result
        length list `shouldBe` 1
      it "Retrieves all refunds for a Charge with expansion" $ do
        result <- stripe $ do
          Customer { customerId = cid  } <- createCustomer -&- cardinfo
          Charge   { chargeId   = chid } <- createCharge (Amount 100) USD -&- cid
          Refund { } <- createRefund chid
          r <- getRefunds chid -&- ExpandParams ["data.balance_transaction"]
          void $ deleteCustomer cid
          return r
        result `shouldSatisfy` isRight
        let Right StripeList {..} = result
        length list `shouldBe` 1