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

¡Completemos nuestro Sistema de Gestión de Bibliotecas escribiendo pruebas que verifiquen que todo funciona correctamente! Crearás un archivo de pruebas que valide la funcionalidad principal de tu biblioteca: comprobar que los libros se puedan prestar y devolver correctamente, y que las condiciones de error se gestionen de forma adecuada.

Organizarás tu código en cinco archivos:

  • book.go: Tu estructura Book con los campos ID, Title, Author, ISBN y Available. Incluye el constructor NewBook, que inicializa los libros como disponibles.
  • user.go: Tu estructura User con los campos ID, Name, Email y BorrowedBooks. Incluye el constructor NewUser.
  • library.go: Tu estructura 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 no válido, un libro no válido o un libro no disponible. El método Return debe devolver errores para un usuario no válido, un libro no válido o un libro que no se haya prestado.
  • library_test.go: ¡Aquí escribirás tus funciones de prueba! Crea pruebas que verifiquen:
    • TestBorrowSuccess: Verifica que prestar un libro disponible tenga éxito (no se devuelva ningún error), que el libro pase a estar no disponible y que el ID del libro se añada a la lista de libros prestados del usuario.
    • TestBorrowUnavailable: Verifica que prestar un libro que ya se ha prestado devuelva un error.
    • TestBorrowInvalidUser: Verifica que prestar un libro con un ID de usuario inexistente devuelva un error.
    • TestReturnSuccess: Verifica que devolver un libro prestado tenga éxito, que el libro vuelva a estar disponible y que el ID del libro se elimine de la lista de libros prestados del usuario.

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

  • main.go: Ejecuta las pruebas manualmente e informa de los resultados. Lee el nombre de la prueba que se ejecutará (borrow_success, borrow_unavailable, borrow_invalid_user o return_success). Según el nombre de la prueba, configura el escenario adecuado e imprime PASS si todas las comprobaciones tienen éxito, o FAIL: [reason] si falla alguna comprobación.

Se proporcionará la siguiente entrada:

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

Para cada prueba, usa estos datos 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

Por ejemplo, dada la siguiente entrada:

borrow_success

Tu salida debe ser:

PASS

Y dada la siguiente entrada:

borrow_unavailable

Tu salida debe ser:

PASS

Y dada la siguiente entrada:

borrow_invalid_user

Tu salida debe ser:

PASS

Y dada la siguiente entrada:

return_success

Tu salida debe ser:

PASS

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

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

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

Para return_success: Crea la biblioteca, añade el libro y el usuario, presta primero el libro y después devuélvelo; verifica que no haya ningún error, que el libro vuelva a estar disponible y que la lista de libros prestados del usuario esté vacía.

¡Escribir pruebas garantiza que tu sistema de biblioteca funcione correctamente y te da la confianza necesaria para realizar cambios sin alterar 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)

	// Fixtures de prueba estándar
	// Libro: ID "B001", Título "Go Programming", Autor "John Doe", ISBN "123-456"
	// Usuario: ID "U001", Nombre "Alice", Email "alice@test.com"

	switch testName {
	case "borrow_success":
		// TODO: Prueba que prestar un libro disponible se realiza con éxito
		// 1. Crea la biblioteca, añade el libro y el usuario
		// 2. Presta el libro
		// 3. Verifica: sin error, libro no disponible, el usuario tiene el libro en la lista
		// Imprime "PASS" si todo pasa, o "FAIL: [reason]" si alguno falla
		fmt.Println("FAIL: not implemented")

	case "borrow_unavailable":
		// TODO: Prueba que prestar un libro no disponible devuelve un error
		// 1. Crea la biblioteca, añade el libro y el usuario
		// 2. Establece Available del libro a false
		// 3. Intenta prestar
		// 4. Verifica que se devuelve un error
		fmt.Println("FAIL: not implemented")

	case "borrow_invalid_user":
		// TODO: Prueba que prestar con un usuario inválido devuelve un error
		// 1. Crea la biblioteca, añade solo el libro (sin usuario)
		// 2. Intenta prestar con el ID de usuario "U001"
		// 3. Verifica que se devuelve un error
		fmt.Println("FAIL: not implemented")

	case "return_success":
		// TODO: Prueba que devolver un libro prestado tiene éxito
		// 1. Crea la biblioteca, añade el libro y el usuario
		// 2. Presta el libro primero
		// 3. Devuelve el libro
		// 4. Verifica: sin error, libro disponible, lista del usuario vacía
		fmt.Println("FAIL: not implemented")

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

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online