Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste de Update também está criando registro novo

O teste de alteração do aluno está funcionando, ele cria o aluno, altera e no final faz o delete do mesmo no banco de dados. Porém, um comportamento inesperado também acontece, um novo aluno está sempre sendo criado no banco no final do teste.

Exemplo: Assim que executo o teste, ele cria o aluno de ID 100, altera os dados e deleta ele, porém cria também um novo aluno com o ID 101.

Não sei o que fiz de errado e o que pode estar acontecendo. Seguem os códigos da função de teste e da função do controller que executa o update do aluno

func TestUpdate(t *testing.T) {
    database.Connection()
    CriaAluno()
    defer DeletaAluno()
    r := SetupRoutes()
    r.PATCH("/alunos/:id", controllers.Update)
    aluno := models.Aluno{Nome: "Aluno Teste", CPF: "81087843015", RG: "509012207"}
    alunoJson, _ := json.Marshal(aluno)
    path := "/alunos/" + strconv.Itoa(ID)
    req, _ := http.NewRequest("PATCH", path, bytes.NewBuffer(alunoJson))
    resp := httptest.NewRecorder()
    r.ServeHTTP(resp, req)
    var alunoAlterado models.Aluno
    json.Unmarshal(resp.Body.Bytes(), &alunoAlterado)
    assert.Equal(t, "81087843015", alunoAlterado.CPF, "Os CPFs não são iguais")
    assert.Equal(t, "509012207", alunoAlterado.RG, "Os RGs não são iguais")
    assert.Equal(t, http.StatusOK, resp.Code, "Status Code não esperado")
}
func Update(c *gin.Context) {
    var aluno models.Aluno
    id := c.Params.ByName("id")
    database.DB.First(&aluno, id)

    if aluno.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{
            "error": "Aluno não encontrado",
        })
        return
    }

    if err := c.ShouldBindJSON(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    if err := models.ValidaAluno(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    database.DB.Save(&aluno)
    c.JSON(http.StatusOK, aluno)
}
1 resposta
solução!

Altere sua função de update para a seguinte:

func Update(c *gin.Context) {
    var aluno models.Aluno
    id := c.Params.ByName("id")
    database.DB.First(&aluno, id)

    if aluno.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{
            "error": "Aluno não encontrado",
        })
        return
    }

    var alunoToUpdate models.Aluno
    if err := c.ShouldBindJSON(&alunoToUpdate); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    if err := models.ValidaAluno(&alunoToUpdate); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error(),
        })
        return
    }

    database.DB.Model(&aluno).Updates(alunoToUpdate)
    c.JSON(http.StatusOK, aluno)
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software