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

     1  package api
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"strconv"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/gin-gonic/gin"
    13  	"github.com/mundipagg/boleto-api/bank"
    14  	"github.com/mundipagg/boleto-api/log"
    15  	"github.com/mundipagg/boleto-api/models"
    16  	"github.com/mundipagg/boleto-api/test"
    17  	"github.com/mundipagg/boleto-api/usermanagement"
    18  	"github.com/mundipagg/boleto-api/util"
    19  	"github.com/stretchr/testify/assert"
    20  )
    21  
    22  func Test_Authentication_WhenEmptyCredentials_ReturnUnauthorized(t *testing.T) {
    23  	router, w := arrangeMiddlewareRoute("/authentication", authentication)
    24  	req, _ := http.NewRequest("POST", "/authentication", bytes.NewBuffer([]byte(`{"type":"without_credentials"}`)))
    25  
    26  	router.ServeHTTP(w, req)
    27  
    28  	assert.Equal(t, 401, w.Code)
    29  	assert.Equal(t, `{"errors":[{"code":"MP401","message":"Unauthorized"}]}`, w.Body.String())
    30  }
    31  
    32  func Test_Authentication_WhenInvalidCredentials_ReturnUnauthorized(t *testing.T) {
    33  	router, w := arrangeMiddlewareRoute("/authentication", authentication)
    34  	req, _ := http.NewRequest("POST", "/authentication", bytes.NewBuffer([]byte(`{"type":"invalid_credentials"}`)))
    35  	req.SetBasicAuth("invalid_user", "invalid_pass")
    36  
    37  	router.ServeHTTP(w, req)
    38  
    39  	assert.Equal(t, 401, w.Code)
    40  	assert.Equal(t, `{"errors":[{"code":"MP401","message":"Unauthorized"}]}`, w.Body.String())
    41  }
    42  
    43  func Test_Authentication_WhenInvalidPassword_ReturnUnauthorized(t *testing.T) {
    44  	router, w := arrangeMiddlewareRoute("/authentication", authentication)
    45  	user, _ := usermanagement.LoadMockUserCredentials()
    46  	req, _ := http.NewRequest("POST", "/authentication", bytes.NewBuffer([]byte(`{"type":"valid_credentials"}`)))
    47  	req.SetBasicAuth(user, "invalid pass")
    48  
    49  	router.ServeHTTP(w, req)
    50  
    51  	assert.Equal(t, 401, w.Code)
    52  	assert.Equal(t, `{"errors":[{"code":"MP401","message":"Unauthorized"}]}`, w.Body.String())
    53  }
    54  
    55  func Test_Authentication_WhenValidCredentials_AuthorizedRequestSuccessful(t *testing.T) {
    56  	router, w := arrangeMiddlewareRoute("/authentication", authentication)
    57  	user, pass := usermanagement.LoadMockUserCredentials()
    58  	req, _ := http.NewRequest("POST", "/authentication", bytes.NewBuffer([]byte(`{"type":"valid_credentials"}`)))
    59  	req.SetBasicAuth(user, pass)
    60  
    61  	router.ServeHTTP(w, req)
    62  
    63  	assert.Equal(t, 200, w.Code)
    64  }
    65  
    66  func Test_ParseBoleto_WhenInvalidBody_ReturnBadRequest(t *testing.T) {
    67  	router, w := arrangeMiddlewareRoute("/parseboleto", parseBoleto)
    68  	req, _ := http.NewRequest("POST", "/parseboleto", bytes.NewBuffer([]byte(``)))
    69  
    70  	router.ServeHTTP(w, req)
    71  
    72  	assert.Equal(t, 400, w.Code)
    73  	assert.Equal(t, `{"errors":[{"code":"MP400","message":"EOF"}]}`, w.Body.String())
    74  }
    75  
    76  func Test_ParseBoleto_WhenInvalidBank_ReturnBadRequest(t *testing.T) {
    77  	router, w := arrangeMiddlewareRoute("/parseboleto", parseBoleto)
    78  	req, _ := http.NewRequest("POST", "/parseboleto", bytes.NewBuffer([]byte(`{"bankNumber": 999}`)))
    79  
    80  	router.ServeHTTP(w, req)
    81  
    82  	assert.Equal(t, 400, w.Code)
    83  	assert.Equal(t, `{"errors":[{"code":"MPBankNumber","message":"Banco 999 não existe"}]}`, w.Body.String())
    84  }
    85  
    86  func Test_ParseBoleto_WhenInvalidExpirationDate_ReturnBadRequest(t *testing.T) {
    87  	router, w := arrangeMiddlewareRoute("/parseboleto", parseBoleto)
    88  	body := test.NewStubBoletoRequest(models.BancoDoBrasil).Build()
    89  	req, _ := http.NewRequest("POST", "/parseboleto", bytes.NewBuffer([]byte(util.ToJSON(body))))
    90  
    91  	router.ServeHTTP(w, req)
    92  
    93  	assert.Equal(t, 400, w.Code)
    94  	assert.Equal(t, `{"errors":[{"code":"MP400","message":"parsing time \"\" as \"2006-01-02\": cannot parse \"\" as \"2006\""}]}`, w.Body.String())
    95  }
    96  
    97  func Test_ParseBoleto_WhenValidRequest_PassSuccessful(t *testing.T) {
    98  	router, w := arrangeMiddlewareRoute("/parseboleto", parseBoleto)
    99  	body := test.NewStubBoletoRequest(models.BancoDoBrasil).WithExpirationDate(time.Now()).Build()
   100  	req, _ := http.NewRequest("POST", "/parseboleto", bytes.NewBuffer([]byte(util.ToJSON(body))))
   101  
   102  	router.ServeHTTP(w, req)
   103  
   104  	assert.Equal(t, 200, w.Code)
   105  }
   106  
   107  func Test_ParseExpirationDate(t *testing.T) {
   108  	expectedExpireDate := time.Now().Format("2006-01-02")
   109  	expectedExpireDateTime, _ := time.Parse("2006-01-02", expectedExpireDate)
   110  
   111  	boleto := models.BoletoRequest{BankNumber: models.BancoDoBrasil, Title: models.Title{ExpireDate: expectedExpireDate}}
   112  	bank, _ := bank.Get(boleto)
   113  	parseExpirationDate(nil, &boleto, bank)
   114  
   115  	assert.Equal(t, expectedExpireDateTime, boleto.Title.ExpireDateTime)
   116  }
   117  
   118  func Test_LoadLog(t *testing.T) {
   119  	expectedUser := "user"
   120  	requestOurNumber := uint(1234567890)
   121  	expectedOurNumber := strconv.FormatUint(uint64(requestOurNumber), 10)
   122  
   123  	boleto := test.NewStubBoletoRequest(models.BancoDoBrasil).WithOurNumber(requestOurNumber).Build()
   124  	bank, _ := bank.Get(*boleto)
   125  
   126  	ginCtx, _ := gin.CreateTestContext(httptest.NewRecorder())
   127  	ginCtx.Set(serviceUserKey, expectedUser)
   128  	ginCtx.Set(boletoKey, *boleto)
   129  	ginCtx.Set(bankKey, bank)
   130  	test.CreateClientIP(ginCtx)
   131  
   132  	l := loadBankLog(ginCtx)
   133  
   134  	assert.NotNil(t, l)
   135  	assert.Equal(t, expectedUser, l.ServiceUser)
   136  	assert.Equal(t, expectedOurNumber, l.NossoNumero)
   137  	assert.Equal(t, bank.GetBankNameIntegration(), l.BankName)
   138  }
   139  
   140  func Test_CheckError_WhenNotFoundError(t *testing.T) {
   141  	_, w := arrangeMiddlewareRoute("/err", gin.Default().HandleContext)
   142  	ginCtx, _ := gin.CreateTestContext(w)
   143  	err := models.NewHTTPNotFound("404", "objeto não encontrado")
   144  	l := log.CreateLog()
   145  
   146  	checkError(ginCtx, err, l)
   147  
   148  	assert.Equal(t, http.StatusNotFound, w.Result().StatusCode)
   149  	assert.Equal(t, `{"errors":[{"code":"MP404","message":"objeto não encontrado"}]}`, w.Body.String())
   150  }
   151  
   152  func Test_CheckError_WhenInternalServerError(t *testing.T) {
   153  	_, w := arrangeMiddlewareRoute("/err", gin.Default().HandleContext)
   154  	ginCtx, _ := gin.CreateTestContext(w)
   155  	err := models.NewInternalServerError("500", "erro interno")
   156  	l := log.CreateLog()
   157  
   158  	checkError(ginCtx, err, l)
   159  
   160  	assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
   161  	assert.Equal(t, `{"errors":[{"code":"MP500","message":"erro interno"}]}`, w.Body.String())
   162  }
   163  
   164  func Test_CheckError_WhenBadGatewayError(t *testing.T) {
   165  	_, w := arrangeMiddlewareRoute("/err", gin.Default().HandleContext)
   166  	ginCtx, _ := gin.CreateTestContext(w)
   167  	err := models.NewBadGatewayError("erro externo")
   168  	l := log.CreateLog()
   169  
   170  	checkError(ginCtx, err, l)
   171  
   172  	assert.Equal(t, http.StatusBadGateway, w.Result().StatusCode)
   173  	assert.Equal(t, `{"errors":[{"code":"MP502","message":"erro externo"}]}`, w.Body.String())
   174  }
   175  
   176  func Test_CheckError_WhenGenericError(t *testing.T) {
   177  	_, w := arrangeMiddlewareRoute("/err", gin.Default().HandleContext)
   178  	ginCtx, _ := gin.CreateTestContext(w)
   179  	err := fmt.Errorf("erro generico")
   180  	l := log.CreateLog()
   181  
   182  	checkError(ginCtx, err, l)
   183  
   184  	assert.Equal(t, http.StatusInternalServerError, w.Result().StatusCode)
   185  	assert.Equal(t, `{"errors":[{"code":"MP500","message":"Internal Error"}]}`, w.Body.String())
   186  }
   187  
   188  func Test_GetOurNumberFromContext_WhenOurNumberInRequest(t *testing.T) {
   189  	requestOurNumber := uint(12345678901234567890)
   190  	expectedOurNumber := strconv.FormatUint(uint64(requestOurNumber), 10)
   191  
   192  	c, _ := gin.CreateTestContext(httptest.NewRecorder())
   193  	request := test.NewStubBoletoRequest(models.BancoDoBrasil).WithOurNumber(requestOurNumber).Build()
   194  	c.Set(boletoKey, *request)
   195  
   196  	result := getNossoNumeroFromContext(c)
   197  
   198  	assert.Equal(t, expectedOurNumber, result)
   199  }
   200  
   201  func Test_GetOurNumberFromContext_WhenOurNumberInResponse(t *testing.T) {
   202  	expectedOurNumber := "123456789012345678901234567890"
   203  	c, _ := gin.CreateTestContext(httptest.NewRecorder())
   204  	response := models.BoletoResponse{OurNumber: expectedOurNumber}
   205  	c.Set(responseKey, response)
   206  
   207  	result := getNossoNumeroFromContext(c)
   208  
   209  	assert.Equal(t, expectedOurNumber, result)
   210  }
   211  
   212  func arrangeMiddlewareRoute(route string, handlers ...gin.HandlerFunc) (*gin.Engine, *httptest.ResponseRecorder) {
   213  	router := mockInstallApi()
   214  	router.POST(route, handlers...)
   215  	w := httptest.NewRecorder()
   216  	return router, w
   217  }