github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/citibank/citi_test.go (about)

     1  package citibank
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/PMoneda/flow"
     8  	"github.com/mundipagg/boleto-api/mock"
     9  	"github.com/mundipagg/boleto-api/models"
    10  	"github.com/mundipagg/boleto-api/test"
    11  	"github.com/mundipagg/boleto-api/tmpl"
    12  	"github.com/mundipagg/boleto-api/util"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  const baseMockJSON = `
    17  {
    18      "BankNumber": 745,
    19      "Authentication": {
    20          "Username": "55555555555555555555"
    21      },
    22      "Agreement": {
    23          "AgreementNumber": 55555555,
    24          "Wallet" : 100,
    25          "Agency":"0011",
    26          "Account":"0088881323",
    27          "AccountDigit" : "2"        
    28      },
    29      "Title": {
    30          "ExpireDate": "2029-09-20",
    31          "AmountInCents": 200,
    32          "OurNumber": 10000000001,
    33          "DocumentNumber":"5555555555"
    34      },
    35      "Buyer": {
    36          "Name": "Fulano de Tal",
    37          "Document": {
    38              "Type": "CNPJ",
    39              "Number": "55555555555555"
    40          }
    41      },
    42      "Recipient": {
    43        "Name": "TESTE",
    44          "Document": {
    45              "Type": "CNPJ",
    46              "Number": "55555555555555"
    47          }
    48      }
    49  }
    50  `
    51  
    52  var boletoTypeParameters = []test.Parameter{
    53  	{Input: models.Title{BoletoType: ""}, Expected: "03"},
    54  	{Input: models.Title{BoletoType: "NSA"}, Expected: "03"},
    55  	{Input: models.Title{BoletoType: "BDP"}, Expected: "03"},
    56  	{Input: models.Title{BoletoType: "DMI"}, Expected: "03"},
    57  }
    58  
    59  func TestProcessBoleto_WhenServiceRespondsSuccessfully_ShouldHasSuccessfulBoletoResponse(t *testing.T) {
    60  	mock.StartMockService("9021")
    61  	input := new(models.BoletoRequest)
    62  	errConvert := util.FromJSON(baseMockJSON, input)
    63  	bank, _ := New()
    64  
    65  	output, _ := bank.ProcessBoleto(input)
    66  
    67  	assert.Nil(t, errConvert)
    68  	test.AssertProcessBoletoWithSuccess(t, output)
    69  }
    70  
    71  func TestProcessBoleto_WhenServiceRespondsWithDataWhitespaces_ShouldHasBadGatewayErrorResponse(t *testing.T) {
    72  	mock.StartMockService("9024")
    73  	input := new(models.BoletoRequest)
    74  	errConvert := util.FromJSON(baseMockJSON, input)
    75  
    76  	input.Title.AmountInCents = 100
    77  	bank, _ := New()
    78  
    79  	_, err := bank.ProcessBoleto(input)
    80  
    81  	assert.Nil(t, errConvert)
    82  	test.AssertError(t, err, models.BadGatewayError{})
    83  }
    84  
    85  func TestProcessBoleto_WhenServiceRespondsWithDataEmpty_ShouldHasBadGatewayErrorResponse(t *testing.T) {
    86  	mock.StartMockService("9022")
    87  	input := new(models.BoletoRequest)
    88  	errConvert := util.FromJSON(baseMockJSON, input)
    89  
    90  	input.Title.AmountInCents = 101
    91  	bank, _ := New()
    92  
    93  	_, err := bank.ProcessBoleto(input)
    94  
    95  	assert.Nil(t, errConvert)
    96  	test.AssertError(t, err, models.BadGatewayError{})
    97  }
    98  
    99  func TestProcessBoleto_WhenServiceRespondsWithDataNil_ShouldHasInternalServerErrorResponse(t *testing.T) {
   100  	mock.StartMockService("9023")
   101  	input := new(models.BoletoRequest)
   102  	errConvert := util.FromJSON(baseMockJSON, input)
   103  
   104  	input.Title.AmountInCents = 102
   105  	bank, _ := New()
   106  
   107  	_, err := bank.ProcessBoleto(input)
   108  
   109  	assert.Nil(t, errConvert)
   110  	test.AssertError(t, err, models.InternalServerError{})
   111  }
   112  
   113  func TestCalculateOurNumber_WhenCalled_ShouldBeCalcutateOurNumberWithSuccess(t *testing.T) {
   114  	boleto := models.BoletoRequest{
   115  		Title: models.Title{
   116  			OurNumber: 8605970,
   117  		},
   118  	}
   119  	var expected uint = 86059700
   120  
   121  	result := calculateOurNumber(&boleto)
   122  
   123  	assert.Equal(t, expected, result, "Deve-se calcular corretamente o nosso numero para o Citi")
   124  }
   125  
   126  func TestGetBoletoType_WhenCalled_ShouldBeMapTypeSuccessful(t *testing.T) {
   127  	for _, fact := range boletoTypeParameters {
   128  		_, result := getBoletoType()
   129  		assert.Equal(t, fact.Expected, result, "Deve mapear o boleto type corretamente")
   130  	}
   131  }
   132  
   133  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorIsCNPJ_ParseSuccessful(t *testing.T) {
   134  	f := flow.NewFlow()
   135  	cnpjDocument := "00732159000109"
   136  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentType("CNPJ").WithPayeeGuarantorDocumentNumber(cnpjDocument).Build()
   137  
   138  	b := fmt.Sprintf("%v", f.From("message://?source=inline", input, getRequestCiti(), tmpl.GetFuncMaps()).GetBody())
   139  	assert.Contains(t, b, "<DbtrGrntNm>PayeeGuarantor Test Nam</DbtrGrntNm>")
   140  	assert.Contains(t, b, "<DbtrGrntDocum>00732159000109</DbtrGrntDocum>")
   141  	assert.Contains(t, b, "<DbtrGrntTpPess>J</DbtrGrntTpPess>")
   142  }
   143  
   144  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorIsCPF_ParseSuccessful(t *testing.T) {
   145  	f := flow.NewFlow()
   146  	cpfDocument := "08013156036"
   147  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentType("CPF").WithPayeeGuarantorDocumentNumber(cpfDocument).Build()
   148  
   149  	b := fmt.Sprintf("%v", f.From("message://?source=inline", input, getRequestCiti(), tmpl.GetFuncMaps()).GetBody())
   150  	assert.Contains(t, b, "<DbtrGrntNm>PayeeGuarantor Test Nam</DbtrGrntNm>")
   151  	assert.Contains(t, b, "<DbtrGrntDocum>08013156036</DbtrGrntDocum>")
   152  	assert.Contains(t, b, "<DbtrGrntTpPess>F</DbtrGrntTpPess>")
   153  }
   154  
   155  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorIsCPF_ParseFailed(t *testing.T) {
   156  	f := flow.NewFlow()
   157  	cpfDocument := "08013156036"
   158  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentType("CNPJ").WithPayeeGuarantorDocumentNumber(cpfDocument).Build()
   159  
   160  	b := fmt.Sprintf("%v", f.From("message://?source=inline", input, getRequestCiti(), tmpl.GetFuncMaps()).GetBody())
   161  
   162  	assert.Contains(t, b, "<DbtrGrntNm>PayeeGuarantor Test Nam</DbtrGrntNm>")
   163  	assert.NotContains(t, b, "<DbtrGrntTpPess>F</DbtrGrntTpPess>")
   164  }
   165  
   166  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorIsCNPJ_ParseFailed(t *testing.T) {
   167  	f := flow.NewFlow()
   168  	cnpjDocument := "00732159000109"
   169  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentType("CPF").WithPayeeGuarantorDocumentNumber(cnpjDocument).Build()
   170  
   171  	b := fmt.Sprintf("%v", f.From("message://?source=inline", input, getRequestCiti(), tmpl.GetFuncMaps()).GetBody())
   172  
   173  	assert.Contains(t, b, "<DbtrGrntNm>PayeeGuarantor Test Nam</DbtrGrntNm>")
   174  	assert.NotContains(t, b, "<DbtrGrntTpPess>J</DbtrGrntTpPess>")
   175  }
   176  
   177  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorDocumentInNotValidCPF_ParseFailed(t *testing.T) {
   178  	mock.StartMockService("9021")
   179  	cnpjDocument := "00732159000109"
   180  
   181  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentNumber(cnpjDocument).WithPayeeGuarantorDocumentType("CPF").Build()
   182  
   183  	bank, _ := New()
   184  
   185  	output, _ := bank.ProcessBoleto(input)
   186  
   187  	test.AssertProcessBoletoFailed(t, output)
   188  }
   189  
   190  func TestTemplateRequestCitibank_WhenRequestWithPayeeGuarantorDocumentInNotValidCNPJ_ParseFailed(t *testing.T) {
   191  	mock.StartMockService("9019")
   192  	cpfDocument := "08013156036"
   193  
   194  	input := newStubBoletoRequestCitibank().WithPayeeGuarantorName("PayeeGuarantor Test Name").WithPayeeGuarantorDocumentNumber(cpfDocument).WithPayeeGuarantorDocumentType("CNPJ").Build()
   195  
   196  	bank, _ := New()
   197  
   198  	output, _ := bank.ProcessBoleto(input)
   199  
   200  	test.AssertProcessBoletoFailed(t, output)
   201  }
   202  
   203  func TestTemplateRequestCitibank_WhenRequestWithoutPayeeGuarantor_HasNotPayeeGuarantorNode(t *testing.T) {
   204  	f := flow.NewFlow()
   205  	input := newStubBoletoRequestCitibank().Build()
   206  
   207  	b := fmt.Sprintf("%v", f.From("message://?source=inline", input, getRequestCiti(), tmpl.GetFuncMaps()).GetBody())
   208  
   209  	assert.Contains(t, b, "<DbtrGrntNm> </DbtrGrntNm>")
   210  	assert.NotContains(t, b, "<DbtrGrntDocum> </DbtrGrntDocum>")
   211  	assert.NotContains(t, b, "<DbtrGrntTpPess> </DbtrGrntTpPess>")
   212  }