Conversation
There was a problem hiding this comment.
Pull request overview
Este PR amplia o projeto TechShop com um fluxo de carrinho + checkout, incluindo uma página HTML estática para simulação, testes unitários e um workflow de CI para rodar a suíte de testes.
Changes:
- Adiciona rotas FastAPI para carrinho (
/cart/add,/cart) e checkout (/checkout) e serving de estáticos em/app. - Introduz orquestração de checkout com “serviços” (estoque, frete, desconto, pagamento) e um frontend simples em
static/index.html. - Adiciona testes unitários para
ShoppingCarte um workflow de CI comuv+pytest-cov.
Reviewed changes
Copilot reviewed 7 out of 8 changed files in this pull request and generated 18 comments.
Show a summary per file
| File | Description |
|---|---|
| uv.lock | Atualiza lockfile do uv (inclui novas deps como pandas/numpy). |
| pyproject.toml | Adiciona pandas como dependência de runtime. |
| src/main.py | Implementa rotas de carrinho/checkout e monta arquivos estáticos. |
| src/checkout.py | Implementa orquestração de checkout e serviços auxiliares. |
| src/models.py | Adiciona modelo UserData. |
| static/index.html | Página estática para simular chamadas ao backend. |
| tests/test_cart.py | Testes unitários para ShoppingCart. |
| .github/workflows/ci.yml | Novo workflow de CI para instalar deps e rodar testes com cobertura. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: '3.11' |
| pip install uv | ||
| uv --version | ||
| - name: Install dependencies | ||
| run: uv sync |
| requires-python = ">=3.12" | ||
| dependencies = [ | ||
| "fastapi>=0.136.1", | ||
| "pandas>=3.0.3", |
Comment on lines
+160
to
+166
| def test_discount_empty_cart(product_1): | ||
| """ | ||
| Testa o cálculo de desconto para um carrinho vazio (caso de borda). | ||
| """ | ||
| # Arrange | ||
| cart = ShoppingCart() | ||
|
|
Comment on lines
+60
to
+68
| def charge(self, amount: float, user_id: int) -> Dict[str, Any]: | ||
| print(f"--- Processando pagamento de R$ {amount:.2f} para o usuário {user_id}... ---") | ||
| if 0 < amount < 9999: | ||
| print("--- Pagamento APROVADO (simulado) ---") | ||
| return {"status": "pagamento_aprovado", "transaction_id": "xyz123abc"} | ||
| else: | ||
| print("--- Pagamento RECUSADO (simulado) ---") | ||
| raise ConnectionError("Falha ao processar pagamento: valor inválido.") | ||
|
|
Comment on lines
+71
to
+75
| cartDetailsDiv.innerHTML = `<pre>${JSON.stringify(data, null, 2)}</pre>`; | ||
| } catch (error) { | ||
| console.error('Erro ao buscar carrinho:', error); | ||
| cartDetailsDiv.innerHTML = `<p style="color: red;">${error.message}</p>`; | ||
| } |
Comment on lines
+95
to
+100
| checkoutStatusDiv.innerHTML = `<h3>Compra Finalizada!</h3><pre>${JSON.stringify(data, null, 2)}</pre>`; | ||
| fetchCart(); // Atualiza o carrinho (deve estar vazio) | ||
| } catch (error) { | ||
| console.error('Erro no checkout:', error); | ||
| checkoutStatusDiv.innerHTML = `<p style="color: red;">${error.message}</p>`; | ||
| } |
Comment on lines
+7
to
+22
| def product_1(): | ||
| """Retorna um produto de exemplo com preço 10.00.""" | ||
| return Product(id=1, name="Test Product 1", price=10.00, category="Test") | ||
|
|
||
| @pytest.fixture | ||
| def product_2(): | ||
| """Retorna um produto de exemplo com preço 50.00.""" | ||
| return Product(id=2, name="Test Product 2", price=50.00, category="Test") | ||
|
|
||
| @pytest.fixture | ||
| def product_expensive(): | ||
| """Retorna um produto caro para testar descontos.""" | ||
| return Product(id=3, name="Expensive Product", price=600.00, category="Test") | ||
|
|
||
| @pytest.fixture | ||
| def product_very_expensive(): |
Comment on lines
+50
to
+74
| @app.post("/cart/add", response_model=CartItem, tags=["Carrinho"]) | ||
| def add_to_cart(item: CartItem, cart: ShoppingCart = Depends(get_cart)): | ||
| """ | ||
| Adiciona um item ao carrinho de compras do usuário. | ||
|
|
||
| Se o produto já existir no carrinho, a quantidade será somada. | ||
| """ | ||
| cart.add_item(item.product, item.quantity) | ||
| return item | ||
|
|
||
| @app.get("/cart", tags=["Carrinho"]) | ||
| def get_cart_details(cart: ShoppingCart = Depends(get_cart)): | ||
| """ | ||
| Retorna os detalhes do carrinho de compras do usuário, incluindo | ||
| os itens, o subtotal e o total com descontos aplicados. | ||
| """ | ||
| return { | ||
| "items": cart.items, | ||
| "subtotal": cart.calculate_total(), | ||
| "total_with_discount": cart.calculate_total_with_discount(), | ||
| } | ||
|
|
||
| @app.post("/checkout", tags=["Checkout"]) | ||
| def perform_checkout(user_data: UserData, cart: ShoppingCart = Depends(get_cart)): | ||
| """ |
…tication and user profiles
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 11 out of 13 changed files in this pull request and generated 14 comments.
Comments suppressed due to low confidence (4)
src/main.py:23
StaticFiles(directory="static")depende do CWD (pode quebrar quando o app é iniciado fora da raiz do repo). Para tornar mais robusto, resolva o caminho com base no arquivo (ex.:Path(__file__).../static).
# Monta a pasta 'static' para servir arquivos estáticos (nosso frontend)
app.mount("/app", StaticFiles(directory="static", html=True), name="static")
pyproject.toml:11
- O texto do PR descreve uma alteração “puramente de documentação”, mas este PR também adiciona dependências (ex.: pandas/httpx), novos módulos/rotas FastAPI, testes e workflow de CI. Ajuste a descrição/título para refletir o escopo real ou separe em PRs menores (docs vs código) para facilitar revisão e rastreabilidade.
"fastapi>=0.136.1",
"pandas>=3.0.3",
"pydantic>=2.13.4",
"uvicorn>=0.46.0",
tests/test_main.py:30
- Pelas diretrizes do projeto (docs/DIRETRIZES_IA.md), os testes devem seguir o padrão AAA (Arrange/Act/Assert). Aqui vários testes não separam explicitamente essas fases (alguns têm só asserts). Padronizar melhora legibilidade e manutenção.
# Testes para a rota /cart/add
def test_add_to_cart_success(mock_cart, sample_cart_item):
response = client.post("/cart/add", json=sample_cart_item.model_dump())
assert response.status_code == 200
assert len(mock_cart.items) == 1
tests/test_checkout.py:33
- Os testes deste arquivo nem sempre seguem explicitamente o padrão AAA exigido nas diretrizes (docs/DIRETRIZES_IA.md). Padronizar com blocos/Comentários de Arrange/Act/Assert em cada teste melhora consistência e facilita revisão.
# Testes para StockValidator
def test_stock_validator_success(sample_cart_item):
validator = StockValidator()
assert validator.validate([sample_cart_item]) is True
| - name: Set up Python | ||
| uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: '3.11' |
Comment on lines
+3
to
+17
| from typing import List, Dict, Any | ||
| from .models import CartItem, UserData | ||
|
|
||
| # --- Protocolos para Injeção de Dependência --- | ||
|
|
||
| class StockValidatorProtocol: | ||
| def validate(self, items: List[CartItem]) -> bool: ... | ||
|
|
||
| class ShippingServiceProtocol: | ||
| def calculate(self, items: List[CartItem]) -> float: ... | ||
|
|
||
| class DiscountServiceProtocol: | ||
| def calculate(self, total_value: float, user: UserData) -> float: ... | ||
|
|
||
| class PaymentServiceProtocol: |
Comment on lines
+24
to
+28
| def validate(self, items: List[CartItem]) -> bool: | ||
| print("--- Validando estoque... ---") | ||
| for item in items: | ||
| # Lógica de estoque mockada | ||
| mock_stock = 10 |
Comment on lines
+22
to
+25
| class StockValidator: | ||
| """Valida o estoque dos itens (implementação mock).""" | ||
| def validate(self, items: List[CartItem]) -> bool: | ||
| print("--- Validando estoque... ---") |
Comment on lines
+3
to
+6
| from typing import List, Dict, Any | ||
|
|
||
| app = FastAPI() | ||
| from .models import CartItem, UserData, Product | ||
| from .cart import ShoppingCart |
Comment on lines
+43
to
+45
| def test_checkout_empty_cart(mock_cart): | ||
| response = client.post("/checkout", json=UserData(id=1, name="Test", email="a@a.com", is_vip=False).model_dump()) | ||
| assert response.status_code == 400 |
| @@ -0,0 +1,152 @@ | |||
| import pytest | |||
| from unittest.mock import MagicMock, patch | |||
Comment on lines
+24
to
+28
| return UserData(id=1, name="VIP User", email="vip@test.com", is_vip=True) | ||
|
|
||
| @pytest.fixture | ||
| def regular_user(): | ||
| return UserData(id=2, name="Regular User", email="regular@test.com", is_vip=False) |
| Implementar um sistema de autenticação seguro que permita aos usuários criar contas, fazer login/logout e gerenciar um perfil básico. Isso é fundamental para personalizar a experiência de compra e permitir o rastreamento de pedidos. | ||
|
|
||
| #### 2. Requisitos Funcionais | ||
| * **US8:** Como um novo usuário, quero poder me cadastrar na plataforma usando e-mail and senha para ter uma conta pessoal. |
Comment on lines
+69
to
+72
| class PaymentService: | ||
| """Serviço que interage com a API de pagamento.""" | ||
| def __init__(self, payment_api: FakePaymentAPI): | ||
| self.payment_api = payment_api |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
title:
[DOCS]: Atualiza documentação com novas features e backlogDescrição
Este PR atualiza a documentação do projeto para refletir o planejamento de novas funcionalidades. As principais alterações incluem:
PRD_AUTH.md) para a funcionalidade de Autenticação e Perfis de Usuário.Esta atualização centraliza o planejamento e facilita o rastreamento do desenvolvimento das próximas features.
Tipo de Alteração
Marque com um
xas caixas que se aplicam:Como Isso Foi Testado?
Como esta é uma alteração puramente de documentação, não há testes de código a serem executados. A verificação foi feita revisando os arquivos gerados para garantir que o conteúdo está correto e os links para as issues estão funcionando.
PRD_AUTH.md.Checklist