packages feed

cielo-0.1.2.0: test/Web/Payments/CieloSpec.hs

module Web.Payments.CieloSpec where

import           Control.Monad
import           Control.Monad.IO.Class
import           Data.Aeson
import           Data.Default
import           Data.Text                (Text)
import           Data.UUID
import           Data.UUID.V4
import           Test.Hspec
import           Text.Show.Pretty

import           Web.Payments.Cielo
import           Web.Payments.Cielo.Types

data DocTestCase = DocTestCase Text Text Int Text
docTestCases = [ DocTestCase "Autorizado" "0000000000000001" 4 "Operação realizada com sucesso"
               , DocTestCase "Autorizado" "0000000000000004" 4 "Operação realizada com sucesso"
               , DocTestCase "Não Autorizado" "0000000000000002" 2 "Não Autorizada"
               , DocTestCase "Não Autorizado" "0000000000000007" 77 "Cartão Cancelado"
               , DocTestCase "Não Autorizado" "0000000000000008" 70 "Problemas com o Cartão de Crédito"
               , DocTestCase "Não Autorizado" "0000000000000005" 78 "Cartão Bloqueado"
               , DocTestCase "Não Autorizado" "0000000000000003" 57 "Cartão Expirado"
               , DocTestCase "Não Autorizado" "0000000000000006" 99 "Time Out"
               ]

data DocRandomTestCase = DocRandomTestCase Text Text [Int] [Text]
docRandomTestCase = DocRandomTestCase "Autorização Aleatória" "0000000000000009" [ 4, 99 ] [ "Operation Successful", "Time Out" ]

spec :: Spec
spec = describe "cielo" $ do
    cnf <- runIO cieloConfigFromEnv
    describe "createSale" $ do
        it "creates a sale with cielo" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                      , creditCardHolder = "Pedro Tacla Yamada"
                                                                                      , creditCardExpirationDate = "12/2023"
                                                                                      , creditCardSecurityCode = Just "123"
                                                                                      , creditCardBrand = "visa"
                                                                                      }
                                                            , paymentAmount = Just 10000
                                                            }
                                        }
                liftIO $ pPrint sale

        it "creates recurrent sales" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                      , creditCardHolder = "Pedro Tacla Yamada"
                                                                                      , creditCardExpirationDate = "12/2023"
                                                                                      , creditCardSecurityCode = Just "123"
                                                                                      , creditCardBrand = "visa"
                                                                                      }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def
                                                            }
                                        }
                liftIO $ pPrint sale

        it "creates recurrent sales with start dates" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                      , creditCardHolder = "Pedro Tacla Yamada"
                                                                                      , creditCardExpirationDate = "12/2023"
                                                                                      , creditCardSecurityCode = Just "123"
                                                                                      , creditCardBrand = "visa"
                                                                                      }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale

        it "creates recurrent sales with annual intervals" $ do
            sale <- runCielo cnf $ do
                        uuid <- getMerchantOrderId
                        sale <- createSale Sale { saleMerchantOrderId = uuid
                                                , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                                     }
                                                , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                              , creditCardHolder = "Pedro Tacla Yamada"
                                                                                              , creditCardExpirationDate = "12/2023"
                                                                                              , creditCardSecurityCode = Just "123"
                                                                                              , creditCardBrand = "visa"
                                                                                              }
                                                                    , paymentAmount = Just 10000
                                                                    , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                         , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                         }
                                                                    }
                                                }
                        liftIO $ pPrint sale
                        return sale
            let Just intl = recurrentPaymentInterval <$> paymentRecurrentPayment (salePayment sale)
            intl `shouldBe` Just IntervalAnnual

    describe "cancelRecurrentPayment" $
        it "cancels recurrent payments" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                      , creditCardHolder = "Pedro Tacla Yamada"
                                                                                      , creditCardExpirationDate = "12/2023"
                                                                                      , creditCardSecurityCode = Just "123"
                                                                                      , creditCardBrand = "visa"
                                                                                      }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just paymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                cancelRecurrentPayment paymentId

    describe "updateRecurrentPaymentCustomer" $
        it "updates recurrent payments' customer" $ do
            eml <- runCielo cnf $ do
                       uuid <- getMerchantOrderId
                       sale <- createSale Sale { saleMerchantOrderId = uuid
                                               , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                                    }
                                               , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                                  , creditCardHolder = "Pedro Tacla Yamada"
                                                                                                  , creditCardExpirationDate = "12/2023"
                                                                                                  , creditCardSecurityCode = Just "123"
                                                                                                  , creditCardBrand = "visa"
                                                                                                  }
                                                                   , paymentAmount = Just 10000
                                                                   , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                        , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                        }
                                                                   }
                                               }
                       liftIO $ pPrint sale
                       let Just paymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                       updateRecurrentPaymentCustomer paymentId
                                                      (def { customerEmail = Just "yamada@beijaflor.io"
                                                           , customerName = "Pedro Tacla Yamada"
                                                           })
                       RecurrentPaymentQuery{..} <- queryRecurrentSale paymentId
                       return $ customerEmail recurrentPaymentQueryCustomer
            eml `shouldBe` Just "yamada@beijaflor.io"

    describe "salesByMerchantOrderQuery" $
        it "responds with all payments for a merchant uuid" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                query <- querySalesByMerchantOrderId uuid
                liftIO $ pPrint query

    describe "uncancelRecurrentPayment" $
        it "uncancels recurrent payments" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just paymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                cancelRecurrentPayment paymentId
                uncancelRecurrentPayment paymentId

    describe "updateRecurrentPaymentPayment" $
        it "works" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just paymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                updateRecurrentPaymentPayment paymentId
                    def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                       , creditCardHolder = "Pedro Tacla Yamada"
                                                       , creditCardExpirationDate = "12/2023"
                                                       , creditCardSecurityCode = Just "123"
                                                       , creditCardBrand = "visa"
                                                       }
                        , paymentAmount = Just 123
                        , paymentInstallments = Just 1
                        }
                rpayment <- queryRecurrentSale paymentId
                liftIO $ pPrint rpayment

    describe "updateRecurrentPaymentNextPaymentAmount" $
        it "works" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just rpaymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                updateRecurrentPaymentNextPaymentAmount rpaymentId 123413
                rpayment <- queryRecurrentSale rpaymentId
                liftIO $ pPrint rpayment

    describe "updateRecurrentPaymentNextPaymentDate" $
        it "works" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            , paymentRecurrentPayment = Just def { recurrentPaymentStartDate = Just "2018-12-03"
                                                                                                 , recurrentPaymentInterval = Just IntervalAnnual
                                                                                                 }
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just rpaymentId = join (recurrentPaymentRecurrentPaymentId <$> paymentRecurrentPayment (salePayment sale))
                updateRecurrentPaymentNextPaymentDate rpaymentId "2016-12-12"
                rpayment <- queryRecurrentSale rpaymentId
                liftIO $ pPrint rpayment

    describe "querySale" $
        it "works" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                           , creditCardHolder = "Pedro Tacla Yamada"
                                                                                           , creditCardExpirationDate = "12/2023"
                                                                                           , creditCardSecurityCode = Just "123"
                                                                                           , creditCardBrand = "visa"
                                                                                           }
                                                            , paymentAmount = Just 10000
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just paymentId = paymentPaymentId (salePayment sale)
                sale' <- querySale paymentId
                liftIO $ pPrint sale'

    describe "captureSale / voidSale" $
        it "works" $
            runCielo cnf $ do
                uuid <- getMerchantOrderId
                sale <- createSale Sale { saleMerchantOrderId = uuid
                                        , saleCustomer = def { customerName = "Pedro Tacla Yamada"
                                                             }
                                        , salePayment = def { paymentCreditCard = Just def { creditCardCardNumber = "0000000000000001"
                                                                                      , creditCardHolder = "Pedro Tacla Yamada"
                                                                                      , creditCardExpirationDate = "12/2023"
                                                                                      , creditCardSecurityCode = Just "123"
                                                                                      , creditCardBrand = "visa"
                                                                                      }
                                                            , paymentAmount = Just 10000
                                                            }
                                        }
                liftIO $ pPrint sale
                let Just paymentId = paymentPaymentId (salePayment sale)
                sale''' <- captureSale paymentId (Just 9000) Nothing
                liftIO $ pPrint sale'''
                sale'' <- voidSale paymentId (Just 1000)
                liftIO $ pPrint sale''