Menu
Coddy logo textTech

Testes e Integração

Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 60 de 64.

challenge icon

Desafio

Médio

Neste desafio, você implementará um sistema de biblioteca de múltiplos arquivos com cobertura de testes abrangente. Você trabalhará com três arquivos somente leitura e um arquivo editável que contém comentários TODO detalhados orientando sua implementação:

  • book.py - Contém a definição da classe Book
  • user.py - Contém a classe User que você precisa implementar
  • library.py - Contém a definição da classe Library

Folha de consulta

Este desafio envolve a implementação de um sistema de biblioteca de arquivos múltiplos com três componentes principais:

  • book.py - Definição da classe Book
  • user.py - Implementação da classe User
  • library.py - Definição da classe Library

A implementação deve incluir uma cobertura de testes abrangente e seguir os comentários TODO fornecidos em cada arquivo.

Experimente você mesmo

from book import Book
from user import User
from library import Library

# Manipulador de casos de teste
test_case = input()

if test_case == "create_user":
    user_id = "1"
    name = "Name"
    
    user = User(user_id, name)
    print(user)
    print(f"Books borrowed: {len(user.books_borrowed)}")

elif test_case == "borrow_and_return_all":
    library = Library("Community Library")
    
    # Adiciona livros e usuários
    library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
    library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
    library.add_book(Book("1984", "George Orwell", "345678"))
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Empresta livros
    library.borrow_book("123456", "U001")
    library.borrow_book("789012", "U001")
    library.borrow_book("345678", "U001")
    
    print(f"Books borrowed before: {len(user.books_borrowed)}")
    
    # Devolve todos os livros
    num_returned = user.return_all_books(library)
    
    print(f"Books returned: {num_returned}")
    print(f"Books borrowed after: {len(user.books_borrowed)}")
    
    # Verifica se todos os livros estão disponíveis
    for book in library.books:
        print(f"Book {book.isbn} available: {book.available}")

elif test_case == "return_some_books":
    library = Library("Community Library")
    
    # Adiciona livros e usuários
    book1 = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    book2 = Book("To Kill a Mockingbird", "Harper Lee", "789012")
    library.add_book(book1)
    library.add_book(book2)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Empresta apenas um livro
    library.borrow_book("123456", "U001")
    
    print(f"Books borrowed before: {len(user.books_borrowed)}")
    
    # Devolve todos os livros
    num_returned = user.return_all_books(library)
    
    print(f"Books returned: {num_returned}")
    print(f"Books borrowed after: {len(user.books_borrowed)}")

elif test_case == "empty_return":
    library = Library("Community Library")
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    print(f"Books borrowed: {len(user.books_borrowed)}")
    
    # Devolve todos os livros (deve ser 0)
    num_returned = user.return_all_books(library)
    
    print(f"Books returned: {num_returned}")

elif test_case == "multiple_users":
    library = Library("Community Library")
    
    # Adiciona livros
    library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
    library.add_book(Book("To Kill a Mockingbird", "Harper Lee", "789012"))
    
    # Adiciona usuários
    user1 = User("U001", "Alice")
    user2 = User("U002", "Bob")
    library.add_user(user1)
    library.add_user(user2)
    
    # Empresta livros
    library.borrow_book("123456", "U001")
    library.borrow_book("789012", "U002")
    
    print(user1)
    print(user2)
    
    # Devolve todos os livros do user1
    num_returned = user1.return_all_books(library)
    
    print(f"Books returned by {user1.name}: {num_returned}")
    
    print(user1)
    print(user2)

elif test_case == "error_handling":
    library = Library("Community Library")
    
    # Adiciona livro e usuário
    library.add_book(Book("The Great Gatsby", "F. Scott Fitzgerald", "123456"))
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Tenta emprestar um livro inexistente
    result = library.borrow_book("999999", "U001")
    print(result)
    
    # Tenta emprestar para um usuário inexistente
    result = library.borrow_book("123456", "U999")
    print(result)
    
    # Empresta um livro existente
    result = library.borrow_book("123456", "U001")
    print(result)
    
    # Tenta emprestar o mesmo livro novamente
    result = library.borrow_book("123456", "U001")
    print(result)
    
    # Tenta devolver um livro que não foi emprestado
    result = library.return_book("789012", "U001")
    print(result)

elif test_case == "stress_test":
    library = Library("Community Library")
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # Adiciona 100 livros
    for i in range(1, 101):
        isbn = f"{i:03d}"  # Formata como 001, 002, etc.
        library.add_book(Book(f"Book {i}", f"Author {i}", isbn))
        library.borrow_book(isbn, "U001")
    
    print(f"Books borrowed: {len(user.books_borrowed)}")
    
    # Devolve todos os livros
    num_returned = user.return_all_books(library)
    
    print(f"Books returned: {num_returned}")
    print(f"Books borrowed after: {len(user.books_borrowed)}")

Todas as lições de Object Oriented Programming