content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE RebindableSyntax #-}
  {-# LANGUAGE RankNTypes #-}
  module Web.Stripe.Test.Recipient where
  
  import           Data.Either
  import           Test.Hspec
  import           Web.Stripe.Test.Prelude
  import           Web.Stripe.Recipient
  
  recipientTests :: StripeSpec
  recipientTests stripe = do
    describe "Recipient tests" $ do
      it "Succesfully creates an Individual Recipient" $ do
        result <- stripe $ do
          recipient@Recipient { recipientId = rid } <- createRecipient
            name
            Individual
          void $ deleteRecipient rid
          return recipient
        result `shouldSatisfy` isRight
        let Right Recipient {..} = result
        recipientType `shouldBe` Individual
      it "Succesfully creates a Corporation Recipient" $ do
        result <- stripe $ do
          recipient@Recipient { recipientId = rid } <-
             createRecipient
               name
               Corporation
          void $ deleteRecipient rid
          return recipient
        result `shouldSatisfy` isRight
        let Right Recipient {..} = result
        recipientType `shouldBe` Corporation
      it "Succesfully retrieves a Recipient" $ do
        result <- stripe $ do
          Recipient { recipientId = rid } <-
            createRecipient
              name
              Corporation
          recipient <- getRecipient rid
          void $ deleteRecipient rid
          return recipient
        result `shouldSatisfy` isRight
        let Right Recipient {..} = result
        recipientType `shouldBe` Corporation
      it "Succesfully retrieves a Recipient" $ do
        result <- stripe $ do
          Recipient { recipientId = rid } <-
            createRecipient
              name
              Corporation
          recipient <- getRecipient rid
          void $ deleteRecipient rid
          return recipient
        result `shouldSatisfy` isRight
        let Right Recipient {..} = result
        recipientType `shouldBe` Corporation
      it "Succesfully updates a Recipient" $ do
        result <- stripe $ do
          Recipient { recipientId = rid } <-
            createRecipient
              name
              Corporation
          recipient <- updateRecipient rid
                         -&- (Name "David R. Johnson")
                         -&- taxid
                         -&- (NewBankAccount country routingnumber accountnumber)
                         -&- email
                         -&- description
                         -&- meta
          void $ deleteRecipient rid
          return recipient
        result `shouldSatisfy` isRight
        let Right Recipient {..} = result
        recipientType `shouldBe` Corporation
        recipientName `shouldBe` (Name "David R. Johnson")
        recipientDescription `shouldBe` (Just description)
        recipientEmail `shouldBe` (Just email)
      it "Succesfully deletes a Recipient" $ do
        result <- stripe $ do
          Recipient { recipientId = rid } <-
            createRecipient
              name
              Corporation
          void $ deleteRecipient rid
        result `shouldSatisfy` isRight
    where name      = Name "David M. Johnson"
          meta      = MetaData [("this", "thing")]
          email     = Email "code@dmj.io"
          country   = Country "US"
          description = Description "description"
          routingnumber = RoutingNumber "110000000"
          accountnumber = AccountNumber "000123456789"
          taxid = TaxID "000000000"
  