udistrital / core_documentacion

0 stars 0 forks source link

Finalizar implementación de pruebas unitarias en Oikos. #216

Closed diagutierrezro closed 1 month ago

diagutierrezro commented 1 month ago

Se requiere finalizar la implementación de pruebas unitarias corrigiendo los errores presentados y realizando las pruebas a las funciones finalizadas.

Sub Tareas

Criterios de aceptación

Requerimientos

No aplica

Definition of Ready - DoR

Definition of Done - DoD - Desarrollo

JulianAvella commented 1 month ago

Ya se logro dar solución a las funciones que no se podían aplicar una función de test, debido a que la función a evaluar estaba privada y no pública, lo que se hizo fue cambiar las funciones a publicas, además de dar solución con un mock para simular su comportamiento y respuesta a las subfunciones que puede llamar la función a la que le creamos un test, entonces ya no genera error, solo quedan tres funciones para diseñar su test, debido a que son largas y requieren varios por función, este es el avance del archivo test de gestion_dependencias_service:

package services_test

import ( //"errors" //"testing" //"bou.ke/monkey" //"github.com/udistrital/gestion_dependencias_mid/services" //"github.com/udistrital/gestion_dependencias_mid/models" //"github.com/udistrital/utils_oas/request" //"fmt" //"strings" )

/func TestCrearRespuestaBusqueda(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestCrearRespuestaBusqueda") t.Log("//////////////////////////////////")

t.Run("Caso exitoso", func(t *testing.T) {
    // Generación dinámica de datos de prueba
    dependenciaID := 223
    nombreDependencia := "Dependencia de prueba"

    // Mock para el caso exitoso
    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        if strings.Contains(url, fmt.Sprintf("dependencia?query=Id:%d", dependenciaID)) {
            *target.(*[]models.Dependencia) = []models.Dependencia{
                {
                    Id:                      dependenciaID,
                    Nombre:                  nombreDependencia,
                    TelefonoDependencia:     "321654987",
                    CorreoElectronico:       "info@desarrollo.com",
                    Activo:                  true,
                    FechaCreacion:           "2023-01-10T09:00:00Z",
                    FechaModificacion:       "2023-01-10T09:00:00Z",
                    DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{
                        {
                            Activo: true,
                            TipoDependenciaId: &models.TipoDependencia{
                                Id:     1,
                                Nombre: "Tipo 1",
                            },
                        },
                    },
                },
            }
            return nil
        } else if strings.Contains(url, fmt.Sprintf("dependencia_padre?query=HijaId:%d", dependenciaID)) {
            *target.(*[]models.DependenciaPadre) = []models.DependenciaPadre{
                {
                    Id:              1,
                    PadreId:         &models.Dependencia{Id: 2, Nombre: "Dependencia Padre", Activo: true},
                    HijaId:          &models.Dependencia{Id: dependenciaID},
                    Activo:          true,
                    FechaCreacion:   "2024-01-01T00:00:00Z",
                    FechaModificacion: "2024-01-02T00:00:00Z",
                },
            }
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    // Datos para el caso exitoso
    dependencia := models.Dependencia{
        Id:                      dependenciaID,
        Nombre:                  nombreDependencia,
        TelefonoDependencia:     "321654987",
        CorreoElectronico:       "info@desarrollo.com",
        Activo:                  true,
        DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{},
    }

    resultado := services.CrearRespuestaBusqueda(dependencia)

    // Validaciones para el caso exitoso
    if resultado.Dependencia.Id != dependenciaID {
        t.Errorf("Se esperaba Id %d, pero se obtuvo %d", dependenciaID, resultado.Dependencia.Id)
    }
    if resultado.Dependencia.Nombre != nombreDependencia {
        t.Errorf("Se esperaba Nombre '%s', pero se obtuvo '%s'", nombreDependencia, resultado.Dependencia.Nombre)
    }
    if resultado.DependenciaAsociada == nil || resultado.DependenciaAsociada.Id != 2 {
        t.Errorf("Se esperaba una DependenciaAsociada con Id 2, pero se obtuvo %+v", resultado.DependenciaAsociada)
    }
})

t.Run("Caso fallido", func(t *testing.T) {
    // Generación dinámica de datos de prueba
    dependenciaID := 999
    nombreDependencia := "Dependencia inexistente"

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        if strings.Contains(url, fmt.Sprintf("dependencia?query=Id:%d", dependenciaID)) {
            *target.(*[]models.Dependencia) = []models.Dependencia{
                {
                    Id:                      dependenciaID,
                    Nombre:                  nombreDependencia,
                    TelefonoDependencia:     "000000000",
                    CorreoElectronico:       "inexistente@desarrollo.com",
                    Activo:                  true,
                    DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{},
                },
            }
            return nil
        } else if strings.Contains(url, fmt.Sprintf("dependencia_padre?query=HijaId:%d", dependenciaID)) {
            *target.(*[]models.DependenciaPadre) = []models.DependenciaPadre{}
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    dependenciaFallida := models.Dependencia{
        Id:                      dependenciaID,
        Nombre:                  nombreDependencia,
        TelefonoDependencia:     "000000000",
        CorreoElectronico:       "inexistente@desarrollo.com",
        Activo:                  true,
        DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{},
    }

    resultadoFallido := services.CrearRespuestaBusqueda(dependenciaFallida)

    if resultadoFallido.DependenciaAsociada != nil {
        t.Errorf("Se esperaba que no hubiera Dependencia Asociada, pero se obtuvo %+v", resultadoFallido.DependenciaAsociada)
    }

    if resultadoFallido.DependenciaAsociada == nil {
        t.Logf("El test falló porque no se encontró una dependencia hija asociada para el ID %d", dependenciaID)
    }
})

}*/

/func TestExisteDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestExisteDependencia") t.Log("//////////////////////////////////")

t.Run("Caso 1: La dependencia existe", func(t *testing.T) {
    dependencias := []models.RespuestaBusquedaDependencia{
        {Dependencia: &models.Dependencia{Id: 1}},
    }
    if result := services.ExisteDependencia(dependencias, 1); result {
        t.Log("La dependencia con ID 1 existe")
    } else {
        t.Errorf("No existe la dependencia con ID 1")
    }
})

}*/

/func TestEditarDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestEditarDependencia") t.Log("//////////////////////////////////")

transaccion := &models.EditarDependencia{
    DependenciaId:        1,
    DependenciaAsociadaId: 2,
    Nombre:               "Dependencia Editada",
    CorreoElectronico:    "test@example.com",
    TelefonoDependencia:  "123456789",
    TipoDependenciaId:    []int{1, 2},
}

t.Run("Caso 1: La dependencia editada", func(t *testing.T) {

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        fmt.Println("URL recibida en el mock:", url)

        if strings.Contains(url, "dependencia/1") {
            dependencia := models.Dependencia{
                Id:                      1,
                Nombre:                  "Dependencia Editada",
                TelefonoDependencia:     "123456789",
                CorreoElectronico:       "test@example.com",
                Activo:                  true,
                FechaCreacion:           "2023-01-10T09:00:00Z",
                FechaModificacion:       "2023-01-10T09:00:00Z",
                DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{
                    {
                        Activo: true,
                        TipoDependenciaId: &models.TipoDependencia{
                            Id:     1,
                            Nombre: "Tipo 1",
                        },
                    },
                },
            }
            *target.(*models.Dependencia) = dependencia
            return nil
        } else if strings.Contains(url, "dependencia_tipo_dependencia?query=dependenciaId:1") {
            *target.(*[]models.DependenciaTipoDependencia) = []models.DependenciaTipoDependencia{
                {
                    Id: 1,
                    TipoDependenciaId: &models.TipoDependencia{
                        Id:     1,
                        Nombre: "Tipo 1",
                    },
                    DependenciaId: &models.Dependencia{
                        Id: 1,
                        Nombre: "Dependencia Editada",
                        Activo: true,
                    },
                    Activo:          true,
                    FechaCreacion:   "2023-01-10T09:00:00Z",
                    FechaModificacion: "2023-01-10T09:00:00Z",
                },
                {
                    Id: 2,
                    TipoDependenciaId: &models.TipoDependencia{
                        Id:     2,
                        Nombre: "Tipo 2",
                    },
                    DependenciaId: &models.Dependencia{
                        Id: 1,
                        Nombre: "Dependencia Editada",
                        Activo: true,
                    },
                    Activo:          true,
                    FechaCreacion:   "2023-01-10T09:00:00Z",
                    FechaModificacion: "2023-01-10T09:00:00Z",
                },
            }
            return nil
        } else if strings.Contains(url, "dependencia_padre?query=HijaId:1") {
            *target.(*[]models.DependenciaPadre) = []models.DependenciaPadre{
                {
                    Id:              1,
                    PadreId:         &models.Dependencia{Id: 2, Nombre: "Dependencia Padre", Activo: true},
                    HijaId:          &models.Dependencia{Id: 1, Nombre: "Dependencia Editada", Activo: true},
                    Activo:          true,
                    FechaCreacion:   "2024-01-01T00:00:00Z",
                    FechaModificacion: "2024-01-02T00:00:00Z",
                },
            }
            return nil
        } else if strings.Contains(url, "dependencia/2") {
            dependenciaAsociada := models.Dependencia{
                Id:                      2,
                Nombre:                  "Dependencia Asociada",
                TelefonoDependencia:     "987654321",
                CorreoElectronico:       "associate@example.com",
                Activo:                  true,
                FechaCreacion:           "2023-01-15T09:00:00Z",
                FechaModificacion:       "2023-01-15T09:00:00Z",
            }
            *target.(*models.Dependencia) = dependenciaAsociada
            return nil
        }

        return errors.New("URL no esperada")
    })

    monkey.Patch(request.SendJson, func(url, method string, response interface{}, data interface{}) error {
        fmt.Println("URL recibida en el mock de SendJson:", url)

        if strings.Contains(url, "dependencia/1") && method == "PUT" {
            respuestaDependencia := map[string]interface{}{
                "success": true,
                "message": "Dependencia actualizada correctamente",
            }

            if responseMap, ok := response.(*map[string]interface{}); ok {
                *responseMap = respuestaDependencia
            }

            return nil 
        } else if strings.Contains(url, "dependencia_padre/1") && method == "PUT" {
            respuestaPadre := map[string]interface{}{
                "Id": 1,
                "success": true,
                "message": "Dependencia padre actualizada correctamente",
            }

            if responseMap, ok := response.(*map[string]interface{}); ok {
                *responseMap = respuestaPadre
            }

            return nil 
        }

        return errors.New("la URL o el método no son los esperados")
    })

    defer monkey.UnpatchAll()

    alerta, outputError := services.EditarDependencia(transaccion)

    if len(alerta) == 0 || alerta[0] != "Success" {
        t.Errorf("Se esperaba alerta de éxito, pero se obtuvo: %v", alerta)
    }
    if outputError != nil {
        t.Errorf("Se esperaba ningún error, pero se obtuvo: %v", outputError)
    }
})

}*/

/func TestNuevoTipoDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestNuevoTipoDependencia") t.Log("//////////////////////////////////")

t.Run("Caso 1: Creación exitosa de nuevo tipo de dependencia", func(t *testing.T) {
    tipo := 1
    dependenciaId := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Prueba",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "prueba@example.com",
        Activo:              true,
        FechaCreacion:       "2023-01-10T09:00:00Z",
        FechaModificacion:   "2023-01-10T09:00:00Z",
    }
    tiposRegistrados := []int{2, 3}
    dependenciaOriginal := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Original",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "original@example.com",
        Activo:              true,
    }

    tipoDependencia := models.TipoDependencia{
        Id:     1,
        Nombre: "Tipo 1",
    }

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        if strings.Contains(url, "tipo_dependencia/1") {
            *target.(*models.TipoDependencia) = tipoDependencia
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, "dependencia_tipo_dependencia") && method == "POST" {
            *target.(*map[string]interface{}) = map[string]interface{}{"Id": float64(4)} // Cambiar a float64
            return nil
        }
        return errors.New("Error en el envío de JSON")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackDependenciaTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int) {
        t.Errorf("No se esperaba que se llamara a RollbackDependenciaTipoDependencia")
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            t.Errorf("Se esperaba que no se generara un panic, pero se obtuvo: %v", r)
        }
    }()

    services.NuevoTipoDependencia(tipo, dependenciaId, &tiposRegistrados, dependenciaOriginal)

    tipoAgregado := false
    for _, v := range tiposRegistrados {
        if v == 4 {
            tipoAgregado = true
            break
        }
    }
    if !tipoAgregado {
        t.Errorf("Se esperaba que el tipo 4 se agregara a la lista de tipos registrados")
    }

    t.Log("Creación de nuevo tipo de dependencia ejecutada exitosamente sin errores")
})

t.Run("Caso 2: Error en la creación debido a un fallo en la obtención del tipo de dependencia", func(t *testing.T) {
    tipo := 1
    dependenciaId := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Prueba",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "prueba@example.com",
        Activo:              true,
    }
    tiposRegistrados := []int{2, 3}
    dependenciaOriginal := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Original",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "original@example.com",
        Activo:              true,
    }

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        return errors.New("error al intentar obtener JSON")
    })
    defer monkey.UnpatchAll()

    rollbackCalled := false
    monkey.Patch(services.RollbackDependenciaTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int) {
        rollbackCalled = true
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "error al intentar obtener JSON") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con la obtención de JSON, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.NuevoTipoDependencia(tipo, dependenciaId, &tiposRegistrados, dependenciaOriginal)

    if !rollbackCalled {
        t.Errorf("Se esperaba que se llamara a RollbackDependenciaTipoDependencia")
    }
})

}*/

/func TestActualizarDependenciaTipoDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestActualizarDependenciaTipoDependencia") t.Log("//////////////////////////////////")

t.Run("Caso 1: Actualización exitosa de tipo de dependencia", func(t *testing.T) {
    tipo := 1
    activo := true
    dependenciaId := 1

    tiposOriginales := []models.DependenciaTipoDependencia{}
    dependenciaOriginal := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Original",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "original@example.com",
        Activo:              true,
        FechaCreacion:       "2023-01-10T09:00:00Z",
        FechaModificacion:   "2023-01-10T09:00:00Z",
    }
    tiposRegistrados := []int{1, 2}

    dependenciaTipoDependenciaActual := []models.DependenciaTipoDependencia{
        {
            Id:     1,
            Activo: false,
            TipoDependenciaId: &models.TipoDependencia{
                Id:     1,
                Nombre: "Tipo 1",
            },
        },
    }

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        if strings.Contains(url, "dependencia_tipo_dependencia?query=dependenciaId:1,tipoDependenciaId:1") {
            *target.(*[]models.DependenciaTipoDependencia) = dependenciaTipoDependenciaActual
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, "dependencia_tipo_dependencia/1") && method == "PUT" {
            *target.(*map[string]interface{}) = map[string]interface{}{"Id": 1}
            return nil
        }
        return errors.New("Error en el envío de JSON")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackActualizacionTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int, tiposOriginales *[]models.DependenciaTipoDependencia) {
        t.Errorf("No se esperaba que se llamara a RollbackActualizacionTipoDependencia")
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            t.Errorf("Se esperaba que no se generara un panic, pero se obtuvo: %v", r)
        }
    }()

    services.ActualizarDependenciaTipoDependencia(tipo, activo, dependenciaId, &tiposOriginales, dependenciaOriginal, &tiposRegistrados)

    t.Log("Actualización de tipo de dependencia ejecutada exitosamente sin errores")
})

t.Run("Caso 2: Error en la actualización por fallo en la obtención del tipo de dependencia", func(t *testing.T) {
    tipo := 1
    activo := true
    dependenciaId := 1

    tiposOriginales := []models.DependenciaTipoDependencia{}
    dependenciaOriginal := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Original",
        TelefonoDependencia: "123456789",
        CorreoElectronico:   "original@example.com",
        Activo:              true,
    }
    tiposRegistrados := []int{1, 2}

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        return errors.New("error al intentar obtener JSON")
    })
    defer monkey.UnpatchAll()

    rollbackCalled := false
    monkey.Patch(services.RollbackActualizacionTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int, tiposOriginales *[]models.DependenciaTipoDependencia) {
        rollbackCalled = true
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "error al intentar obtener JSON") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con la obtención de JSON, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.ActualizarDependenciaTipoDependencia(tipo, activo, dependenciaId, &tiposOriginales, dependenciaOriginal, &tiposRegistrados)

    if !rollbackCalled {
        t.Errorf("Se esperaba que se llamara a RollbackActualizacionTipoDependencia")
    }
})

}*/

/func TestContiene(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestContiene") t.Log("//////////////////////////////////")

t.Run("Caso 1: Valor presente en el slice", func(t *testing.T) {
    slice := []int{1, 2, 3, 4, 5}
    valor := 3
    if !services.Contiene(slice, valor) {
        t.Errorf("Se esperaba que el valor %d estuviera presente en el slice, pero no se encontró", valor)
    }
})

t.Run("Caso 2: Valor no presente en el slice", func(t *testing.T) {
    slice := []int{1, 2, 3, 4, 5}
    valor := 6
    if services.Contiene(slice, valor) {
        t.Errorf("Se esperaba que el valor %d no estuviera presente en el slice, pero se encontró", valor)
    }
})

}*/

/func TestRollbackActualizacionTipoDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackActualizacionTipoDependencia") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso de actualización de tipos de dependencia", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                      1,
        Nombre:                  "Dependencia Editada",
        TelefonoDependencia:     "123456789",
        CorreoElectronico:       "test@example.com",
        Activo:                  true,
    }

    tiposRegistrados := []int{1, 2, 3}
    tiposOriginales := []models.DependenciaTipoDependencia{
        {
            Id:     1,
            Activo: true,
            TipoDependenciaId: &models.TipoDependencia{
                Id:     1,
                Nombre: "Tipo 1",
            },
        },
        {
            Id:     2,
            Activo: true,
            TipoDependenciaId: &models.TipoDependencia{
                Id:     2,
                Nombre: "Tipo 2",
            },
        },
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, "dependencia_tipo_dependencia/") {
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackDependenciaTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int) {
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            t.Errorf("Se esperaba que no se generara un panic, pero se obtuvo: %v", r)
        }
    }()

    services.RollbackActualizacionTipoDependencia(dependencia, &tiposRegistrados, &tiposOriginales)

    t.Log("Rollback de actualización de tipos de dependencia ejecutado exitosamente sin errores")
})

t.Run("Caso 2: Error en el rollback de actualización por fallo en el envío de JSON", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                      0,
        Nombre:                  "",
        TelefonoDependencia:     "",
        CorreoElectronico:       "",
        Activo:                  false,
    }

    tiposRegistrados := []int{1}
    tiposOriginales := []models.DependenciaTipoDependencia{
        {
            Id:     1,
            Activo: true,
            TipoDependenciaId: &models.TipoDependencia{
                Id:     1,
                Nombre: "Tipo 1",
            },
        },
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        return errors.New("error al intentar enviar JSON")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackDependenciaTipoDependencia, func(dependencia models.Dependencia, tiposRegistrados *[]int) {
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "error al intentar enviar JSON") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con el envío de JSON, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.RollbackActualizacionTipoDependencia(dependencia, &tiposRegistrados, &tiposOriginales)
})

}*/

/func TestRollbackDependenciaTipoDependencia(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackDependenciaTipoDependencia") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso de tipos de dependencia", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                      1,
        Nombre:                  "Dependencia Editada",
        TelefonoDependencia:     "123456789",
        CorreoElectronico:       "test@example.com",
        Activo:                  true,
        FechaCreacion:           "2023-01-10T09:00:00Z",
        FechaModificacion:       "2023-01-10T09:00:00Z",
        DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{
            {
                Activo: true,
                TipoDependenciaId: &models.TipoDependencia{
                    Id:     1,
                    Nombre: "Tipo 1",
                },
            },
        },
    }

    tiposRegistrados := []int{1, 2, 3}

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, "dependencia_tipo_dependencia/") {
            return nil 
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackDependenciaOriginal, func(dependencia models.Dependencia) map[string]interface{} {
        return nil 
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            t.Errorf("Se esperaba que no se generara un panic, pero se obtuvo: %v", r)
        }
    }()

    services.RollbackDependenciaTipoDependencia(dependencia, &tiposRegistrados)

    t.Log("Rollback de tipos de dependencia ejecutado exitosamente sin errores")

})

t.Run("Caso 2: Error en el rollback por datos incompletos", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                      0, 
        Nombre:                  "", 
        TelefonoDependencia:     "", 
        CorreoElectronico:       "", 
        Activo:                  false, 
        DependenciaTipoDependencia: nil, 
    }

    tiposRegistrados := []int{1} 

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        return errors.New("error al intentar enviar JSON")
    })
    defer monkey.UnpatchAll()

    monkey.Patch(services.RollbackDependenciaOriginal, func(dependencia models.Dependencia) map[string]interface{} {
        return nil 
    })
    defer monkey.UnpatchAll()

    // Captura de panic
    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "error al intentar enviar JSON") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con el envío de JSON, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()
    services.RollbackDependenciaTipoDependencia(dependencia, &tiposRegistrados)
}) 

}*/

/func TestRollbackDependenciaOriginal(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackDependenciaOriginal") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                      1,
        Nombre:                  "Dependencia Editada",
        TelefonoDependencia:     "123456789",
        CorreoElectronico:       "test@example.com",
        Activo:                  true,
        FechaCreacion:           "2023-01-10T09:00:00Z",
        FechaModificacion:       "2023-01-10T09:00:00Z",
        DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{
            {
                Activo: true,
                TipoDependenciaId: &models.TipoDependencia{
                    Id:     1,
                    Nombre: "Tipo 1",
                },
            },
        },
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, fmt.Sprintf("dependencia/%d", dependencia.Id)) {
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    outputError := services.RollbackDependenciaOriginal(dependencia)

    if outputError != nil {
        t.Errorf("Se esperaba un error nil, pero se obtuvo %+v", outputError)
    } else {
        t.Log("Rollback ejecutado exitosamente sin errores")
    }
})

t.Run("Caso 2: Error al enviar la solicitud", func(t *testing.T) {
    dependencia := models.Dependencia{
        Id:                  1,
        Nombre:              "Dependencia Editada",
        TelefonoDependencia: "123456789",
        Activo:                  true,
        FechaCreacion:           "2023-01-10T09:00:00Z",
        FechaModificacion:       "2023-01-10T09:00:00Z",
        DependenciaTipoDependencia: []*models.DependenciaTipoDependencia{
            {
                Activo: true,
                TipoDependenciaId: &models.TipoDependencia{
                    Id:     1,
                    Nombre: "Tipo 1",
                },
            },
        },
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, fmt.Sprintf("dependencia/%d", dependencia.Id)) {
            return errors.New("error al enviar la solicitud: campo 'CorreoElectronico' faltante")
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            expectedPanic := "error al enviar la solicitud: campo 'CorreoElectronico' faltante"
            if r.(string) == expectedPanic {
                t.Logf("Panic capturado correctamente: %v", r)
            } else {
                t.Logf("Se esperaba panic con mensaje: %v, pero se obtuvo: %v", expectedPanic, r)
            }
        } else {
            t.Logf("Se esperaba un panic, pero no ocurrió")
        }
    }()
    _ = services.RollbackDependenciaOriginal(dependencia)
})

}*/

/func TestCopiarOrganigrama(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestCopiarOrganigrama") t.Log("//////////////////////////////////")

dependencia1 := models.Dependencia{Id: 1, Nombre: "Dependencia 1"}
dependencia2 := models.Dependencia{Id: 2, Nombre: "Dependencia 2"}
dependencia3 := models.Dependencia{Id: 3, Nombre: "Dependencia 3"}

organigramaOriginal := []*models.Organigrama{
    {
        Dependencia: dependencia1,
        Tipo:        []string{"Tipo A"}, 
        Hijos: []*models.Organigrama{
            {
                Dependencia: dependencia2,
                Tipo:        []string{"Tipo B"}, 
                Hijos:       []*models.Organigrama{},
            },
        },
    },
    {
        Dependencia: dependencia3,
        Tipo:        []string{"Tipo C"}, 
        Hijos:       []*models.Organigrama{},
    },
}

t.Run("Caso 1: Copiar un organigrama con múltiples niveles", func(t *testing.T) {
    resultado := services.CopiarOrganigrama(organigramaOriginal)

    if len(resultado) != len(organigramaOriginal) {
        t.Errorf("Se esperaban %d elementos, pero se obtuvieron: %d", len(organigramaOriginal), len(resultado))
    }

    for i, org := range resultado {
        if org.Dependencia.Id != organigramaOriginal[i].Dependencia.Id { 
            t.Errorf("Se esperaban %v, pero se obtuvieron %v en el índice %d", organigramaOriginal[i].Dependencia.Id, org.Dependencia.Id, i)
        }

        if len(org.Tipo) != len(organigramaOriginal[i].Tipo) {
            t.Errorf("El tamaño de los tipos no coincide en el índice %d", i)
        } else {
            for j, tipo := range org.Tipo {
                if tipo != organigramaOriginal[i].Tipo[j] {
                    t.Errorf("Se esperaban el tipo %s, pero se obtuvieron %s en el índice %d", organigramaOriginal[i].Tipo[j], tipo, i)
                }
            }
        }
    }
})

t.Run("Caso 2: Copiar un organigrama vacío", func(t *testing.T) {
    organigramaVacio := []*models.Organigrama{}

    resultado := services.CopiarOrganigrama(organigramaVacio)

    if len(resultado) != 0 {
        t.Errorf("Se esperaba un organigrama vacío, pero se obtuvieron: %d", len(resultado))
    }
})

}*/

/func TestFiltrarOrganigrama(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestFiltrarOrganigrama") t.Log("//////////////////////////////////")

dependencia1 := &models.Dependencia{Id: 1, Nombre: "Dependencia 1"}
dependencia2 := &models.Dependencia{Id: 2, Nombre: "Dependencia 2"}
dependencia3 := &models.Dependencia{Id: 3, Nombre: "Dependencia 3"}
dependencia4 := &models.Dependencia{Id: 4, Nombre: "Dependencia 4"}

dependencias_padre := []models.DependenciaPadre{
    {HijaId: dependencia1},
    {HijaId: dependencia2},
}

organigramaCumpleCriterios := []*models.Organigrama{
    {
        Dependencia: *dependencia1,
        Hijos: []*models.Organigrama{
            {
                Dependencia: *dependencia3,
                Hijos: []*models.Organigrama{},
            },
        },
    },
    {
        Dependencia: *dependencia2,
        Hijos: []*models.Organigrama{},
    },
    {
        Dependencia: *dependencia4,
        Hijos: []*models.Organigrama{
            {
                Dependencia: *dependencia1,
                Hijos: []*models.Organigrama{},
            },
        },
    },
}

t.Run("Caso 1: Filtrar organigrama con hijos y/o dependencias padre", func(t *testing.T) {
    monkey.Patch(services.TienePadre, func(nodo *models.Organigrama, dependencias_padre []models.DependenciaPadre) bool {
        return true 
    })
    defer monkey.UnpatchAll()

    resultado := services.FiltrarOrganigrama(organigramaCumpleCriterios, dependencias_padre)

    if len(resultado) != 3 {
        t.Errorf("Se esperaban 3 elementos, pero se obtuvieron: %d", len(resultado))
    }
})

organigramaSinCriterios := []*models.Organigrama{
    {
        Dependencia: *dependencia4,
        Hijos:       []*models.Organigrama{},
    },
}

t.Run("Caso 2: Filtrar organigrama sin hijos y sin dependencias padre", func(t *testing.T) {
    monkey.Patch(services.TienePadre, func(nodo *models.Organigrama, dependencias_padre []models.DependenciaPadre) bool {
        return false 
    })
    defer monkey.UnpatchAll()

    resultado := services.FiltrarOrganigrama(organigramaSinCriterios, dependencias_padre)

    if len(resultado) != 0 {
        t.Errorf("Se esperaba un organigrama vacío, pero se obtuvieron: %d", len(resultado))
    }
})

}*/

/func TestTienePadre(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestTienePadre") t.Log("//////////////////////////////////")

dependencia1 := &models.Dependencia{Id: 1, Nombre: "Dependencia 1"}
dependencia2 := &models.Dependencia{Id: 2, Nombre: "Dependencia 2"}
dependencia3 := &models.Dependencia{Id: 3, Nombre: "Dependencia 3"}

t.Run("Caso 1: Nodo tiene padre", func(t *testing.T) {
    nodo := &models.Organigrama{
        Dependencia: *dependencia1,
    }

    dependencias_padre := []models.DependenciaPadre{
        {HijaId: dependencia1},
        {HijaId: dependencia2},
    }

    resultado := services.TienePadre(nodo, dependencias_padre)

    if !resultado {
        t.Errorf("Se esperaba que el nodo tuviera padre, pero no lo tiene")
    }
})

t.Run("Caso 2: Nodo no tiene padre", func(t *testing.T) {
    nodo := &models.Organigrama{
        Dependencia: *dependencia3,
    }

    dependencias_padre := []models.DependenciaPadre{
        {HijaId: dependencia1},
        {HijaId: dependencia2},
    }

    resultado := services.TienePadre(nodo, dependencias_padre)

    if resultado {
        t.Errorf("Se esperaba que el nodo no tuviera padre, pero lo tiene")
    }
})

}*/

/func TestPodarOrganigramaAcademico(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestPodarOrganigramaAcademico") t.Log("//////////////////////////////////")

t.Run("Caso 1: Filtrar correctamente los hijos de la Rectoría", func(t *testing.T) {
    organigrama := []*models.Organigrama{
        {
            Dependencia: models.Dependencia{Nombre: "RECTORIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ADMINISTRATIVA"},
                },
            },
        },
        {
            Dependencia: models.Dependencia{Nombre: "OTRA DEPENDENCIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
            },
        },
    }

    resultado := services.PodarOrganigramaAcademico(organigrama)

    if len(resultado[0].Hijos) != 1 {
        t.Errorf("Se esperaban 1 hijo después de podar, pero se obtuvieron: %d", len(resultado[0].Hijos))
    }

    if resultado[0].Hijos[0].Dependencia.Nombre != "VICERRECTORIA ACADEMICA" {
        t.Errorf("Se esperaba que el hijo fuera 'VICERRECTORIA ACADEMICA', pero se obtuvo: %s", resultado[0].Hijos[0].Dependencia.Nombre)
    }

    if len(resultado[1].Hijos) != 1 {
        t.Errorf("Se esperaban 1 hijo en 'OTRA DEPENDENCIA', pero se obtuvieron: %d", len(resultado[1].Hijos))
    }
})

t.Run("Caso 2: Sin dependencias de tipo 'RECTORIA'", func(t *testing.T) {
    organigrama := []*models.Organigrama{
        {
            Dependencia: models.Dependencia{Nombre: "OTRA DEPENDENCIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
            },
        },
    }

    resultado := services.PodarOrganigramaAcademico(organigrama)

    if len(resultado) != 1 || len(resultado[0].Hijos) != 1 {
        t.Errorf("Se esperaba que el organigrama no se modificara, pero se obtuvieron: %d elementos", len(resultado))
    }
})

}*/

/func TestPodarOrganigramaAdministrativo(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestPodarOrganigramaAdministrativo") t.Log("//////////////////////////////////")

t.Run("Caso 1: Filtrar correctamente los hijos de la Rectoría", func(t *testing.T) {
    organigrama := []*models.Organigrama{
        {
            Dependencia: models.Dependencia{Nombre: "RECTORIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ADMINISTRATIVA"},
                },
            },
        },
        {
            Dependencia: models.Dependencia{Nombre: "OTRA DEPENDENCIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
            },
        },
    }

    resultado := services.PodarOrganigramaAdministrativo(organigrama)

    if len(resultado[0].Hijos) != 1 {
        t.Errorf("Se esperaban 1 hijo después de podar, pero se obtuvieron: %d", len(resultado[0].Hijos))
    }

    if resultado[0].Hijos[0].Dependencia.Nombre != "VICERRECTORIA ADMINISTRATIVA" {
        t.Errorf("Se esperaba que el hijo fuera 'VICERRECTORIA ADMINISTRATIVA', pero se obtuvo: %s", resultado[0].Hijos[0].Dependencia.Nombre)
    }

    if len(resultado[1].Hijos) != 1 {
        t.Errorf("Se esperaban 1 hijo en 'OTRA DEPENDENCIA', pero se obtuvieron: %d", len(resultado[1].Hijos))
    }
})

t.Run("Caso 2: Sin dependencias de tipo 'RECTORIA'", func(t *testing.T) {
    organigrama := []*models.Organigrama{
        {
            Dependencia: models.Dependencia{Nombre: "OTRA DEPENDENCIA"},
            Hijos: []*models.Organigrama{
                {
                    Dependencia: models.Dependencia{Nombre: "VICERRECTORIA ACADEMICA"},
                },
            },
        },
    }

    resultado := services.PodarOrganigramaAdministrativo(organigrama)

    if len(resultado) != 1 || len(resultado[0].Hijos) != 1 {
        t.Errorf("Se esperaba que el organigrama no se modificara, pero se obtuvieron: %d elementos", len(resultado))
    }
})

}*/

y este es el avance test del archivo: registro_ dependencias_service: package services_test

import ( "errors" "testing" "bou.ke/monkey" "github.com/udistrital/gestion_dependencias_mid/services" "github.com/udistrital/gestion_dependencias_mid/models" "github.com/udistrital/utils_oas/request" "github.com/astaxie/beego" //"fmt" "strings" //"strconv" //"time" )

/func TestVerificarExistenciaTipo(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestVerificarExistenciaTipo") t.Log("//////////////////////////////////")

t.Run("Caso 1: Tipo de dependencia existe", func(t *testing.T) {
    tipoId := 1
    expectedTipo := models.TipoDependencia{
        Id:                tipoId,
        Nombre:            "Tipo Ejemplo",
        Descripcion:       "Descripción de ejemplo",
        CodigoAbreviacion: "TE",
        Activo:           true,
        FechaCreacion:    time.Date(2022, 10, 22, 10, 0, 0, 0, time.UTC), 
        FechaModificacion: time.Date(2023, 10, 22, 10, 0, 0, 0, time.UTC), 
    }

    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        if url == beego.AppConfig.String("OikosCrudUrl")+"tipo_dependencia/"+strconv.Itoa(tipoId) {
            tipoDependenciaPtr := target.(*models.TipoDependencia) 
            *tipoDependenciaPtr = expectedTipo                      
            return nil
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    tipoDependencia := services.VerificarExistenciaTipo(tipoId)

    if tipoDependencia != expectedTipo {
        t.Errorf("Se esperaba %v, pero se obtuvo %v", expectedTipo, tipoDependencia)
    }

    t.Log("Tipo de dependencia verificado exitosamente")
})

t.Run("Caso 2: Tipo de dependencia no existe", func(t *testing.T) {
    tipoId := 2 
    monkey.Patch(request.GetJson, func(url string, target interface{}) error {
        return errors.New("Tipo de dependencia no encontrado")
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "Tipo de dependencia no encontrado") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con tipo no encontrado, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.VerificarExistenciaTipo(tipoId)
})

}*/

/func TestRollbackDependenciaCreada(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackDependenciaCreada") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso de dependencia creada", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaId:                  1,
        DependenciaTipoDependenciaId:    []int{1, 2},
        DependenciaPadreId:              3,
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if strings.Contains(url, "dependencia/1") && method == "DELETE" {
            return nil 
        }
        return errors.New("URL no esperada")
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            t.Errorf("Se esperaba que no se generara un panic, pero se obtuvo: %v", r)
        }
    }()

    outputError := services.RollbackDependenciaCreada(transaccion)

    if outputError != nil {
        t.Errorf("Se esperaba un outputError nulo, pero se obtuvo: %v", outputError)
    }

    t.Log("Rollback de dependencia ejecutado exitosamente sin errores")
})

t.Run("Caso 2: Error en el rollback por datos mal formados", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaId: 0, 
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        return errors.New("Error en el rollback por datos mal formados")
    })

    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "Rollback de dependencia") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con el rollback, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.RollbackDependenciaCreada(transaccion) 
})

}*/

/func TestRollbackDependenciaTipoDependenciaCreada(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackDependenciaTipoDependenciaCreada") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso de tipo de dependencia", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaTipoDependenciaId: []int{1, 2}, 
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if method == "DELETE" && (strings.Contains(url, "dependencia_tipo_dependencia/1") || strings.Contains(url, "dependencia_tipo_dependencia/2")) {
            return nil 
        } else if strings.Contains(url, "dependencia/") {
            return nil 
        }
        return errors.New("URL no esperada") // Para URLs no reconocidas
    })
    defer monkey.UnpatchAll()

    outputError := services.RollbackDependenciaTipoDependenciaCreada(transaccion)

    if outputError != nil {
        t.Errorf("Se esperaba un outputError nulo, pero se obtuvo: %v", outputError)
    }

    t.Log("Rollback de tipo de dependencia ejecutado exitosamente sin errores")
})

t.Run("Caso 2: Error en el rollback de tipo de dependencia", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaTipoDependenciaId: []int{1}, 
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if method == "DELETE" && strings.Contains(url, "dependencia_tipo_dependencia/1") {
            return errors.New("Error al eliminar tipo de dependencia") 
        }
        return errors.New("URL no esperada") 
    })
    defer monkey.UnpatchAll()

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "Rollback de dependencia tipo dependencia") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con rollback, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.RollbackDependenciaTipoDependenciaCreada(transaccion)
})

}*/

/func TestRollbackDependenciaPadreCreada(t testing.T) { t.Log("//////////////////////////////////") t.Log("Inicio TestRollbackDependenciaPadreCreada") t.Log("//////////////////////////////////")

t.Run("Caso 1: Rollback exitoso de dependencia padre", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaPadreId: 1, 
        DependenciaTipoDependenciaId: []int{2, 3}, 
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if method == "DELETE" && url == beego.AppConfig.String("OikosCrudUrl")+"dependencia_padre/1" {
            return nil 
        }
        return errors.New("URL no esperada") 
    })
    defer monkey.Unpatch(request.SendJson)

    monkey.Patch(services.RollbackDependenciaTipoDependenciaCreada, func(transaccion *models.Creaciones) map[string]interface{} {
        return nil 
    })
    defer monkey.Unpatch(services.RollbackDependenciaTipoDependenciaCreada)

    outputError := services.RollbackDependenciaPadreCreada(transaccion)

    if outputError != nil {
        t.Errorf("Se esperaba un outputError nulo, pero se obtuvo: %v", outputError)
    }

    t.Log("Rollback de dependencia padre ejecutado exitosamente sin errores")
})

t.Run("Caso 2: Error en el rollback de dependencia padre", func(t *testing.T) {
    transaccion := &models.Creaciones{
        DependenciaPadreId: 1, 
    }

    monkey.Patch(request.SendJson, func(url string, method string, target interface{}, body interface{}) error {
        if method == "DELETE" && url == beego.AppConfig.String("OikosCrudUrl")+"dependencia_padre/1" {
            return errors.New("Error al eliminar dependencia padre") 
        }
        return errors.New("URL no esperada")
    })
    defer monkey.Unpatch(request.SendJson)

    monkey.Patch(services.RollbackDependenciaTipoDependenciaCreada, func(transaccion *models.Creaciones) map[string]interface{} {
        return nil 
    })
    defer monkey.Unpatch(services.RollbackDependenciaTipoDependenciaCreada)

    defer func() {
        if r := recover(); r != nil {
            errorMessage, ok := r.(string)
            if ok {
                t.Logf("Panic capturado correctamente: %v", errorMessage)
                if !strings.Contains(errorMessage, "Rollback de dependencia padre") {
                    t.Errorf("Se esperaba un mensaje de error relacionado con rollback, pero se obtuvo: %v", errorMessage)
                }
            } else {
                t.Errorf("Se esperaba un panic de tipo string, pero se obtuvo: %v", r)
            }
        } else {
            t.Errorf("Se esperaba un panic, pero no ocurrió")
        }
    }()

    services.RollbackDependenciaPadreCreada(transaccion)
})

}*/

JulianAvella commented 1 month ago

Después de estar corrigiendo error del estilo: root@LAZIUSPC:~/go/src/github.com/udistrital/gestion_dependencias_mid# go test -v ./tests/services === RUN TestBuscarDependencia === RUN TestBuscarDependencia/Caso_1:_Todos_los_datos_están_completos ejecuta la funcion !ExisteDependencia !ExisteDependencia dependencia_tipo_dependencia?query=T gestion_dependencias_service_test.go:1396: Resultados obtenidos: [{0xc0001d1d00 false} {0xc0001d1d80 false}] gestion_dependencias_service_test.go:1399: Test de caso exitoso para BuscarDependencia ejecutado correctamente
=== RUN TestBuscarDependencia/Caso_Fallido:_Datos_Incorrectos --- FAIL: TestBuscarDependencia (0.00s) --- PASS: TestBuscarDependencia/Caso_1:_Todos_los_datos_están_completos (0.00s) --- FAIL: TestBuscarDependencia/Caso_Fallido:_Datos_Incorrectos (0.00s) panic: target and replacement have to have the same type func(models.Dependencia) models.RespuestaBusquedaDependencia != func(models.Dependencia) models.RespuestaBusquedaDependencia [recovered] panic: target and replacement have to have the same type func(models.Dependencia) models.RespuestaBusquedaDependencia != func(models.Dependencia) models.RespuestaBusquedaDependencia

goroutine 15 [running]: testing.tRunner.func1.2({0xc9e9c0, 0xc0004ab870}) /root/programas/go/src/testing/testing.go:1389 +0x24e testing.tRunner.func1() /root/programas/go/src/testing/testing.go:1392 +0x39f panic({0xc9e9c0, 0xc0004ab870}) /root/programas/go/src/runtime/panic.go:838 +0x207 bou.ke/monkey.patchValue({0xcad8e0?, 0xe478a0?, 0x0?}, {0xca84e0, 0xe478d0, 0x13}) /root/go/pkg/mod/bou.ke/monkey@v1.0.2/monkey.go:80 +0x3f4 bou.ke/monkey.Patch({0xcad8e0?, 0xe478a0?}, {0xca84e0?, 0xe478d0?}) /root/go/pkg/mod/bou.ke/monkey@v1.0.2/monkey.go:49 +0x174 github.com/udistrital/gestion_dependencias_mid/tests/services_test.TestBuscarDependencia.func2(0xc000623860) /root/go/src/github.com/udistrital/gestion_dependencias_mid/tests/services/gestion_dependencias_service_test.go:1425 +0x14b testing.tRunner(0xc000623860, 0xe478e0) /root/programas/go/src/testing/testing.go:1439 +0x102 created by testing.(*T).Run /root/programas/go/src/testing/testing.go:1486 +0x35f FAIL github.com/udistrital/gestion_dependencias_mid/tests/services 0.023s FAIL

Estos tipos de errores los presento cada función con llamada http o que llama una función dentro que la que se evalua, entonces para solucionar estos errores que fueron demorados, se termina hasta ahorita.

image
JulianAvella commented 1 month ago
image
diagutierrezro commented 1 month ago

Muy buen trabajo Julian, queda pendiente por mi parte agregar las pruebas al pipeline de despliegue.