packages feed

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

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

import           Data.Either

import           Control.Monad          (void)
import           Test.Util        
import           Test.Hspec

import           Web.Stripe
import           Web.Stripe.Invoice
import           Web.Stripe.Plan
import           Web.Stripe.Customer
import           Web.Stripe.InvoiceItem

invoiceTests :: StripeConfig -> Spec
invoiceTests config = do
  describe "Invoice tests" $ do
    it "Create an Invoice via Invoice item on a Customer" $ do
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        i <- createInvoice cid meta 
        void $ deleteCustomer cid
        return i
      result `shouldSatisfy` isRight
    it "Retrieve an Invoice" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        Invoice { invoiceId = Just iid } <- createInvoice cid meta 
        getInvoice iid
      result `shouldSatisfy` isRight
    it "Retrieve an Invoice Expanded" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        Invoice { invoiceId = Just iid } <- createInvoice cid meta 
        getInvoiceExpandable iid ["customer", "charge"]
      result `shouldSatisfy` isRight
    it "Retrieve an Invoice's Line Items" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        Invoice { invoiceId = Just iid } <- createInvoice cid meta 
        getInvoiceLineItems iid Nothing Nothing Nothing
      result `shouldSatisfy` isRight
    it "Retrieve Invoices" $ do
      result <- stripe config $ getInvoices Nothing Nothing Nothing 
      result `shouldSatisfy` isRight
    it "Retrieve Invoices Expandable" $ do
      result <- stripe config $ getInvoicesExpandable Nothing Nothing Nothing
                ["data.customer", "data.charge"]
      result `shouldSatisfy` isRight
    it "Updates an Invoice" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        Invoice { invoiceId = Just iid } <- createInvoice cid meta 
        updateInvoice iid [("some", "thing")]
      result `shouldSatisfy` isRight
      let Right Invoice {..} = result
      invoiceMetaData `shouldBe` [("some", "thing")]
    it "Retrieve an Upcoming Invoice" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        getUpcomingInvoice cid
      result `shouldSatisfy` isRight
    it "Pay an Invoice" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createCustomerByCard credit em ey cvc
        Plan { } <- createPlan planid 20 USD Day "testplan" []
        InvoiceItem { } <- createInvoiceItem cid 100 USD Nothing Nothing Nothing []
        Invoice { invoiceId = Just iid } <- createInvoice cid meta 
        payInvoice iid
      result `shouldSatisfy` isRight
      let Right Invoice{..} = result 
      invoicePaid `shouldBe` True
  where
    meta = [ ("some","metadata") ]
    credit = CardNumber "4242424242424242"
    em  = ExpMonth 12
    ey  = ExpYear 2015
    cvc = CVC "123"