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

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/gin-gonic/gin"
    11  	"github.com/mundipagg/boleto-api/config"
    12  	"github.com/mundipagg/boleto-api/models"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestGetBoleto_WhenInvalidKeys_ShouldReturnNotFound(t *testing.T) {
    17  	expected := models.ErrorResponse{Code: "MP404", Message: "Not Found"}
    18  
    19  	c, r, w := arrangeGetBoleto()
    20  	url := "http://localhost:3000/boleto?fmt=html&pk=1234567890"
    21  	c.Request, _ = http.NewRequest(http.MethodGet, url, nil)
    22  
    23  	r.ServeHTTP(w, c.Request)
    24  
    25  	var response models.BoletoResponse
    26  	err := json.Unmarshal(w.Body.Bytes(), &response)
    27  
    28  	assert.Nil(t, err)
    29  	assert.Equal(t, 404, w.Code)
    30  	assert.Equal(t, 1, len(response.Errors))
    31  	assert.Equal(t, expected.Code, response.Errors[0].Code, "O erro code deverá ser mapeado corretamente")
    32  	assert.Equal(t, expected.Message, response.Errors[0].Message, "O erro message deverá ser mapeado corretamente")
    33  
    34  }
    35  
    36  func TestGetBoleto_WhenFail_ShouldReturnInternalError(t *testing.T) {
    37  	expected := models.ErrorResponse{Code: "MP500", Message: "Internal Error"}
    38  
    39  	c, r, w := arrangeGetBoleto()
    40  	url := "http://localhost:3000/boleto?fmt=html&id=1234567890&pk=1234567890"
    41  	c.Request, _ = http.NewRequest(http.MethodGet, url, nil)
    42  
    43  	r.ServeHTTP(w, c.Request)
    44  
    45  	var response models.BoletoResponse
    46  	err := json.Unmarshal(w.Body.Bytes(), &response)
    47  
    48  	assert.Nil(t, err)
    49  	assert.Equal(t, 500, w.Code)
    50  	assert.Equal(t, 1, len(response.Errors))
    51  	assert.Equal(t, expected.Code, response.Errors[0].Code, "O erro code deverá ser mapeado corretamente")
    52  	assert.Equal(t, expected.Message, response.Errors[0].Message, "O erro message deverá ser mapeado corretamente")
    53  }
    54  
    55  func Test_GetBoletoConfirmation_ReturnOkSuccessful(t *testing.T) {
    56  	router := mockInstallApi()
    57  
    58  	w := httptest.NewRecorder()
    59  	req, _ := http.NewRequest("GET", "/boleto/confirmation", nil)
    60  
    61  	router.ServeHTTP(w, req)
    62  
    63  	assert.Equal(t, 200, w.Code)
    64  	assert.Equal(t, "OK", w.Body.String())
    65  }
    66  
    67  func Test_setupGetBoletoSuccessResponse(t *testing.T) {
    68  	c, _, _ := arrangeGetBoleto()
    69  	url := "http://localhost:3000/boleto?fmt=html&id=1234567890&pk=1234567890"
    70  	c.Request, _ = http.NewRequest(http.MethodGet, url, nil)
    71  
    72  	expectedResult := models.NewGetBoletoResult(c)
    73  
    74  	setupGetBoletoSuccessResponse(c, expectedResult)
    75  
    76  	assert.Equal(t, http.StatusOK, c.Writer.Status(), "O status deve ser 200 - OK")
    77  	assert.Equal(t, "Information", expectedResult.LogSeverity, "O severity log deve ser Information")
    78  	assert.Equal(t, expectedResult, getResultFromContext(c), "O objeto result deverá estar no contexto")
    79  }
    80  
    81  func Test_PostBoletoConfirmation_ReturnOkSuccessful(t *testing.T) {
    82  	router := mockInstallApi()
    83  
    84  	w := httptest.NewRecorder()
    85  	req, _ := http.NewRequest("POST", "/boleto/confirmation", nil)
    86  
    87  	router.ServeHTTP(w, req)
    88  
    89  	assert.Equal(t, 200, w.Code)
    90  	assert.Equal(t, "OK", w.Body.String())
    91  }
    92  
    93  func arrangeGetBoleto() (*gin.Context, *gin.Engine, *httptest.ResponseRecorder) {
    94  	os.Clearenv()
    95  	gin.SetMode(gin.TestMode)
    96  	config.Install(true, false, true)
    97  	w := httptest.NewRecorder()
    98  	c, r := gin.CreateTestContext(w)
    99  	r.GET("/boleto", getBoleto)
   100  	return c, r, w
   101  }