{"id":19741831,"url":"https://github.com/rafa-kozand/challenge-api_fastapi-tdd","last_synced_at":"2026-05-15T10:14:35.321Z","repository":{"id":238131314,"uuid":"795947833","full_name":"Rafa-KozAnd/Challenge-API_FastAPI-TDD","owner":"Rafa-KozAnd","description":"API with FastAPI - TDD - DIO (https://web.dio.me/play) for 'Python A.I. Backend Developer'","archived":false,"fork":false,"pushed_at":"2024-05-08T00:52:13.000Z","size":95,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-10T20:17:08.814Z","etag":null,"topics":["api","dio","dio-bootcamp","fastapi","python","tdd"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rafa-KozAnd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-04T13:31:45.000Z","updated_at":"2024-05-08T12:14:13.000Z","dependencies_parsed_at":"2024-05-08T01:45:01.362Z","dependency_job_id":null,"html_url":"https://github.com/Rafa-KozAnd/Challenge-API_FastAPI-TDD","commit_stats":null,"previous_names":["rafa-kozand/challenge-api_fastapi-tdd"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rafa-KozAnd%2FChallenge-API_FastAPI-TDD","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rafa-KozAnd%2FChallenge-API_FastAPI-TDD/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rafa-KozAnd%2FChallenge-API_FastAPI-TDD/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rafa-KozAnd%2FChallenge-API_FastAPI-TDD/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rafa-KozAnd","download_url":"https://codeload.github.com/Rafa-KozAnd/Challenge-API_FastAPI-TDD/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241072423,"owners_count":19904763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","dio","dio-bootcamp","fastapi","python","tdd"],"created_at":"2024-11-12T01:28:01.567Z","updated_at":"2026-05-15T10:14:30.288Z","avatar_url":"https://github.com/Rafa-KozAnd.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"http://img.shields.io/static/v1?label=STATUS\u0026message=Concluded\u0026color=blue\u0026style=flat\"/\u003e\n  \u003cimg alt=\"GitHub language count\" src=\"https://img.shields.io/github/languages/count/Rafa-KozAnd/Challenge-API_FastAPI-TDD\"\u003e\n  \u003cimg alt=\"GitHub language count\" src=\"https://img.shields.io/github/languages/top/Rafa-KozAnd/Challenge-API_FastAPI-TDD\"\u003e\n  \u003cimg alt=\"GitHub repo file count\" src=\"https://img.shields.io/github/directory-file-count/Rafa-KozAnd/Challenge-API_FastAPI-TDD\"\u003e\n  \u003cimg alt=\"GitHub repo size\" src=\"https://img.shields.io/github/repo-size/Rafa-KozAnd/Challenge-API_FastAPI-TDD\"\u003e\n  \u003cimg alt=\"GitHub language count\" src=\"https://img.shields.io/github/license/Rafa-KozAnd/Challenge-API_FastAPI-TDD\"\u003e\n\u003c/p\u003e\n\n# Challenge-API_FastAPI-TDD\nAPI with FastAPI - TDD - DIO (https://web.dio.me/play) for 'Python A.I. Backend Developer'\n\n## TDD Project\n\n### O que é TDD?\nTDD é uma sigla para `Test Driven Development`, ou Desenvolvimento Orientado a Testes. A ideia do TDD é que você trabalhe em ciclos.\n\n#### Ciclo do TDD\n![C4](/docs/img/img-tdd.png)\n\n#### Vantagens do TDD\n- entregar software de qualidade;\n- testar procurando possíveis falhas;\n- criar testes de integração, testes isolados (unitários);\n- evitar escrever códigos complexos ou que não sigam os pré-requisitos necessários;\n\nA 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.\n\n## Store API\n### Resumo do projeto\nEste documento traz informações do desenvolvimento de uma API em FastAPI a partir do TDD.\n\n### Objetivo\nEssa 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.\n\n### O que é?\nUma aplicação que:\n- tem fins educativos;\n- permite o aprendizado prático sobre TDD com FastAPI + Pytest;\n\n### O que não é?\nUma aplicação que:\n- se comunica com apps externas;\n\n\n### Solução Proposta\nDesenvolvimento 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).\n\n#### Arquitetura\n|![C4](/docs/img/store.drawio.png)|\n|:--:|\n| Diagrama de C4 da Store API |\n\n#### Banco de dados - MongoDB\n|![C4](/docs/img/product.drawio.png)|\n|:--:|\n| Database - Store API |\n\n\n### StoreAPI\n#### Diagramas de sequência para o módulo de Produtos\n##### Diagrama de criação de produto\n\n```mermaid\nsequenceDiagram\n    title Create Product\n    Client-\u003e\u003e+API: Request product creation\n    Note right of Client: POST /products\n\n    API-\u003e\u003eAPI: Validate body\n\n    alt Invalid body\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 422 - Unprocessable Entity\n    end\n\n    API-\u003e\u003e+Database: Request product creation\n    alt Error on insertion\n        API-\u003eClient: Error Response\n        note right of Client: Status Code: 500 - Internal Server Error\n        end\n    Database-\u003e\u003e-API: Successfully created\n\n    API-\u003e\u003e-Client: Successful Response\n    Note right of Client: Status Code: 201 - Created\n\n```\n##### Diagrama de listagem de produtos\n\n```mermaid\nsequenceDiagram\n    title List Products\n    Client-\u003e\u003e+API: Request products list\n    Note right of Client: GET /products\n\n    API-\u003e\u003e+Database: Request products list\n\n    Database-\u003e\u003e-API: Successfully queried\n\n    API-\u003e\u003e-Client: Successful Response\n    Note right of Client: Status Code: 200 - Ok\n```\n\n##### Diagrama de detalhamento de um produto\n\n```mermaid\nsequenceDiagram\n    title Get Product\n    Client-\u003e\u003e+API: Request product\n    Note right of Client: GET /products/{id}\u003cbr/\u003e Path Params:\u003cbr/\u003e    - id: \u003cid\u003e\n\n    API-\u003e\u003e+Database: Request product\n    alt Error on query\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 500 - Internal Server Error\n    else Product not found\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 404 - Not Found\n        end\n\n    Database-\u003e\u003e-API: Successfully queried\n\n    API-\u003e\u003e-Client: Successful Response\n    Note right of Client: Status Code: 200 - Ok\n```\n##### Diagrama de atualização de produto\n\n```mermaid\nsequenceDiagram\n    title PUT Product\n    Client-\u003e\u003e+API: Request product update\n    Note right of Client: PUT /products/{id}\u003cbr/\u003e Path Params:\u003cbr/\u003e    - id: \u003cid\u003e\n\n    API-\u003e\u003eAPI: Validate body\n\n    alt Invalid body\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 422 - Unprocessable Entity\n    end\n\n    API-\u003e\u003e+Database: Request product\n    alt Product not found\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 404 - Not Found\n        end\n\n    Database-\u003e\u003e-API: Successfully updated\n\n    API-\u003e\u003e-Client: Successful Response\n    Note right of Client: Status Code: 200 - Ok\n```\n\n##### Diagrama de exclusão de produto\n\n```mermaid\nsequenceDiagram\n    title Delete Product\n    Client-\u003e\u003e+API: Request product delete\n    Note right of Client: DELETE /products/{id}\u003cbr/\u003e Path Params:\u003cbr/\u003e    - id: \u003cid\u003e\n\n    API-\u003e\u003e+Database: Request product\n    alt Product not found\n        API-\u003eClient: Error Response\n        Note right of Client: Status Code: 404 - Not Found\n        end\n\n    Database-\u003e\u003e-API: Successfully deleted\n\n    API-\u003e\u003e-Client: Successful Response\n    Note right of Client: Status Code: 204 - No content\n```\n\n### Desafio Final\n- Create\n    - Mapear uma exceção, caso dê algum erro de inserção e capturar na controller\n- Update\n    - Modifique o método de patch para retornar uma exceção de Not Found, quando o dado não for encontrado\n    - a exceção deve ser tratada na controller, pra ser retornada uma mensagem amigável pro usuário\n    - ao alterar um dado, a data de updated_at deve corresponder ao time atual, permitir modificar updated_at também\n- Filtros\n    - cadastre produtos com preços diferentes\n    - aplique um filtro de preço, assim: (price \u003e 5000 and price \u003c 8000)\n\n### Preparar ambiente\n\nVamos utilizar Pyenv + Poetry, link de como preparar o ambiente abaixo:\n\n[poetry-documentation](https://github.com/nayannanara/poetry-documentation/blob/master/poetry-documentation.md)\n\n### Links uteis de documentação\n[mermaid](https://mermaid.js.org/)\n\n[pydantic](https://docs.pydantic.dev/dev/)\n\n[validatores-pydantic](https://docs.pydantic.dev/latest/concepts/validators/)\n\n[model-serializer](https://docs.pydantic.dev/dev/api/functional_serializers/#pydantic.functional_serializers.model_serializer)\n\n[mongo-motor](https://motor.readthedocs.io/en/stable/)\n\n[pytest](https://docs.pytest.org/en/7.4.x/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafa-kozand%2Fchallenge-api_fastapi-tdd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafa-kozand%2Fchallenge-api_fastapi-tdd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafa-kozand%2Fchallenge-api_fastapi-tdd/lists"}