github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/api/validator_test.go (about) 1 package api 2 3 import ( 4 "bytes" 5 "net/http" 6 "testing" 7 "time" 8 9 "github.com/mundipagg/boleto-api/models" 10 "github.com/mundipagg/boleto-api/test" 11 "github.com/mundipagg/boleto-api/util" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 type bankNumberParameter struct { 16 input models.BankNumber 17 expected interface{} 18 } 19 20 type bankNumberExpectedParameter struct { 21 code int 22 message string 23 } 24 25 var validationBanksAcceptedRulesAndFees = []bankNumberParameter{ 26 {input: models.Caixa, expected: true}, 27 {input: models.Stone, expected: true}, 28 {input: models.BancoDoBrasil, expected: false}, 29 {input: models.Santander, expected: false}, 30 {input: models.Citibank, expected: false}, 31 {input: models.Itau, expected: false}, 32 {input: models.JPMorgan, expected: false}, 33 {input: models.Pefisa, expected: false}, 34 {input: models.Bradesco, expected: false}, 35 } 36 37 var validationRulesAndFeesSuccessParametersV2 = []bankNumberParameter{ 38 {input: models.Caixa, expected: bankNumberExpectedParameter{code: 200}}, 39 {input: models.Stone, expected: bankNumberExpectedParameter{code: 200}}, 40 } 41 42 var validationFeesFailedParametersV2 = []bankNumberParameter{ 43 {input: models.BancoDoBrasil, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 44 {input: models.Santander, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 45 {input: models.Citibank, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 46 {input: models.Itau, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 47 {input: models.JPMorgan, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 48 {input: models.Pefisa, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 49 {input: models.Bradesco, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.fees not available for this bank"}]}`}}, 50 } 51 52 var validationRulesFailedParametersV2 = []bankNumberParameter{ 53 {input: models.BancoDoBrasil, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 54 {input: models.Santander, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 55 {input: models.Citibank, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 56 {input: models.Itau, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 57 {input: models.JPMorgan, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 58 {input: models.Pefisa, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available for this bank"}]}`}}, 59 } 60 61 var validationSuccessParametersV1 = []bankNumberParameter{ 62 {input: models.BancoDoBrasil, expected: bankNumberExpectedParameter{code: 200}}, 63 } 64 65 var validationRulesFailedParametersV1 = []bankNumberParameter{ 66 {input: models.Caixa, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 67 {input: models.BancoDoBrasil, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 68 {input: models.Bradesco, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 69 {input: models.Citibank, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 70 {input: models.Itau, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 71 {input: models.JPMorgan, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 72 {input: models.Pefisa, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 73 {input: models.Santander, expected: bankNumberExpectedParameter{code: 400, message: `{"errors":[{"code":"MP400","message":"title.rules not available in this version"}]}`}}, 74 } 75 76 func Test_ValidateRegisterV1_WhenWithoutRules_PassSuccessful(t *testing.T) { 77 for _, fact := range validationSuccessParametersV1 { 78 router, w := arrangeMiddlewareRoute("/validateV1", parseBoleto, validateRegisterV1) 79 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithWallet(25).Build() 80 req, _ := http.NewRequest("POST", "/validateV1", bytes.NewBuffer([]byte(util.ToJSON(body)))) 81 82 router.ServeHTTP(w, req) 83 84 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 85 } 86 } 87 88 func Test_ValidateRegisterV1_WhenHasRules_ReturnBadRequest(t *testing.T) { 89 for _, fact := range validationRulesFailedParametersV1 { 90 router, w := arrangeMiddlewareRoute("/validateV1", parseBoleto, validateRegisterV1) 91 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithWallet(25).WithAcceptDivergentAmount(true).Build() 92 req, _ := http.NewRequest("POST", "/validateV1", bytes.NewBuffer([]byte(util.ToJSON(body)))) 93 94 router.ServeHTTP(w, req) 95 96 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 97 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).message, w.Body.String()) 98 } 99 } 100 101 func Test_ValidateRegisterV1_WhenHasBankStone_ReturnBadRequest(t *testing.T) { 102 router, w := arrangeMiddlewareRoute("/validateV1", parseBoleto, validateRegisterV1) 103 body := test.NewStubBoletoRequest(models.Stone).WithExpirationDate(time.Now()).Build() 104 req, _ := http.NewRequest("POST", "/validateV1", bytes.NewBuffer([]byte(util.ToJSON(body)))) 105 106 router.ServeHTTP(w, req) 107 108 assert.Equal(t, 400, w.Code) 109 assert.Equal(t, `{"errors":[{"code":"MP400","message":"bank Stone not available in this version"}]}`, w.Body.String()) 110 } 111 112 func Test_ValidateRegisterV2_WhenWithoutRules_PassSuccessful(t *testing.T) { 113 router, w := arrangeMiddlewareRoute("/validateV2", parseBoleto, validateRegisterV2) 114 body := test.NewStubBoletoRequest(models.BancoDoBrasil).WithExpirationDate(time.Now()).Build() 115 req, _ := http.NewRequest("POST", "/validateV2", bytes.NewBuffer([]byte(util.ToJSON(body)))) 116 117 router.ServeHTTP(w, req) 118 119 assert.Equal(t, 200, w.Code) 120 } 121 122 func Test_ValidateRegisterV2_WhenHasRulesAndNotAcceptedBanks_ReturnBadRequest(t *testing.T) { 123 for _, fact := range validationRulesFailedParametersV2 { 124 router, w := arrangeMiddlewareRoute("/validateV2", parseBoleto, validateRegisterV2) 125 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithAcceptDivergentAmount(true).Build() 126 req, _ := http.NewRequest("POST", "/validateV2", bytes.NewBuffer([]byte(util.ToJSON(body)))) 127 128 router.ServeHTTP(w, req) 129 130 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 131 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).message, w.Body.String()) 132 } 133 } 134 135 func Test_ValidateRegisterV2_WhenHasRules_PassSuccessful(t *testing.T) { 136 for _, fact := range validationRulesAndFeesSuccessParametersV2 { 137 router, w := arrangeMiddlewareRoute("/validateV2", parseBoleto, validateRegisterV2) 138 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithMaxDaysToPayPastDue(30).Build() 139 req, _ := http.NewRequest("POST", "/validateV2", bytes.NewBuffer([]byte(util.ToJSON(body)))) 140 141 router.ServeHTTP(w, req) 142 143 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 144 } 145 } 146 147 func Test_ValidateRegisterV2_WhenHasFees_PassSuccessful(t *testing.T) { 148 var boletoDate uint = 1 149 var amount uint64 = 25 150 var percentage float64 = 0 151 for _, fact := range validationRulesAndFeesSuccessParametersV2 { 152 router, w := arrangeMiddlewareRoute("/validateV2", parseBoleto, validateRegisterV2) 153 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithFine(boletoDate, amount, percentage).WithMaxDaysToPayPastDue(30).Build() 154 req, _ := http.NewRequest("POST", "/validateV2", bytes.NewBuffer([]byte(util.ToJSON(body)))) 155 156 router.ServeHTTP(w, req) 157 158 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 159 } 160 } 161 162 func Test_ValidateRegisterV2_WhenHasFeesAndNotAcceptedBanks_ReturnBadRequest(t *testing.T) { 163 var boletoDate uint = 1 164 var amount uint64 = 25 165 var percentage float64 = 0 166 for _, fact := range validationFeesFailedParametersV2 { 167 router, w := arrangeMiddlewareRoute("/validateV2", parseBoleto, validateRegisterV2) 168 body := test.NewStubBoletoRequest(fact.input).WithExpirationDate(time.Now()).WithFine(boletoDate, amount, percentage).Build() 169 req, _ := http.NewRequest("POST", "/validateV2", bytes.NewBuffer([]byte(util.ToJSON(body)))) 170 171 router.ServeHTTP(w, req) 172 173 assert.Equal(t, fact.expected.(bankNumberExpectedParameter).code, w.Code) 174 } 175 } 176 177 func Test_Banks_Accepted_Rules(t *testing.T) { 178 for _, fact := range validationBanksAcceptedRulesAndFees { 179 result := isBankNumberAcceptRules(fact.input) 180 assert.Equal(t, fact.expected, result) 181 } 182 } 183 184 func Test_Banks_Accepted_Fees(t *testing.T) { 185 for _, fact := range validationBanksAcceptedRulesAndFees { 186 result := isBankNumberAcceptFees(fact.input) 187 assert.Equal(t, fact.expected, result) 188 } 189 }