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

import           Data.Maybe
import           Data.Either
import           Data.String
import           Web.Stripe.Test.Prelude

import           Web.Stripe.Recipient
import           Web.Stripe.Transfer

------------------------------------------------------------------------------
-- the tests

transferTests :: StripeSpec
transferTests stripe =
  describe "Transfer tests" $ do
    it "Create a new transfer" $ do
      result <- stripe $ do
        Recipient { recipientId = rid } <-
          createRecipient name Individual -&- bankinfo
        transfer <- createTransfer rid (Amount 100) USD
        void $ deleteRecipient rid
        return transfer
      result `shouldSatisfy` isRight
    it "Retrieves a transfer" $ do
      result <- stripe $ do
        Recipient { recipientId = rid } <-
          createRecipient name Individual -&- bankinfo
        Transfer { transferId = tid }
           <- createTransfer rid (Amount 100) USD
        t <- getTransfer tid
        void $ deleteRecipient rid
        return t
      result `shouldSatisfy` isRight
    it "Retrieves a transfer expandable" $ do
      result <- stripe $ do
        Recipient { recipientId = rid } <-
          createRecipient name Individual -&- bankinfo
        Transfer { transferId = tid }
           <- createTransfer rid (Amount 100) USD
        t <- getTransfer tid -&- ExpandParams ["recipient", "balance_transaction"]
        void $ deleteRecipient rid
        return t
      result `shouldSatisfy` isRight
    it "Retrieves transfers" $ do
      result <- stripe $ do t <- getTransfers
                            return t
      result `shouldSatisfy` isRight
    it "Retrieves transfers expandable" $ do
      result <- stripe $ do t <- getTransfers -&- ExpandParams
                                   [ "data.recipient"
                                   , "data.balance_transaction"
                                   ]
                            return t
      result `shouldSatisfy` isRight
    it "Updates a transfer" $ do
      result <- stripe $ do
        Recipient { recipientId = rid } <-
          createRecipient name Individual -&- bankinfo
        Transfer { transferId = tid }
           <- createTransfer rid (Amount 100) USD
        t <- updateTransfer tid
              -&- (Description "hey there")
              -&- (MetaData [("hey", "there")])
        void $ deleteRecipient rid
        return t
      result `shouldSatisfy` isRight
      let Right Transfer {..} = result
      transferMetaData `shouldBe` (MetaData [("hey", "there")])
      transferDescription `shouldBe` (Just (Description "hey there"))
    it "Can't Cancel a committed transfer" $ do
      result <- stripe $ do
        Recipient { recipientId = rid } <-
          createRecipient
            name
            Individual
            -&- bankinfo
        Transfer { transferId = tid }
           <- createTransfer rid (Amount 100) USD
        t <- cancelTransfer tid
        void $ deleteRecipient rid
        return t
      result `shouldSatisfy` isLeft
  where
    country       = Country "US"
    routingnumber = RoutingNumber "110000000"
    accountnumber = AccountNumber "000123456789"
    name          = Name "David Johnson"
    bankinfo      = NewBankAccount country routingnumber accountnumber