Skip to content

test: pruebas unitarias para middleware ValidarSistema#37

Open
IgorMaltsov wants to merge 4 commits intogaligaribaldi:mainfrom
IgorMaltsov:feature/add-tests
Open

test: pruebas unitarias para middleware ValidarSistema#37
IgorMaltsov wants to merge 4 commits intogaligaribaldi:mainfrom
IgorMaltsov:feature/add-tests

Conversation

@IgorMaltsov
Copy link
Copy Markdown

@IgorMaltsov IgorMaltsov commented Apr 29, 2026

¡Hola! Estoy comenzando mi camino en la automatización de pruebas con Go.
Encontré tu proyecto por casualidad y me pareció perfecto para practicar.
¡Espero que sea de utilidad!


Agrego pruebas unitarias para el middleware ValidarSistema.

  • Casos válidos: METRO, MB, CBB y otros sistemas
  • Casos inválidos: sistemas inexistentes, cadena vacía, números
  • Bug encontrado: MEXIBUS sin acento retorna 404 en lugar de 200
  • Prueba de contexto: verifica que sistemaValidado se guarda en mayúsculas

Summary by Sourcery

Add unit tests for the ValidarSistema middleware and adjust module dependencies.

Build:

  • Promote gin-contrib/cors to a direct dependency in go.mod.

Tests:

  • Add table-driven tests covering valid and invalid sistema values for the ValidarSistema middleware.
  • Add a test verifying that the validated sistema value is stored in uppercase in the request context.

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented Apr 29, 2026

Reviewer's Guide

Adds focused unit tests for the ValidarSistema middleware and promotes the CORS dependency to a direct requirement, ensuring correct behavior for valid/invalid systems and verified context values.

Sequence diagram for ValidarSistema middleware request flow

sequenceDiagram
    actor Client
    participant GinRouter
    participant MiddlewareValidarSistema
    participant Handler

    Client->>GinRouter: HTTP GET /:sistema/...
    GinRouter->>MiddlewareValidarSistema: Invoke with context
    MiddlewareValidarSistema->>MiddlewareValidarSistema: Read path param sistema
    alt sistema is valid (METRO, MB, CBB, MEXIBUS, others)
        MiddlewareValidarSistema->>MiddlewareValidarSistema: Normalize to uppercase
        MiddlewareValidarSistema->>GinRouter: Set context key sistemaValidado
        GinRouter->>Handler: Call next handler with context
        Handler-->>Client: 200 OK
    else sistema is invalid (unknown, empty, numeric)
        MiddlewareValidarSistema-->>Client: 404 Not Found
    end
Loading

Class diagram for ValidarSistema middleware and tests

classDiagram
    class MiddlewarePackage {
        +ValidarSistema() gin.HandlerFunc
    }

    class GinContext {
        +Param(key string) string
        +Next()
        +AbortWithStatus(code int)
        +Set(key string, value interface_any)
    }

    class MiddlewareTestSuite {
        +TestValidSystems()
        +TestInvalidSystems()
        +TestMexibusWithoutAccent()
        +TestContextStoresUppercaseSistema()
    }

    MiddlewarePackage ..> GinContext : uses
    MiddlewareTestSuite ..> MiddlewarePackage : tests
    MiddlewareTestSuite ..> GinContext : mocks or uses
Loading

File-Level Changes

Change Details Files
Add unit tests for the ValidarSistema middleware covering valid/invalid systems and context behavior.
  • Configure a minimal gin router in test mode with a route that exercises the ValidarSistema middleware and returns the validated system from the context.
  • Define a table-driven test suite to verify HTTP status codes for various system values, including valid systems (METRO, MB, case-insensitive variants, accented MEXIBÚS) and invalid inputs (unaccented MEXIBUS, empty string, numeric value).
  • Add a dedicated test to assert that the middleware stores the validated system in the context normalized to uppercase and that this value is returned in the JSON response.
cmd/pkg/controller/middleware/middleware_test.go
Adjust Go module dependencies for CORS middleware usage.
  • Promote github.com/gin-contrib/cors from an indirect to a direct dependency in go.mod.
  • Remove an unused indirect base64x dependency from go.mod and update go.sum accordingly.
go.mod
go.sum

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 3 issues, and left some high level feedback:

  • Including the known bug case ("MEXIBUS es no valida", 404) in the same common test table makes it harder to distinguish regressions from intentional failures; consider separating this into its own test or clearly marking it as a bug-expectation so future behavior changes can be handled explicitly.
  • In TestValidarSistema_ContextValue, add an assertion on the HTTP status code before decoding the body so that JSON decoding errors or unexpected responses are caught more clearly rather than failing only on the decoded value.
  • Using gin.SetMode(gin.TestMode) in an init function changes global state for all tests; consider moving this to a test helper or TestMain so its scope and impact on other packages’ tests are explicit and easier to control.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- Including the known bug case ("MEXIBUS es no valida", 404) in the same common test table makes it harder to distinguish regressions from intentional failures; consider separating this into its own test or clearly marking it as a bug-expectation so future behavior changes can be handled explicitly.
- In `TestValidarSistema_ContextValue`, add an assertion on the HTTP status code before decoding the body so that JSON decoding errors or unexpected responses are caught more clearly rather than failing only on the decoded value.
- Using `gin.SetMode(gin.TestMode)` in an `init` function changes global state for all tests; consider moving this to a test helper or `TestMain` so its scope and impact on other packages’ tests are explicit and easier to control.

## Individual Comments

### Comment 1
<location path="cmd/pkg/controller/middleware/middleware_test.go" line_range="34-37" />
<code_context>
+func TestValidarSistema_Common(t *testing.T) {
+	router := setupRouter()
+
+	cases := []struct {
+		descripcion    string
+		sistem         string
+		codigoEsperado int
+	}{{"Metro es valid", "METRO", 200},
+		{"MB es valida", "MB", 200},
+		{"metro es valid", "metro", 200},
</code_context>
<issue_to_address>
**suggestion (testing):** Falta un caso de prueba para el sistema `CBB` (y quizá otros) que se menciona en la descripción del PR

En la descripción del PR indicas que agregas casos válidos para METRO, MB, CBB y otros, pero en las pruebas sólo están METRO, MB y MEXIBÚS/MEXIBUS. Propongo añadir al menos un caso explícito para `CBB` (y cualquier otro sistema que se considere soportado) para que las pruebas coincidan con el alcance declarado y verifiquen esos caminos en el middleware.

```suggestion
	}{{"Metro es valid", "METRO", 200},
		{"MB es valida", "MB", 200},
		{"CBB es valido", "CBB", 200},
		{"metro es valid", "metro", 200},
		{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
```
</issue_to_address>

### Comment 2
<location path="cmd/pkg/controller/middleware/middleware_test.go" line_range="36-39" />
<code_context>
+	}{{"Metro es valid", "METRO", 200},
+		{"MB es valida", "MB", 200},
+		{"metro es valid", "metro", 200},
+		{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
+		{"MEXIBUS es no valida", "MEXIBUS", 404},
+		{"Cadena vacia es no valida", "", 404},
+		{"Numero es no valida", "1", 404},
</code_context>
<issue_to_address>
**suggestion (testing):** Aclarar la intención del caso `MEXIBUS` para que el test no se vuelva engañoso cuando se arregle el bug

Este caso está codificando como comportamiento esperado un bug conocido (MEXIBUS sin acento devuelve 404). Cuando alguien lo corrija, el test fallará pero no quedará claro si el 404 era lo deseado o solo el estado actual. Sugiero marcar explícitamente que es un bug conocido (p. ej. en el nombre de la subprueba o con un comentario `TODO: cambiar a 200 cuando se soporte MEXIBUS sin acento`), o separarlo en una prueba distinta que indique que el comportamiento es indeseado.

```suggestion
		{"metro es valid", "metro", 200},
		{"MEXIBÚS es valida", "MEXIBÚS", 200}, // Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
		// TODO: cambiar a 200 cuando se soporte "MEXIBUS" sin acento; actualmente documenta un bug conocido.
		{"MEXIBUS sin acento devuelve 404 (bug conocido)", "MEXIBUS", 404},
		{"Cadena vacia es no valida", "", 404},
```
</issue_to_address>

### Comment 3
<location path="cmd/pkg/controller/middleware/middleware_test.go" line_range="58-67" />
<code_context>
+	}
+}
+
+func TestValidarSistema_ContextValue(t *testing.T) {
+	router := setupRouter()
+
+	t.Run("ToUpper es ok", func(t *testing.T) {
+		w := httptest.NewRecorder()
+
+		req, _ := http.NewRequest("GET", "/"+"metro"+"/test", nil)
+
+		router.ServeHTTP(w, req)
+
+		var body map[string]string
+
+		err := json.NewDecoder(w.Body).Decode(&body)
+
+		if err != nil {
+			t.Errorf("Error al decodificar el cuerpo de la respuesta %v", err)
+		}
+
+		if body["sistema"] != "METRO" {
+			t.Errorf("TopUpper no trabajo %v", body["sistema"])
+		}
</code_context>
<issue_to_address>
**suggestion (testing):** En la prueba de contexto también conviene verificar el código de estado y la presencia de la clave

Además de validar el valor en mayúsculas, sería útil (1) comprobar explícitamente que el código de respuesta sea 200 antes de decodificar el cuerpo, y (2) verificar que la clave "sistema" exista en el mapa usando el segundo valor de la indexación (`value, ok := body["sistema"]`). Así la prueba queda más robusta ante cambios en el handler o el middleware.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +34 to +37
}{{"Metro es valid", "METRO", 200},
{"MB es valida", "MB", 200},
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Falta un caso de prueba para el sistema CBB (y quizá otros) que se menciona en la descripción del PR

En la descripción del PR indicas que agregas casos válidos para METRO, MB, CBB y otros, pero en las pruebas sólo están METRO, MB y MEXIBÚS/MEXIBUS. Propongo añadir al menos un caso explícito para CBB (y cualquier otro sistema que se considere soportado) para que las pruebas coincidan con el alcance declarado y verifiquen esos caminos en el middleware.

Suggested change
}{{"Metro es valid", "METRO", 200},
{"MB es valida", "MB", 200},
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
}{{"Metro es valid", "METRO", 200},
{"MB es valida", "MB", 200},
{"CBB es valido", "CBB", 200},
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.

Comment on lines +36 to +39
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
{"MEXIBUS es no valida", "MEXIBUS", 404},
{"Cadena vacia es no valida", "", 404},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): Aclarar la intención del caso MEXIBUS para que el test no se vuelva engañoso cuando se arregle el bug

Este caso está codificando como comportamiento esperado un bug conocido (MEXIBUS sin acento devuelve 404). Cuando alguien lo corrija, el test fallará pero no quedará claro si el 404 era lo deseado o solo el estado actual. Sugiero marcar explícitamente que es un bug conocido (p. ej. en el nombre de la subprueba o con un comentario TODO: cambiar a 200 cuando se soporte MEXIBUS sin acento), o separarlo en una prueba distinta que indique que el comportamiento es indeseado.

Suggested change
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, //Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
{"MEXIBUS es no valida", "MEXIBUS", 404},
{"Cadena vacia es no valida", "", 404},
{"metro es valid", "metro", 200},
{"MEXIBÚS es valida", "MEXIBÚS", 200}, // Creo que en producción, las solicitudes se enviarán utilizando la opción "MEXIBUS"?.
// TODO: cambiar a 200 cuando se soporte "MEXIBUS" sin acento; actualmente documenta un bug conocido.
{"MEXIBUS sin acento devuelve 404 (bug conocido)", "MEXIBUS", 404},
{"Cadena vacia es no valida", "", 404},

Comment on lines +58 to +67
func TestValidarSistema_ContextValue(t *testing.T) {
router := setupRouter()

t.Run("ToUpper es ok", func(t *testing.T) {
w := httptest.NewRecorder()

req, _ := http.NewRequest("GET", "/"+"metro"+"/test", nil)

router.ServeHTTP(w, req)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): En la prueba de contexto también conviene verificar el código de estado y la presencia de la clave

Además de validar el valor en mayúsculas, sería útil (1) comprobar explícitamente que el código de respuesta sea 200 antes de decodificar el cuerpo, y (2) verificar que la clave "sistema" exista en el mapa usando el segundo valor de la indexación (value, ok := body["sistema"]). Así la prueba queda más robusta ante cambios en el handler o el middleware.

@galigaribaldi
Copy link
Copy Markdown
Owner

Hola igor.
Mucho gusto en saludarte y en saber sobre tí.
Te agradezco mucho el tiempo de apoyar en los issues y la colaboración en este proyecto de Sofware Libre que va naciendo. Dame un par de días para revisar los cambios y los testings, así como para ejecutarlos, en caso de que pasen te lo haré saber, así como el caso de que haya alguna prueba que corregir.
Pásate a dar una vuelta al foro de este proyecto y deja tu comentario y experiencia.
Si tienes alguna duda o algo que quieras comentar, mándame un Email: galigaribaldi0@gmail.com
Saludos y de nuevo muchas gracias!

@galigaribaldi galigaribaldi added help wanted Extra attention is needed good first issue Good for newcomers area: backend Tareas del servidor, API y lógica de negocio go Pull requests that update go code labels Apr 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: backend Tareas del servidor, API y lógica de negocio go Pull requests that update go code good first issue Good for newcomers help wanted Extra attention is needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants