Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/rafa-kozand/challenge-api_fastapi-tdd
API with FastAPI - TDD - DIO (https://web.dio.me/play) for 'Python A.I. Backend Developer'
https://github.com/rafa-kozand/challenge-api_fastapi-tdd
api dio dio-bootcamp fastapi python tdd
Last synced: 25 days ago
JSON representation
API with FastAPI - TDD - DIO (https://web.dio.me/play) for 'Python A.I. Backend Developer'
- Host: GitHub
- URL: https://github.com/rafa-kozand/challenge-api_fastapi-tdd
- Owner: Rafa-KozAnd
- Created: 2024-05-04T13:31:45.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-05-08T00:52:13.000Z (9 months ago)
- Last Synced: 2024-11-12T01:33:08.278Z (3 months ago)
- Topics: api, dio, dio-bootcamp, fastapi, python, tdd
- Language: Python
- Homepage:
- Size: 92.8 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Challenge-API_FastAPI-TDD
API with FastAPI - TDD - DIO (https://web.dio.me/play) for 'Python A.I. Backend Developer'## TDD Project
### O que é TDD?
TDD é uma sigla para `Test Driven Development`, ou Desenvolvimento Orientado a Testes. A ideia do TDD é que você trabalhe em ciclos.#### Ciclo do TDD
![C4](/docs/img/img-tdd.png)#### Vantagens do TDD
- entregar software de qualidade;
- testar procurando possíveis falhas;
- criar testes de integração, testes isolados (unitários);
- evitar escrever códigos complexos ou que não sigam os pré-requisitos necessários;A proposta do TDD é que você codifique antes mesmo do código existir, isso nos garante mais qualidade no nosso projeto. Além de que, provavelmente se você deixar pra fazer os testes no final, pode acabar não fazendo. Com isso, sua aplicação perde qualidade e está muito mais propensa a erros.
## Store API
### Resumo do projeto
Este documento traz informações do desenvolvimento de uma API em FastAPI a partir do TDD.### Objetivo
Essa aplicação tem como objetivo principal trazer conhecimentos sobre o TDD, na prática, desenvolvendo uma API com o Framework Python, FastAPI. Utilizando o banco de dados MongoDB, para validações o Pydantic, para os testes Pytest e entre outras bibliotecas.### O que é?
Uma aplicação que:
- tem fins educativos;
- permite o aprendizado prático sobre TDD com FastAPI + Pytest;### O que não é?
Uma aplicação que:
- se comunica com apps externas;### Solução Proposta
Desenvolvimento de uma aplicação simples a partir do TDD, que permite entender como criar tests com o `pytest`. Construindo testes de Schemas, Usecases e Controllers (teste de integração).#### Arquitetura
|![C4](/docs/img/store.drawio.png)|
|:--:|
| Diagrama de C4 da Store API |#### Banco de dados - MongoDB
|![C4](/docs/img/product.drawio.png)|
|:--:|
| Database - Store API |### StoreAPI
#### Diagramas de sequência para o módulo de Produtos
##### Diagrama de criação de produto```mermaid
sequenceDiagram
title Create Product
Client->>+API: Request product creation
Note right of Client: POST /productsAPI->>API: Validate body
alt Invalid body
API->Client: Error Response
Note right of Client: Status Code: 422 - Unprocessable Entity
endAPI->>+Database: Request product creation
alt Error on insertion
API->Client: Error Response
note right of Client: Status Code: 500 - Internal Server Error
end
Database->>-API: Successfully createdAPI->>-Client: Successful Response
Note right of Client: Status Code: 201 - Created```
##### Diagrama de listagem de produtos```mermaid
sequenceDiagram
title List Products
Client->>+API: Request products list
Note right of Client: GET /productsAPI->>+Database: Request products list
Database->>-API: Successfully queried
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
```##### Diagrama de detalhamento de um produto
```mermaid
sequenceDiagram
title Get Product
Client->>+API: Request product
Note right of Client: GET /products/{id}
Path Params:
- id:API->>+Database: Request product
alt Error on query
API->Client: Error Response
Note right of Client: Status Code: 500 - Internal Server Error
else Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
endDatabase->>-API: Successfully queried
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
```
##### Diagrama de atualização de produto```mermaid
sequenceDiagram
title PUT Product
Client->>+API: Request product update
Note right of Client: PUT /products/{id}
Path Params:
- id:API->>API: Validate body
alt Invalid body
API->Client: Error Response
Note right of Client: Status Code: 422 - Unprocessable Entity
endAPI->>+Database: Request product
alt Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
endDatabase->>-API: Successfully updated
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
```##### Diagrama de exclusão de produto
```mermaid
sequenceDiagram
title Delete Product
Client->>+API: Request product delete
Note right of Client: DELETE /products/{id}
Path Params:
- id:API->>+Database: Request product
alt Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
endDatabase->>-API: Successfully deleted
API->>-Client: Successful Response
Note right of Client: Status Code: 204 - No content
```### Desafio Final
- Create
- Mapear uma exceção, caso dê algum erro de inserção e capturar na controller
- Update
- Modifique o método de patch para retornar uma exceção de Not Found, quando o dado não for encontrado
- a exceção deve ser tratada na controller, pra ser retornada uma mensagem amigável pro usuário
- ao alterar um dado, a data de updated_at deve corresponder ao time atual, permitir modificar updated_at também
- Filtros
- cadastre produtos com preços diferentes
- aplique um filtro de preço, assim: (price > 5000 and price < 8000)### Preparar ambiente
Vamos utilizar Pyenv + Poetry, link de como preparar o ambiente abaixo:
[poetry-documentation](https://github.com/nayannanara/poetry-documentation/blob/master/poetry-documentation.md)
### Links uteis de documentação
[mermaid](https://mermaid.js.org/)[pydantic](https://docs.pydantic.dev/dev/)
[validatores-pydantic](https://docs.pydantic.dev/latest/concepts/validators/)
[model-serializer](https://docs.pydantic.dev/dev/api/functional_serializers/#pydantic.functional_serializers.model_serializer)
[mongo-motor](https://motor.readthedocs.io/en/stable/)
[pytest](https://docs.pytest.org/en/7.4.x/)