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 }