packages feed

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

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

import           Data.Either
import           Control.Monad
import           Data.Maybe

import           Test.Hspec
import           Test.Util

import           Web.Stripe
import           Web.Stripe.Subscription
import           Web.Stripe.Customer
import           Web.Stripe.Plan
import           Web.Stripe.Coupon

subscriptionTests :: StripeConfig -> Spec
subscriptionTests config = do
  describe "Subscription tests" $ do
    it "Succesfully creates a Subscription" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        sub <- createSubscription cid planid []
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
    it "Succesfully retrieves a Subscription" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        Subscription { subscriptionId = sid } <- createSubscription cid planid []
        sub <- getSubscription cid sid
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
    it "Succesfully retrieves a Subscription expanded" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        Subscription { subscriptionId = sid } <- createSubscription cid planid []
        sub <- getSubscriptionExpandable cid sid ["customer"]
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
    it "Succesfully retrieves a Customer's Subscriptions expanded" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        void $ createSubscription cid planid []
        sub <- getSubscriptionsExpandable cid Nothing Nothing Nothing ["data.customer"]
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
    it "Succesfully retrieves a Customer's Subscriptions" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        void $ createSubscription cid planid []
        sub <- getSubscriptions cid Nothing Nothing Nothing 
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
    it "Succesfully updates a Customer's Subscriptions" $ do
      planid <- makePlanId
      secondPlanid <- makePlanId
      couponid <- makeCouponId
      result <- stripe config $ do
        Coupon { } <-
          createCoupon
             (Just couponid)
             Once
             (Just $ AmountOff 1)
             (Just USD)
             Nothing
             Nothing
             Nothing
             Nothing
             []
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        void $ createPlan secondPlanid
                        0 -- free plan
                        USD
                        Year
                        "second sample plan"
                        []
        Subscription { subscriptionId = sid } <- createSubscription cid planid []
        _ <- updateSubscription cid sid (Just couponid) Nothing [("hi","there")]
        sub <- updateSubscription cid sid (Just couponid) (Just secondPlanid) [("hi","there")]
        void $ deletePlan planid
        void $ deletePlan secondPlanid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
      let Right Subscription {..} = result
      subscriptionMetaData `shouldBe` [("hi", "there")]
      subscriptionDiscount `shouldSatisfy` isJust
    it "Succesfully cancels a Customer's Subscription" $ do
      planid <- makePlanId
      result <- stripe config $ do
        Customer { customerId = cid } <- createEmptyCustomer
        void $ createPlan planid
                        0 -- free plan
                        USD
                        Month
                        "sample plan"
                        []
        Subscription { subscriptionId = sid } <- createSubscription cid planid []
        sub <- cancelSubscription cid sid False
        void $ deletePlan planid
        void $ deleteCustomer cid
        return sub
      result `shouldSatisfy` isRight
      let Right Subscription {..} = result
      subscriptionStatus `shouldBe` Canceled