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  }