{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE RecordWildCards #-}
module Web.Stripe.Test.Dispute where
import Control.Concurrent (threadDelay)
import Data.Either (Either (Right), isRight)
import Test.Hspec
import Web.Stripe.Test.Prelude
import Web.Stripe.Test.Util
import Web.Stripe.Charge
import Web.Stripe.Customer
import Web.Stripe.Dispute
disputeTests :: StripeSpec
disputeTests stripe = do
describe "Dispute Tests" $ do
it "Creates a Dispute" $ do
result <- stripe $ do
Customer { customerId = cid } <- createCustomer -&- cardinfo
Charge { chargeId = chid } <- createCharge (Amount 100) USD -&- cid
liftIO $ threadDelay (secs 20)
Charge { chargeDispute = cd } <- getCharge chid
void $ deleteCustomer cid
return cd
result `shouldSatisfy` isRight
let Right (Just Dispute{..}) = result
disputeStatus `shouldBe` NeedsResponse
it "Makes Dispute Under Review" $ do
result <- stripe $ do
Customer { customerId = cid } <- createCustomer -&- cardinfo
Charge { chargeId = chid } <- createCharge (Amount 100) USD -&- cid
liftIO $ threadDelay (secs 10)
void $ updateDispute chid -&- evi -&- meta
liftIO $ threadDelay (secs 10)
Charge { chargeDispute = Just dispute } <- getCharge chid
void $ deleteCustomer cid
return dispute
result `shouldSatisfy` isRight
let Right Dispute {..} = result
disputeMetaData `shouldBe` meta
disputeEvidence `shouldBe` (Just evi)
disputeStatus `shouldBe` UnderReview
it "Wins a Dispute" $ do
result <- stripe $ do
Customer { customerId = cid } <- createCustomer -&- cardinfo
Charge { chargeId = chid } <- createCharge (Amount 100) USD -&- cid
liftIO $ threadDelay (secs 10)
void $ updateDispute chid -&- win -&- meta
liftIO $ threadDelay (secs 10)
Charge { chargeDispute = Just dispute } <- getCharge chid
void $ deleteCustomer cid
return dispute
result `shouldSatisfy` isRight
let Right Dispute {..} = result
disputeMetaData `shouldBe` meta
disputeEvidence `shouldBe` (Just win)
disputeStatus `shouldBe` Won
it "Loses a Dispute" $ do
result <- stripe $ do
Customer { customerId = cid } <- createCustomer -&- cardinfo
Charge { chargeId = chid } <- createCharge (Amount 100) USD -&- cid
liftIO $ threadDelay (secs 10)
void $ updateDispute chid -&- lose -&- meta
liftIO $ threadDelay (secs 10)
Charge { chargeDispute = Just dispute } <- getCharge chid
void $ deleteCustomer cid
return dispute
result `shouldSatisfy` isRight
let Right Dispute {..} = result
disputeMetaData `shouldBe` meta
disputeEvidence `shouldBe` (Just lose)
disputeStatus `shouldBe` Lost
it "Closes a Dispute" $ do
result <- stripe $ do
Customer { customerId = cid } <- createCustomer -&- cardinfo
Charge { chargeId = chid } <- createCharge (Amount 100) USD -&- cid
liftIO $ threadDelay (secs 10)
dispute <- closeDispute chid
void $ deleteCustomer cid
return dispute
result `shouldSatisfy` isRight
let Right Dispute {..} = result
disputeStatus `shouldBe` Lost
where
cn = CardNumber "4000000000000259"
em = ExpMonth 12
ey = ExpYear 2020
cvc = CVC "123"
win = Evidence "winning_evidence"
lose = Evidence "losing_evidence"
evi = Evidence "some evidence"
meta = MetaData [ ("some", "metadata") ]
cardinfo =
(mkNewCard cn em ey) { newCardCVC = Just cvc }