Skip to content

Feat/test - #6

Open
AxelPCG wants to merge 11 commits into
mainfrom
feat/test
Open

Feat/test#6
AxelPCG wants to merge 11 commits into
mainfrom
feat/test

Conversation

@AxelPCG

@AxelPCG AxelPCG commented May 12, 2026

Copy link
Copy Markdown
Owner

title: [DOCS]: Atualiza documentação com novas features e backlog


Descrição

Este PR atualiza a documentação do projeto para refletir o planejamento de novas funcionalidades. As principais alterações incluem:

  1. Criação de um novo PRD (PRD_AUTH.md) para a funcionalidade de Autenticação e Perfis de Usuário.
  2. Atualização do BACKLOG.md para consolidar todas as User Stories (do MVP e de Autenticação), incluindo links para as issues recém-criadas no GitHub.

Esta atualização centraliza o planejamento e facilita o rastreamento do desenvolvimento das próximas features.

Tipo de Alteração

Marque com um x as caixas que se aplicam:

  • Bug fix (alteração não-disruptiva que corrige um problema)
  • New feature (alteração não-disruptiva que adiciona funcionalidade)
  • Breaking change (correção ou funcionalidade que faria com que a funcionalidade existente não funcionasse como esperado)
  • Documentation (adiciona ou atualiza a documentação)
  • Refactoring (nenhuma alteração funcional, apenas melhoria de código)

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.

  • Revisão visual dos arquivos BACKLOG.md e PRD_AUTH.md.
  • Verificação dos links para as issues no GitHub.

Checklist

  • Meu código segue as diretrizes de estilo deste projeto.
  • Eu realizei uma auto-revisão do meu próprio código.
  • Eu comentei meu código, particularmente em áreas de difícil compreensão.
  • Eu fiz as alterações correspondentes na documentação.
  • Minhas alterações não geram novos avisos (warnings).
  • Eu adicionei testes que provam que minha correção é eficaz ou que minha funcionalidade funciona.
  • Testes de unidade novos e existentes passam localmente com minhas alterações.

Copilot AI review requested due to automatic review settings May 12, 2026 00:57

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 ShoppingCart e um workflow de CI com uv + 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.

Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/ci.yml
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
Comment thread .github/workflows/ci.yml Outdated
pip install uv
uv --version
- name: Install dependencies
run: uv sync
Comment thread pyproject.toml
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.136.1",
"pandas>=3.0.3",
Comment thread tests/test_cart.py
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 thread src/checkout.py
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 thread static/index.html
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 thread static/index.html
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 thread tests/test_cart.py
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 thread src/main.py
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)):
"""

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment thread .github/workflows/ci.yml
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
Comment thread src/checkout.py
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 thread src/checkout.py
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 thread src/checkout.py
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 thread src/main.py
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 thread tests/test_main.py
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
Comment thread tests/test_checkout.py
@@ -0,0 +1,152 @@
import pytest
from unittest.mock import MagicMock, patch
Comment thread tests/test_checkout.py
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)
Comment thread docs/PRD_AUTH.md
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 thread src/checkout.py
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants