Menu
Coddy logo textTech

Pruebas e integración

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 104 de 107.

challenge icon

Desafío

Fácil

¡Vamos a completar nuestro Sistema de Gestión de Biblioteca escribiendo pruebas que verifiquen que todo funciona correctamente! Crearás un archivo de prueba que valide la funcionalidad principal de tu biblioteca, asegurando que los libros se puedan tomar prestados y devolver adecuadamente, y que las condiciones de error se manejen de forma correcta.

Organizarás tu código en cinco archivos:

  • book.go: Tu struct Book con los campos ID, Title, Author, ISBN y Available. Incluye el constructor NewBook que inicializa los libros como disponibles.

  • user.go: Tu struct User con los campos ID, Name, Email y BorrowedBooks. Incluye el constructor NewUser.

  • library.go: Tu struct Library con mapas para libros y usuarios, junto con los métodos NewLibrary, AddBook, AddUser, Borrow y Return. El método Borrow debe devolver errores para un usuario inválido, un libro inválido o un libro no disponible. El método Return debe devolver errores para un usuario inválido, un libro inválido o un libro no prestado.

  • library_test.go: ¡Aquí es donde escribirás tus funciones de prueba! Crea pruebas que verifiquen:
    • TestBorrowSuccess — Verifica que tomar prestado un libro disponible sea exitoso (no se devuelve error), el libro pase a estar no disponible y el ID del libro se agregue a la lista de prestados del usuario.
    • TestBorrowUnavailable — Verifica que intentar tomar prestado un libro que ya está prestado devuelva un error.
    • TestBorrowInvalidUser — Verifica que intentar tomar prestado con un ID de usuario inexistente devuelva un error.
    • TestReturnSuccess — Verifica que devolver un libro prestado sea exitoso, el libro vuelva a estar disponible y el ID del libro se elimine de la lista de prestados del usuario.

    Cada prueba debe configurar su propia biblioteca con los libros y usuarios necesarios, realizar la operación y comprobar los resultados utilizando t.Error o t.Errorf cuando las aserciones fallen.

  • main.go: Ejecuta tus pruebas manualmente e informa los resultados. Lee el nombre de la prueba a ejecutar (borrow_success, borrow_unavailable, borrow_invalid_user o return_success). Basándote en el nombre de la prueba, configura el escenario apropiado e imprime PASS si todas las aserciones pasan, o FAIL: [reason] si alguna aserción falla.

Se proporcionará la siguiente entrada:

  • Un nombre de prueba: borrow_success, borrow_unavailable, borrow_invalid_user o return_success

Para cada prueba, utiliza estos datos de prueba estándar (fixtures):

  • Libro: ID B001, Title Go Programming, Author John Doe, ISBN 123-456
  • Usuario: ID U001, Name Alice, Email alice@test.com

Por ejemplo, dado:

borrow_success

Tu salida debería ser:

PASS

Y dado:

borrow_unavailable

Tu salida debería ser:

PASS

Y dado:

borrow_invalid_user

Tu salida debería ser:

PASS

Y dado:

return_success

Tu salida debería ser:

PASS

Para borrow_success: Crea la biblioteca, añade el libro y el usuario, toma prestado el libro, verifica que no haya error, verifica que el libro no esté disponible, verifica que el usuario tenga el libro en su lista de prestados.

Para borrow_unavailable: Crea la biblioteca, añade el libro y el usuario, establece el campo Available del libro a false, intenta tomarlo prestado, verifica que se devuelva un error.

Para borrow_invalid_user: Crea la biblioteca, añade solo el libro (sin usuario), intenta tomarlo prestado con el ID de usuario U001, verifica que se devuelva un error.

Para return_success: Crea la biblioteca, añade el libro y el usuario, toma prestado el libro primero, luego devuélvelo, verifica que no haya error, verifica que el libro esté disponible de nuevo, verifica que la lista de prestados del usuario esté vacía.

¡Escribir pruebas asegura que tu sistema de biblioteca se comporte correctamente y te da confianza para realizar cambios sin romper la funcionalidad existente!

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	testName, _ := reader.ReadString('\n')
	testName = strings.TrimSpace(testName)

	// Accesorios de prueba estándar
	// Book: ID "B001", Title "Go Programming", Author "John Doe", ISBN "123-456"
	// User: ID "U001", Name "Alice", Email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Probar que tomar prestado un libro disponible tiene éxito
		// 1. Crear la biblioteca, añadir el libro y el usuario
		// 2. Tomar prestado el libro
		// 3. Verificar: sin errores, libro no disponible, el usuario tiene el libro en su lista
		// Imprimir "PASS" si todo pasa, o "FAIL: [reason]" si algo falla
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Probar que tomar prestado un libro no disponible devuelve un error
		// 1. Crear la biblioteca, añadir el libro y el usuario
		// 2. Establecer Available del libro a false
		// 3. Intentar tomar prestado
		// 4. Verificar que se devuelve un error
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Probar que tomar prestado con un usuario inválido devuelve un error
		// 1. Crear la biblioteca, añadir solo el libro (sin usuario)
		// 2. Intentar tomar prestado con el ID de usuario "U001"
		// 3. Verificar que se devuelve un error
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Probar que devolver un libro prestado tiene éxito
		// 1. Crear la biblioteca, añadir el libro y el usuario
		// 2. Tomar prestado el libro primero
		// 3. Devolver el libro
		// 4. Verificar: sin errores, libro disponible, la lista del usuario está vacía
		fmt.Println("FAIL: not implemented")

	default:
		fmt.Println("FAIL: unknown test")
	}
}

Todas las lecciones de Programación Orientada a Objetos