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 }