Arquivo analisado: python-api/app/api/routes.py
Tipo da mudança
- Nova funcionalidade: inclusão de um novo endpoint POST
/cart/calculatepara cálculo do fechamento do carrinho de compras. - Integração de serviço: introdução do
CartServiceno roteamento da API, com dependência doDiscountService.
Evidências observadas
- No diff, foi adicionado o import do
CartServicee dos schemasCartRequesteCartResponse. - Instanciação de
cart_service = CartService(discount_service=discount_service)no escopo do router. - Novo endpoint definido com decorator
@router.post("/cart/calculate", response_model=CartResponse, tags=["cart"]). - O endpoint recebe um payload do tipo
CartRequest, converte os itens para dicionários viamodel_dump(), chamacart_service.calculate_cart_total()passando itens, código de cupom e flag VIP, e retorna umCartResponseconstruído a partir do resultado. - Tratamento de exceção para
ValueErrorque retorna HTTP 400 com a mensagem da exceção. - Contexto do repositório indica que a arquitetura separa rotas, serviços e schemas, e que os serviços encapsulam a lógica de negócio.
- Não há evidência no diff ou no arquivo atual sobre a implementação interna do
CartServiceou dos schemasCartRequesteCartResponse. - Não há testes existentes explícitos para o carrinho no contexto dos testes listados.
Impacto provável
- Introdução de um novo endpoint REST para cálculo do total do carrinho, que provavelmente agrega lógica de cálculo de preços, descontos e aplicação de cupons.
- Possível impacto na experiência do cliente que utiliza o endpoint
/cart/calculatepara obter o valor final do carrinho. - Dependência do
DiscountServicedentro doCartServicesugere que o cálculo do carrinho pode envolver regras de desconto já existentes, podendo impactar a consistência dos valores calculados. - Como o endpoint converte os itens do payload para dicionários e delega a lógica ao serviço, o comportamento do endpoint depende fortemente da implementação do serviço e dos schemas.
- A adição do endpoint não altera rotas existentes, minimizando impacto regressivo direto em outras funcionalidades.
Riscos identificados
- Validação e consistência dos dados de entrada: não há validação explícita no endpoint além do Pydantic via
CartRequest. Se o schema não for rigoroso, pode haver dados inválidos que causem erros no serviço. - Tratamento de exceções limitado: apenas
ValueErroré capturado e convertido em HTTP 400. Outros erros (ex: erros inesperados, falhas internas) podem resultar em 500 sem tratamento específico. - Dependência do
DiscountService: se oDiscountServicetiver bugs ou mudanças, pode impactar o cálculo do carrinho. - Ausência de testes automatizados para o novo endpoint: não há evidência de testes unitários ou de integração para
/cart/calculate, o que aumenta o risco de regressão ou comportamento inesperado. - Possível impacto na performance: se o cálculo do carrinho for complexo, pode afetar a latência do endpoint, embora não haja indicação clara disso.
- Incerteza sobre o formato esperado dos itens no
CartRequest: sem detalhes do schema, pode haver ambiguidades no que é aceito, o que pode gerar erros ou resultados incorretos.
Cenários de testes manuais
-
Cálculo básico do carrinho sem cupom e sem VIP
- Enviar payload com lista de itens válidos, sem cupom eis_vip=False.
- Verificar se o retorno contém o total correto e estrutura conformeCartResponse. -
Cálculo com cupom válido
- Enviar payload com cupom válido.
- Confirmar que o desconto é aplicado corretamente no total. -
Cálculo com cupom inválido
- Enviar payload com cupom inválido.
- Verificar se retorna HTTP 400 com mensagem adequada. -
Cálculo para usuário VIP
- Enviar payload comis_vip=True.
- Confirmar se o desconto VIP é aplicado conforme esperado. -
Payload com itens vazios
- Enviar payload com lista vazia de itens.
- Verificar se o sistema retorna total zero ou erro apropriado. -
Payload com dados inválidos nos itens (ex: quantidade negativa, preço negativo)
- Enviar payload com dados inválidos.
- Confirmar que retorna erro HTTP 400 com mensagem clara. -
Testar comportamento com campos obrigatórios faltando no payload
- Enviar payload incompleto.
- Verificar se Pydantic rejeita a requisição com erro 422. -
Testar resposta para exceções não previstas
- Simular erro interno no serviço (se possível).
- Verificar se o endpoint responde com erro 500 ou mensagem adequada.
Sugestões de testes unitários
- Testar o método
calculate_cartdo router isoladamente, mockandocart_service.calculate_cart_totalpara: - Retornar resultado esperado e validar que o endpoint retorna
CartResponsecorretamente. - Levantar
ValueErrore validar que o endpoint retorna HTTP 400 com a mensagem da exceção. - Testar a conversão dos itens do
CartRequestpara dicionários viamodel_dump(). - Validar que o endpoint chama
cart_service.calculate_cart_totalcom os parâmetros corretos. - Testar o comportamento do endpoint com payloads inválidos para garantir que Pydantic rejeita antes de chegar ao serviço.
Sugestões de testes de integração
- Testar o fluxo completo do endpoint
/cart/calculatecom payloads reais, validando: - Cálculo correto do total do carrinho com diferentes combinações de itens, cupons e flags VIP.
- Resposta correta para cupons inválidos ou dados inválidos.
- Integração correta entre o endpoint,
CartServiceeDiscountService. - Testar o endpoint com payloads extremos (muitos itens, valores altos) para validar estabilidade.
- Testar o endpoint em conjunto com outros endpoints relacionados a descontos para garantir consistência.
- Validar o schema de request e response via chamadas reais para garantir conformidade.
Sugestões de testes de carga ou desempenho
- Não há evidência clara na mudança que justifique testes de carga ou desempenho específicos para este endpoint.
- Caso o cálculo do carrinho envolva lógica complexa ou chamadas externas, considerar testes de carga em momento posterior.
Pontos que precisam de esclarecimento
- Detalhes do schema
CartRequesteCartResponse: quais campos são obrigatórios, tipos e regras de validação. - Implementação e regras de negócio do
CartService.calculate_cart_total: como são calculados descontos, tratamento de cupons, regras para VIP. - Comportamento esperado para casos de erro além de
ValueError: há outros tipos de exceções que devem ser tratados? - Limites e restrições do carrinho (ex: número máximo de itens, valores máximos).
- Se há necessidade de autenticação/autorização para este endpoint (não indicado no diff).
- Se o endpoint deve registrar logs ou métricas específicas para monitoramento.
Resumo: A mudança introduz um novo endpoint para cálculo do carrinho, integrando o serviço de carrinho com o serviço de desconto. A principal preocupação é garantir a validação correta dos dados, tratamento adequado de erros e cobertura de testes para evitar regressões. A ausência de testes automatizados para essa funcionalidade é um risco que deve ser mitigado com testes unitários e de integração específicos.
Arquivo analisado: python-api/app/schemas.py
Tipo da mudança
Adição de novos modelos Pydantic (schemas) para representar dados relacionados a carrinho de compras (CartItemSchema, CartRequest, CartResponse).
Evidências observadas
- O diff adiciona três novas classes no arquivo
python-api/app/schemas.py: CartItemSchemacom campos:id(str),name(str),price(float, >=0),quantity(int, default 1, >=1).CartRequestcom campos:items(lista deCartItemSchema),coupon_code(str ou None),is_vip(bool, default False).CartResponsecom campos:subtotal(float),tax_amount(float),final_price(float),items_count(int).- O arquivo
schemas.pyé o local central para definição dos modelos Pydantic usados para validação e serialização dos dados da API, conforme o contexto da arquitetura. - Não há alterações em rotas, serviços ou testes diretamente relacionadas a esses novos schemas no diff.
- O contexto do repositório mostra que o projeto é uma API REST com FastAPI, usando Pydantic para contratos de dados.
- Testes existentes para schemas (
test_schemas.py) focam em validação de campos e serialização, mas não há testes para os novos modelos adicionados.
Impacto provável
- Introdução de novos contratos de dados para endpoints relacionados a carrinho de compras, provavelmente para suportar funcionalidades de manipulação de carrinho, cálculo de preços, aplicação de cupons e status VIP.
- Esses modelos definem a estrutura esperada para requisições e respostas envolvendo carrinho, o que impacta diretamente a validação de entrada e saída da API.
- Como são novos modelos, não há impacto direto em funcionalidades existentes, mas a introdução pode afetar endpoints futuros ou já existentes que passem a usar esses schemas.
- A validação dos campos
priceequantityemCartItemSchemagarante que valores negativos ou inválidos sejam rejeitados, prevenindo dados incorretos. - Campos como
coupon_codeeis_vipindicam que a lógica de desconto ou tratamento especial pode ser aplicada no serviço de carrinho, embora isso não esteja no escopo do diff.
Riscos identificados
- Ausência de validação explícita para campos monetários além da restrição
ge=0: não há validação para casas decimais, formatos ou limites máximos, o que pode permitir valores monetários inválidos ou extremos. - Possível falta de testes para os novos schemas: sem testes unitários ou de integração que validem esses modelos, há risco de erros de validação não detectados em produção.
- Inconsistência entre
items_counte soma das quantidades emCartResponse: o campoitems_counté um inteiro, mas não está claro se representa a quantidade total de itens (somatório das quantidades) ou o número de tipos distintos de itens. Isso pode gerar confusão e erros na interpretação do cliente. - Campos opcionais e defaults podem gerar comportamento inesperado: por exemplo,
coupon_codepode serNoneou string vazia, eis_vipdefaulta paraFalse. Se a lógica de negócio não tratar corretamente esses casos, pode haver falhas. - Sem validação de integridade entre os campos: por exemplo, não há restrição para que
itemsnão seja vazio, o que pode levar a requisições com carrinho vazio, dependendo da regra de negócio. - Sem documentação ou comentários explicativos: dificulta o entendimento do uso esperado dos novos modelos, aumentando o risco de uso incorreto.
Cenários de testes manuais
-
Validação de criação de
CartItemSchemacom dados válidos e inválidos
- Criar item compricenegativo → deve falhar validação.
- Criar item comquantityzero ou negativo → deve falhar validação.
- Criar item comquantityomitido → deve assumir valor padrão 1.
- Criar item com camposidenamevazios ou nulos → deve falhar (pois são obrigatórios). -
Envio de
CartRequestcom diferentes combinações
- Enviar carrinho com lista vazia de itens → verificar se é aceito ou rejeitado.
- Enviar carrinho com múltiplos itens válidos → deve passar validação.
- Enviar carrinho comcoupon_codenulo, vazio e string válida → validar aceitação.
- Enviar carrinho comis_vipomitido e explicitamenteTrue→ validar valor padrão e override. -
Recebimento de
CartResponse
- Validar se os campossubtotal,tax_amount,final_priceeitems_countsão retornados corretamente e coerentes com os dados enviados.
- Verificar seitems_countcorresponde ao esperado (total de itens ou tipos de itens). -
Testar integração com endpoints que utilizem esses schemas (se existirem)
- Enviar requisições reais para endpoints que aceitemCartRequeste validar respostas comCartResponse.
- Testar comportamento com cupons inválidos, VIP true/false, e diferentes quantidades.
Sugestões de testes unitários
- Testar validação de
CartItemSchema - Criar instâncias com valores válidos e inválidos para
priceequantity. - Testar que
quantitypadrão é 1 quando omitido. -
Testar que campos obrigatórios
idenamenão aceitam valores nulos ou vazios. -
Testar validação de
CartRequest - Criar instância com lista vazia de itens e verificar se aceita (ou lançar erro se regra exigir).
- Testar aceitação de
coupon_codecomoNone, string vazia e string válida. -
Testar valor padrão de
is_vipcomoFalse. -
Testar serialização e desserialização de
CartResponse - Criar instância com valores típicos e verificar se serializa para JSON corretamente.
-
Desserializar JSON para objeto e validar campos.
-
Testar coerência de
items_count - Criar
CartResponsecom diferentes valores deitems_counte validar comportamento esperado (se houver lógica associada).
Sugestões de testes de integração
- Criar testes que enviem requisições HTTP para endpoints que utilizem os novos schemas (ex: POST
/cartou similar, se existir). - Validar que a API rejeita requisições com itens inválidos (preço negativo, quantidade inválida).
- Validar que a resposta da API contém
CartResponsecom campos corretos e coerentes. - Testar fluxo completo de criação de carrinho, aplicação de cupom e cálculo de preço final.
- Testar comportamento com usuários VIP e não VIP para verificar se o campo
is_vipinfluencia corretamente.
Sugestões de testes de carga ou desempenho
- Não aplicável, pois a mudança é apenas na definição de schemas e não há evidência de alteração em lógica de negócio ou performance.
Pontos que precisam de esclarecimento
- Qual é o significado exato do campo
items_countemCartResponse? É a soma das quantidades dos itens ou o número de tipos distintos de itens? - Existe alguma regra de negócio que impeça o envio de
CartRequestcom lista vazia de itens? O modelo atual não impede isso. - Há limites máximos para
priceequantityque deveriam ser validados? - Como o campo
coupon_codedeve ser tratado quando vazio ou nulo? Há diferenças no comportamento? - O campo
is_vipinfluencia diretamente o cálculo do preço final? Se sim, onde está implementada essa lógica? - Existem endpoints já implementados que usam esses novos schemas? Se sim, quais são para que possamos focar testes de integração?
- Há necessidade de validação adicional, como formatos específicos para
idenameemCartItemSchema?
Resumo: A mudança introduz novos modelos Pydantic para carrinho de compras, definindo estrutura e validação básica dos dados. O impacto é a criação de contratos para manipulação de carrinho, sem alterar funcionalidades existentes. Riscos principais são ausência de testes para esses modelos e possíveis ambiguidades no significado de campos como items_count. Recomenda-se criação de testes unitários para validação dos modelos e testes de integração para endpoints que os utilizem, além de esclarecimentos sobre regras de negócio associadas.
Arquivo analisado: python-api/app/services/cart_service.py
Tipo da mudança
Implementação de nova funcionalidade (adição de serviço de carrinho de compras com cálculo de total, impostos e descontos).
Evidências observadas
- O arquivo
cart_service.pyfoi criado do zero, contendo as classesCartItemeCartService. CartServicepossui métodocalculate_cart_totalque recebe lista de itens, código de cupom e flag VIP, e retorna subtotal, imposto, preço final e contagem de itens.- O cálculo do imposto é aplicado antes do desconto, conforme comentário no código:
python # Aplica taxa ANTES do desconto (regra de negócio duvidosa para testar o QA) - O desconto é calculado via
DiscountService.calculate_final_price, porém o valor base passado inclui o imposto, o que é destacado como um bug proposital no comentário:
python # BUG PROPOSITAL: Estamos passando o total COM imposto para o calculador de desconto # mas o DiscountService pode ter limites baseados no preço base. - Existe um desconto adicional "hardcoded" de 5% para compras acima de 1000 no subtotal, mas somente para não VIPs, o que é considerado estranho e um risco de regra de negócio:
python # Desconto de fidelidade "hardcoded" (risco de segurança/regra de negócio) if subtotal > 1000 and not is_vip: final_price *= 0.95 - O contexto do repositório mostra que o serviço é utilizado em
python-api/app/api/routes.pyvia injeção de dependência, indicando que a funcionalidade será exposta via API. - Não há evidência de testes unitários ou de integração específicos para
CartServiceno contexto fornecido.
Impacto provável
- Introdução de cálculo de total de carrinho com impostos e descontos, impactando funcionalidades relacionadas a checkout, cálculo de preços e aplicação de cupons.
- Possível impacto em regras de negócio de descontos, especialmente pela ordem de aplicação do imposto antes do desconto e pelo bug proposital de passar o valor com imposto para o serviço de desconto.
- Potencial impacto em clientes que esperam desconto aplicado sobre o subtotal sem imposto, podendo gerar valores finais incorretos.
- A regra de desconto adicional para compras grandes e não VIP pode causar confusão e resultados inesperados para usuários VIP e não VIP.
- Como o serviço é novo, pode impactar endpoints que venham a utilizá-lo, exigindo validação cuidadosa.
Riscos identificados
- Cálculo incorreto de desconto: Passar o valor com imposto para o
DiscountServicepode levar a descontos errados, especialmente se o serviço espera base_price sem imposto para aplicar limites ou regras. - Regra de negócio inconsistente: Aplicar imposto antes do desconto é incomum e pode gerar valores finais inesperados para o usuário.
- Desconto adicional para não VIPs: Pode ser um risco de segurança ou negócio, pois usuários VIP não recebem esse desconto extra, o que pode ser contra-intuitivo.
- Validação insuficiente dos dados de entrada: Apenas o preço negativo é validado na criação de
CartItem. Não há validação explícita para quantidade negativa ou zero, nem para campos obrigatórios no dicionário de itens. - Ausência de tratamento de erros: Se o
DiscountServicelançar exceção ou retornar valores inesperados, o métodocalculate_cart_totalnão trata isso. - Possível impacto na performance: Embora não haja indicação clara, o cálculo pode ser chamado frequentemente em cenários de checkout, mas não há otimizações visíveis.
- Falta de testes automatizados: Não há evidência de testes para essa nova funcionalidade, aumentando risco de regressão e bugs.
Cenários de testes manuais
-
Cálculo básico do carrinho sem cupom e sem VIP:
- Itens com preços e quantidades variadas.
- Verificar subtotal, imposto (8%), e preço final sem desconto. -
Aplicação de cupom válido e inválido:
- Testar com cupom que gera desconto e cupom inválido.
- Verificar se o desconto é aplicado corretamente considerando o bug proposital. -
Usuário VIP com e sem cupom:
- Confirmar que o desconto VIP é aplicado viaDiscountService.
- Confirmar que o desconto adicional de 5% para compras > 1000 não é aplicado para VIP. -
Usuário não VIP com subtotal > 1000:
- Confirmar que o desconto adicional de 5% é aplicado sobre o preço final após desconto do cupom. -
Itens com preço negativo:
- Tentar adicionar item com preço negativo e verificar seValueErroré lançado. -
Itens com quantidade zero ou negativa:
- Testar comportamento para quantidade zero ou negativa (não validado no código).
- Verificar se o cálculo considera ou rejeita esses casos. -
Carrinho vazio:
- Passar lista vazia e verificar se subtotal, imposto e preço final são zero. -
Valores com casas decimais:
- Testar valores com várias casas decimais para verificar arredondamento correto.
Sugestões de testes unitários
- Testar criação de
CartItemcom preço negativo para garantir exceção. - Testar
calculate_cart_totalcom: - Lista vazia de itens.
- Itens com quantidade padrão e explicitada.
- Aplicação correta do imposto (8%) sobre subtotal.
- Verificar que o desconto é calculado com base no total com imposto (bug proposital).
- Verificar aplicação do desconto adicional de 5% para subtotal > 1000 e não VIP.
- Verificar que para VIP não há desconto adicional.
- Testar comportamento com cupom válido e inválido (mockar
DiscountService). - Testar arredondamento dos valores retornados.
- Testar que
items_countcorresponde ao número de itens processados.
Sugestões de testes de integração
- Testar endpoint da API que utiliza
CartService(se existir) para calcular total do carrinho, validando resposta JSON com subtotal, imposto, preço final e contagem. - Testar fluxo completo de compra simulando diferentes perfis de usuário (VIP e não VIP) e cupons.
- Testar integração com
DiscountServicepara garantir que o bug proposital não cause falhas inesperadas. - Testar comportamento com dados inválidos (ex: itens com campos faltantes ou tipos errados) para verificar tratamento de erros.
Sugestões de testes de carga ou desempenho
- Não há evidência clara na mudança que justifique testes de carga ou desempenho específicos para este serviço.
Pontos que precisam de esclarecimento
- Regra de negócio do imposto antes do desconto: Confirmar se a aplicação do imposto antes do desconto é intencional ou um erro.
- Bug proposital no uso do valor com imposto para desconto: Confirmar se o
DiscountServicedeve receber o valor com ou sem imposto para cálculo correto. - Desconto adicional para não VIPs: Entender a lógica de negócio por trás de dar desconto extra para não VIPs em compras grandes, e se isso está correto.
- Validação de quantidade: Deve ser permitida quantidade zero ou negativa? Se não, implementar validação.
- Comportamento esperado para itens com dados incompletos ou inválidos: O método deve validar e rejeitar ou ignorar itens malformados?
- Tratamento de erros do
DiscountService: Como deve ser tratado se o serviço lançar exceção ou retornar valores inválidos?
Essa análise detalha os aspectos técnicos e riscos da nova implementação do serviço de carrinho, com foco em garantir cobertura adequada de testes e identificar pontos críticos para revisão.