content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE RebindableSyntax #-}
  {-# LANGUAGE RankNTypes #-}
  module Web.Stripe.Test.Plan where
  
  import           Data.Either   (Either(..), isRight)
  import           Test.Hspec
  import           Web.Stripe.Test.Util     (makePlanId)
  import           Web.Stripe.Test.Prelude
  
  import           Web.Stripe.Plan
  import           Web.Stripe.Customer
  
  planTests :: StripeSpec
  planTests stripe = do
    describe "Plan tests" $ do
      it "Succesfully creates a Plan" $ do
        planid <- makePlanId
        result <- stripe $ do
          p <- createPlan planid
                          (Amount 0) -- free plan
                          USD
                          Month
                          (PlanName "sample plan")
          void $ deletePlan planid
          return p
        result `shouldSatisfy` isRight
      it "Succesfully deletes a Plan" $ do
        planid <- makePlanId
        result <- stripe $ do
          Plan { planId = pid } <-
            createPlan planid
            (Amount 0) -- free plan
            USD
            Month
            (PlanName "sample plan")
          void $ deletePlan pid
        result `shouldSatisfy` isRight
      it "Succesfully updates a Plan" $ do
        planid <- makePlanId
        result <- stripe $ do
          Plan { planId = pid } <-
            createPlan planid
            (Amount 0) -- free plan
            USD
            Month
            (PlanName "sample plan")
          r <- updatePlan pid
                 -&- (PlanName "cookie")
                 -&- (StatementDescription "test")
                 -&- MetaData [("key","value")]
          void $ deletePlan pid
          return r
        result `shouldSatisfy` isRight
        let Right Plan { planMetaData = pm
                       , planName = pname
                       , planDescription = pdesc
                       } = result
        pm `shouldBe` (MetaData [("key", "value")])
        pname `shouldBe` "cookie"
        pdesc `shouldBe` (Just $ StatementDescription "test")
      it "Succesfully retrieves a Plan" $ do
        planid <- makePlanId
        result <- stripe $ do
          Plan { planId = pid } <-
            createPlan planid
            (Amount 0) -- free plan
            USD
            Month
            (PlanName "sample plan")
          r <- getPlan pid
          void $ deletePlan pid
          return r
        result `shouldSatisfy` isRight
      it "Succesfully retrieves a list of Plans" $ do
        result <- stripe $ void $ getPlans
        result `shouldSatisfy` isRight
  